kern_p.h

00001 /* 
00002    EyeDB Object Database Management System
00003    Copyright (C) 1994-2008 SYSRA
00004    
00005    EyeDB is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009    
00010    EyeDB is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014    
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with this library; if not, write to the Free Software
00017    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA 
00018 */
00019 
00020 /*
00021    Author: Eric Viara <viara@sysra.com>
00022 */
00023 
00024 
00025 #ifndef _SEKERN_P_H
00026 #define _SEKERN_P_H
00027 
00028 #define NO_FILE_LOCK
00029 
00030 #include <eyedbconfig.h>
00031 
00032 #include <pthread.h>
00033 #include <stdlib.h>
00034 #include <string.h>
00035 #include <stdarg.h>
00036 #include <sys/types.h>
00037 #include <sys/stat.h>
00038 #include <fcntl.h>
00039 #include <string.h>
00040 #include <unistd.h>
00041 #include <errno.h>
00042 #include <sys/mman.h>
00043 
00044 #include <eyedblib/machtypes.h>
00045 #include <transaction.h>
00046 #include <eyedbsm_p.h>
00047 #include <lock.h>
00048 #include <eyedblib/iassert.h>
00049 #include <xdr_p.h>
00050 #include <xdr_off.h>
00051 
00052 #define _ESM_C_
00053 
00054 #include <eyedblib/rpc_be.h>
00055 #include <kern.h>
00056 #include <eyedblib/semlib.h>
00057 #include <eyedblib/log.h>
00058 #include <pwd.h>
00059 #include <lib/m_mem_p.h>
00060 
00061 namespace eyedbsm {
00062 
00063   struct DBFD {
00064     int dbsfd, ompfd, shmfd;
00065     int fd_dat[MAX_DATAFILES], fd_dmp[MAX_DATAFILES];
00066 
00067     DBFD() {
00068       dbsfd = ompfd = shmfd = -1;
00069       for (int i = 0; i < MAX_DATAFILES; i++)
00070         fd_dat[i] = fd_dmp[i] = -1;
00071     }
00072   };
00073 
00074   extern const char *
00075   fileGet(const char *dbfile, const char ext[]);
00076 
00077   extern const char *
00078   shmfileGet(const char *dbfile);
00079 
00080   extern const char *
00081   dmpfileGet(const char *volfile);
00082 
00083   extern const char *
00084   objmapfileGet(const char *dbfile);
00085 
00086   extern Status
00087   fileSizesGet(const char *file, unsigned long long &filesize,
00088                unsigned long long &fileblksize);
00089 
00090   extern Status
00091   checkVolMaxSize(unsigned maxsize);
00092 
00093   extern Status
00094   checkDatafile(const char *pr, const char *dbfile, DbHeader *dbh,
00095                 const DbCreateDescription *dbc,
00096                 int i, DBFD *dbfd, mode_t file_mode, gid_t file_gid,
00097                 Boolean can_be_null = False,
00098                 Boolean *is_null = 0, Boolean in_place = False);
00099 
00100   extern Status
00101   checkNewDatafile(DbHeader *dbh, const char *file,
00102                    const char *name);
00103 
00104   extern Status
00105   getFileMaskGroup(mode_t &file_mode, gid_t &file_gid, mode_t file_mask, const char *file_group);
00106 
00107   extern int
00108   shmfileOpen(const char *dbfile);
00109     
00110   extern Boolean
00111   filelockS(int fd);
00112 
00113   extern Boolean
00114   filelockX(int fd);
00115 
00116   extern Boolean
00117   fileunlock(int fd);
00118 
00119   extern int
00120   objmapfileOpen(const char *dbfile, int flag);
00121     
00122   extern Status
00123   syserror(const char *fmt, ...);
00124 
00125   extern Status
00126   syscheck(const char *pre, long long c, const char *fmt, ...);
00127 
00128   extern Status
00129   syscheckn(const char *pre, long long c, int n, const char *fmt, ...);
00130   
00131   extern Status
00132   checkFileAccessFailed(Error err, const char *what, const char *file,
00133                         unsigned int flags);
00134 
00135   extern Status
00136   checkFileAccess(Error err, const char *what, const char *file,
00137                   unsigned int flags);
00138 
00139   extern Status
00140   dopen(char const * pre, char const * file, int mode, int * const fdp,
00141         Boolean * const suser);
00142 
00143   extern Status
00144   dbCleanup(const char *dbfile);
00145 
00146   extern Status
00147   fcouldnot(char const *pre, char const *what, char const *which);
00148 
00149   extern Status
00150   push_dir(const char *dbfile, char *pwd, unsigned int pwd_size);
00151 
00152   extern Status
00153   pop_dir(char *pwd);
00154 
00155   extern const char *
00156   get_dir(const char *dbfile);
00157 
00158   extern char *
00159   string_version(unsigned int version);
00160 
00161   extern Status
00162   protectionInit(DbHandle const *dbh);
00163 
00164   extern Status
00165   dbProtectionCheck(DbHandle const *dbh, int flag);
00166 
00167   extern Status
00168   dbProtectionRunTimeUpdate(DbHandle const *dbh);
00169 
00170   extern Status
00171   ESM_protectionsRunTimeUpdate(DbHandle const *dbh);
00172 
00173   extern Status
00174   ESM_getDatafile(DbHandle const *dbh, short &dspid, short &datid);
00175 
00176   extern Boolean
00177   ESM_getNextDatafile(DbHandle const *dbh, short dspid, short &datid);
00178 
00179   extern Status
00180   ESM_dspGet(DbHandle const *dbh, const char *dataspace, short *dspid);
00181 
00182   extern Status
00183   protectionRunTimeUpdate(DbHandle const *dbh);
00184 
00185   extern const Protection *
00186   protGet(DbHandle const *dbh, Oid const *oid, int uid);
00187 
00188   extern void
00189   dbg_setuid(int uid);
00190 
00191   extern int
00192   getUid(DbHandle const *dbh);
00193 
00194   extern int
00195   indUidGet(DbHandle const *dbh, int ind);
00196 
00197   extern int
00198   uidIndGet(DbHandle const *dbh, int uid);
00199 
00200   extern Status
00201   ESM_dbSetuid(DbHandle *dbh, int uid);
00202 
00203   extern Status
00204   ESM_suserUnset(DbHandle *dbh);
00205 
00206   extern void
00207   ESM_addToRegisterCreate(DbHandle const *dbh, const Oid *oid, unsigned int size);
00208 
00209   extern void
00210   ESM_addToRegisterRead(DbHandle const *dbh, const Oid *oid, int start, int length);
00211 
00212   extern void
00213   ESM_addToRegisterWrite(DbHandle const *dbh, const Oid *oid, int start, int length);
00214 
00215   extern void
00216   ESM_addToRegisterSizeMod(DbHandle const *dbh, const Oid *oid, unsigned int size);
00217 
00218   extern void
00219   ESM_addToRegisterSizeGet(DbHandle const *dbh, const Oid *oid);
00220 
00221   extern void
00222   ESM_addToRegisterLock(DbHandle const *dbh, const Oid *oid, OP lock);
00223 
00224   extern void
00225   ESM_addToRegisterDelete(DbHandle const *dbh, const Oid *oid);
00226 
00227   extern Boolean
00228   ESM_isExclusive(DbHandle const *dbh);
00229 
00230   extern OidLoc
00231   oidLocGet(DbHandle const *const dbh, const Oid *oid);
00232 
00233   extern OidLoc
00234   oidLocGet_(DbHandle const *const dbh, Oid::NX nx);
00235 
00236   extern int
00237   isNxValid(DbHandle const *const dbh, Oid::NX nx);
00238 
00239   extern Status
00240   nxAlloc(DbHandle const *const dbh, const OidLoc &oidloc, Oid::NX *pnx);
00241 
00242   extern void
00243   nxFree(DbHandle const *const dbh, Oid::NX nx);
00244 
00245   extern void
00246   nxSet(DbHandle const *const dbh, Oid::NX nx, NS ns, short datid);
00247 
00248   extern Oid::NX
00249   nxNextBusyGet(DbHandle const *const dbh, Oid::NX nx);
00250 
00251   extern const char *
00252   get_time();
00253 
00254   extern Status
00255   mapAlloc(DbHandle const *dbh, short datid, unsigned int size, NS *pns,
00256            NS *pneedslots, NS *pmax_free_slots);
00257 
00258   extern void
00259   mapFree(DbDescription *vd, NS ns, short datid, unsigned int size);
00260 
00261   extern void
00262   mapMark(DbDescription *vd, NS ns, short datid, unsigned int needslots, int value);
00263 
00264   extern ObjectHeader *
00265   oid2objh_(const Oid *oid, NS ns, short datid, const DbHandle *dbh,
00266             ObjectHeader **objh, MmapH *hdl, int *up,
00267             Boolean *oid2addr_failed);
00268 
00269   extern ObjectHeader *
00270   oid2objh(const Oid *oid, const DbHandle *dbh, ObjectHeader **objh,
00271            MmapH *hdl, Boolean *oid2addr_failed);
00272 
00273   static const char* msg_2 = __FILE__;
00274 #define TTT(S) (write( 1, S, strlen(S)))
00275  static int dummy_off_t_2 = (sizeof(off_t) != 8 ? (TTT(msg_2), *(char *)0 = 0) : 1);
00276 
00277   /*
00278     extern off_t
00279     oid2lastslot(const Oid *oid, const DbHandle *dbh);
00280   */
00281 
00282   extern int
00283   check_oid(const DbHandle *dbh, const Oid *oid);
00284 
00285   extern char *
00286   slot2addr(const DbHandle *dbh, off_t ns, short datid,
00287             unsigned int size, char **pt, MmapH *hdl, int *up);
00288 
00289   extern char *
00290   oidloc2addr(const DbHandle *dbh, const OidLoc &oidloc,
00291               unsigned int size, char **pt, MmapH *hdl, int *up);
00292 
00293   extern void
00294   hdl_release(MmapH *hdl);
00295 
00296   extern int
00297   oidloc_cmp(const OidLoc &, const OidLoc &);
00298 
00299   extern void
00300   display_invalid_oid(const Oid *oid, ObjectHeader *xobjh);
00301 
00302   extern int
00303   oid_cmp(Oid *a, Oid *b);
00304 
00305   extern unsigned int
00306   getDbVersion(void *dbh);
00307 
00308   extern Boolean
00309   isWholeMapped(void *dbh);
00310 
00311   extern void
00312   DbMutexesInit(DbDescription *, DbShmHeader *);
00313 
00314   extern void
00315   DbMutexesLightInit(DbDescription *, DbShmHeader *);
00316 
00317   extern Status
00318   DbMutexesRelease(DbDescription *, DbShmHeader *, unsigned int);
00319 
00320   extern Boolean
00321   isDatValid(DbHandle const *dbh, short datid);
00322 
00323   extern Boolean
00324   isDspValid(DbHandle const *dbh, short dspid);
00325 
00326   extern DatType
00327   getDatType(DbHeader const *dbh, short datid);
00328 
00329   extern DatType
00330   getDatType_inplace(DbHeader const *dbh, short datid);
00331 
00332   extern void
00333   setDatType(DbHeader *dbh, short datid, DatType dtype);
00334 
00335   extern void
00336   setDatType_inplace(DbHeader *dbh, short datid, DatType dtype);
00337 
00338   extern short
00339   getDataspace(const DbHeader *dbh, short datid);
00340 
00341   extern short
00342   getDataspace(const DbHeader *dbh, short datid);
00343 
00344   extern short
00345   getDataspace_inplace(const DbHeader *dbh, short datid);
00346 
00347   extern void
00348   setDataspace(DbHeader *dbh, short datid, short dspid);
00349 
00350   extern void
00351   setDataspace_inplace(DbHeader *dbh, short datid, short dspid);
00352 
00353   extern Status
00354   copyfile(const char *from, const char *to,
00355            const char *fromdbdir, const char *todbdir,
00356            int sparsify);
00357 
00358   extern Status
00359   renamefile(const char *from, const char *to,
00360              const char *fromdbdir, const char *todbdir,
00361              int sparsify);
00362 
00363   extern char *
00364   makefile(const char *dir, const char *file);
00365 
00366   extern Boolean
00367   is_number(const char *s);
00368 
00369   extern void
00370   errorInit(void);
00371 
00372   extern int
00373   power2(int);
00374 
00375   extern size_t
00376   fdSizeGet(int);
00377 
00378   extern size_t
00379   fileSizeGet(const char *);
00380 
00381   extern Status
00382   nxFileSizeExtends(DbHandle const *dbh, Oid::NX);
00383 
00384   extern Status
00385   nsFileSizeExtends(DbHandle const *dbh, short datid, NS);
00386 
00387   extern Boolean
00388   isPhy(DbHandle const *dbh, const Oid *oid);
00389 
00390   extern void
00391   setPhyInfo(Oid *oid, NS ns, short datid);
00392 
00393   extern void
00394   getPhyInfo(const Oid *oid, NS *pns, short *datid);
00395 
00396   extern void
00397   oidCopySlot(DbHandle const *dbh, Oid::NX nx, Oid *oid, unsigned int *psize);
00398 
00399   extern void
00400   oidCopySlot_(DbHandle const *dbh, Oid::NX nx, const OidLoc &, Oid *oid,
00401                unsigned int *psize);
00402 
00403   extern NS
00404   oidLastSlotGet(DbHandle const *dbh, const OidLoc &);
00405   /*}*/
00406 
00407   extern int pgsize, pgsize_pow2;
00408   extern unsigned long curref;
00409   extern const void *ObjectZero, *ObjectNone;
00410   extern const Protection p_all, p_none;
00411   extern Boolean backend_interrupt;
00412   extern Boolean backend;
00413   extern unsigned int import_xid;
00414   extern const int INVALID;
00415 
00416   extern const char ompext[];
00417   extern const char shmext[];
00418   extern const char dbsext[];
00419   extern const char datext[];
00420   extern const char dmpext[];
00421   extern int dbsext_len;
00422   extern int datext_len;
00423   extern Boolean cleanup;
00424 
00425 #define ONE_K 1024
00426 #define BITS_PER_BYTE 8
00427 #define IDBH "database handle is invalid"
00428   /*#define DBH2MP(dbh) (&(dbh)->vd->dbhead->mp)*/
00429 #define WF_P "database is not in write access mode"
00430 #define WF    WF_P ": '%s'"
00431 #define NS_OFFSET 1
00432 
00433 #define OIDDBIDGET(oid) ((oid)->getDbID())
00434 #define OIDDBIDMAKE(oid, _dbid) (oid)->setDbID(_dbid)
00435 
00436 #define check_dbh(dbh) (1)
00437 
00438 #define MAX(x,y) ((int)(x) > (int)(y) ? (x) : (y))
00439 #define MIN(x,y) ((x) < (y) ? (x) : (y))
00440 
00441 #define DBSADDR(dbh) ((dbh)->vd->dbs_addr)
00442 
00443 #define DAT2MP(dbh, datid) MapHeader(DbHeader_dat_ref(DBSADDR(dbh), datid) + DatafileDesc_mp_OFF)
00444 
00445 #define DAT2MP_(vd, datid) MapHeader(DbHeader_dat_ref(vd->dbs_addr, datid) + DatafileDesc_mp_OFF)
00446 
00447 #define LASTIDXBUSY(dbh) DbHeader___lastidxbusy(DBSADDR(dbh))
00448 
00449 #define CURIDXBUSY(dbh) DbHeader___curidxbusy(DBSADDR(dbh))
00450 
00451 #define LASTIDXBLKALLOC(dbh) DbHeader___lastidxblkalloc(DBSADDR(dbh))
00452 
00453 #define LASTNSBLKALLOC(dbh, datid) DbHeader___lastnsblkalloc(DBSADDR(dbh), datid)
00454 
00455 #define SZ2NS(sz, mp) ((((sz)-1)>>(mp)->pow2())+1)
00456 #define SZ2NS_XDR(sz, mp) ((((sz)-1)>>x2h_u32((mp)->pow2()))+1)
00457 
00458 #define NEXT_OIDLOC(omp_addr) (void *)((char *)omp_addr + OIDLOCSIZE)
00459 #define OIDLOC(omp_addr, nx) (void *)((char *)omp_addr + ((unsigned long long)nx)*OIDLOCSIZE)
00460 
00461 #define oid2addr_(ns, datid, dbh, size, pt, hdl, up) \
00462         slot2addr(dbh, ns, datid, size, (char **)pt, hdl, up)
00463 
00464 #define oid2addr(oid, dbh, size, pt, hdl) \
00465         oidloc2addr(dbh, oidLocGet(dbh, oid), size, (char **)pt, hdl, 0)
00466 
00467 #define oidloc2addr_(oidloc, dbh, size, pt, hdl) \
00468         oidloc2addr(dbh, oidloc, size, (char **)pt, hdl, 0)
00469 
00470 #define InvalidMask       0x80000000
00471 #define makeInvalid(SZ)   ((SZ) | InvalidMask)
00472 #define makeValid(SZ)     ((SZ) & ~InvalidMask)
00473 #define getSize(SZ)       ((SZ) & ~InvalidMask)
00474 #define isValidObject(SZ) (!((SZ) & InvalidMask))
00475 
00476 #define BMH    u.bmh
00477 #define LMH    u.lmh
00478 #define BMSTAT mstat.u.bmstat
00479 #define LMSTAT mstat.u.lmstat
00480 
00481 #define SEGMENT_UNMAP(MMD) \
00482 { \
00483   (MMD)->ismapped = False; \
00484   (MMD)->ref = 0; \
00485   (MMD)->locked  = False; \
00486   syscheck("", m_munmap((MMD)->m, (MMD)->mapaddr, (MMD)->a_end - (MMD)->a_start), ""); \
00487 }
00488 
00489 #define KB2SLOT(SZ, POW2SLOT) \
00490 (((unsigned long long)(SZ) * ONE_K)>> (POW2SLOT))
00491 
00492 #define LASTNS(START, SZ, POW2SLOT) \
00493      ((START) + KB2SLOT(SZ, POW2SLOT))
00494 
00495 #define DELTANS(NEWSZ, OLDSZ, POW2SLOT) \
00496      (((((long long)(NEWSZ)) - (OLDSZ)) * ONE_K) >> (POW2SLOT))
00497 
00498 #define SLOT2KB(NS, SZSLOT) \
00499      ((((NS) * (SZSLOT)) / ONE_K) + 1)
00500 
00501   /*
00502 #define DMP_SIZE(MTYPE, NSLOTS) \
00503     ((MTYPE == BitmapType) ? \
00504      ((size_t)NSLOTS / BITS_PER_BYTE) : \
00505      (MAX_FREE_CELLS * sizeof(LinkmapCell)))
00506   */
00507 
00508 #define DMP_SIZE(MTYPE, NSLOTS) \
00509     ((MTYPE == BitmapType) ? \
00510      ((size_t)NSLOTS / BITS_PER_BYTE) : 0)
00511 
00512 #define CHECK_X(dbh, msg) \
00513  if (!ESM_isExclusive(dbh)) \
00514    return statusMake(ERROR, \
00515      "exclusive database access is needed when " msg);
00516 
00517 #define PHYOID_VERSION 205015
00518 
00519 #define PHYDATID_SHIFT 13
00520 #define PHYOID_BITMASK 0x200000
00521 
00522 #define DATTYPE_SHIFT 15
00523 #define DATTYPE_BITMASK (1 << DATTYPE_SHIFT)
00524 #define DATTYPE_CLEAN(X) ((X) & ~DATTYPE_BITMASK)
00525 
00526 #define maskSize(SIZE)    (SIZE)
00527 
00528 #define objDataOffset (2 * sizeof(int))
00529 
00530 #define objDataGetSize(SIZE)  \
00531 (objDataOffset + SIZE + maskSize(SIZE))
00532 
00533 #define objDataSize(DATA) (*(int *)((char *)DATA))
00534 #define objDataAll(DATA)  (*(char *)((char *)DATA+sizeof(int)))
00535 #define objDataData(DATA) (((char *)(DATA)+objDataOffset))
00536 #define objDataMask(DATA) (objDataData(DATA) + objDataSize(DATA))
00537 }
00538 
00539 #define DEFAULT_PWD_SIZE 1024
00540 
00541 #endif

Generated on Mon Dec 22 18:15:57 2008 for eyedb by  doxygen 1.5.3