00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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 checkDatafileSize(unsigned long long nslots_l,
00095 const char *datfile, unsigned int sizeslot,
00096 unsigned long long newmaxsize);
00097
00098 extern Status
00099 checkDatafile(const char *pr, const char *dbfile, DbHeader *dbh,
00100 const DbCreateDescription *dbc,
00101 int i, DBFD *dbfd, mode_t file_mode, gid_t file_gid,
00102 Boolean can_be_null = False,
00103 Boolean *is_null = 0, Boolean in_place = False);
00104
00105 extern Status
00106 checkNewDatafile(DbHeader *dbh, const char *file,
00107 const char *name);
00108
00109 extern Status
00110 getFileMaskGroup(mode_t &file_mode, gid_t &file_gid, mode_t file_mask, const char *file_group);
00111
00112 extern int
00113 shmfileOpen(const char *dbfile, bool strict_read);
00114
00115 extern Boolean
00116 filelockS(int fd);
00117
00118 extern Boolean
00119 filelockX(int fd);
00120
00121 extern Boolean
00122 fileunlock(int fd);
00123
00124 extern int
00125 objmapfileOpen(const char *dbfile, int flag);
00126
00127 extern Status
00128 syserror(const char *fmt, ...);
00129
00130 extern Status
00131 syscheck(const char *pre, long long c, const char *fmt, ...);
00132
00133 extern Status
00134 syscheckn(const char *pre, long long c, int n, const char *fmt, ...);
00135
00136 extern Status
00137 checkFileAccessFailed(Error err, const char *what, const char *file,
00138 unsigned int flags);
00139
00140 extern Status
00141 checkFileAccess(Error err, const char *what, const char *file,
00142 unsigned int flags);
00143
00144 extern Status
00145 dopen(char const * pre, char const * file, int mode, int * const fdp,
00146 Boolean * const suser);
00147
00148 extern Status
00149 dbCleanup(const char *dbfile);
00150
00151 extern Status
00152 fcouldnot(char const *pre, char const *what, char const *which);
00153
00154 extern Status
00155 push_dir(const char *dbfile, char *pwd, unsigned int pwd_size);
00156
00157 extern Status
00158 pop_dir(char *pwd);
00159
00160 extern const char *
00161 get_dir(const char *dbfile);
00162
00163 extern char *
00164 string_version(unsigned int version);
00165
00166 extern Status
00167 protectionInit(DbHandle const *dbh);
00168
00169 extern Status
00170 dbProtectionCheck(DbHandle const *dbh, int flag);
00171
00172 extern Status
00173 dbProtectionRunTimeUpdate(DbHandle const *dbh);
00174
00175 extern Status
00176 ESM_protectionsRunTimeUpdate(DbHandle const *dbh);
00177
00178 extern Status
00179 ESM_getDatafile(DbHandle const *dbh, short &dspid, short &datid);
00180
00181 extern Boolean
00182 ESM_getNextDatafile(DbHandle const *dbh, short dspid, short &datid);
00183
00184 extern Status
00185 ESM_dspGet(DbHandle const *dbh, const char *dataspace, short *dspid);
00186
00187 extern Status
00188 protectionRunTimeUpdate(DbHandle const *dbh);
00189
00190 extern const Protection *
00191 protGet(DbHandle const *dbh, Oid const *oid, int uid);
00192
00193 extern void
00194 dbg_setuid(int uid);
00195
00196 extern int
00197 getUid(DbHandle const *dbh);
00198
00199 extern int
00200 indUidGet(DbHandle const *dbh, int ind);
00201
00202 extern int
00203 uidIndGet(DbHandle const *dbh, int uid);
00204
00205 extern Status
00206 ESM_dbSetuid(DbHandle *dbh, int uid);
00207
00208 extern Status
00209 ESM_suserUnset(DbHandle *dbh);
00210
00211 extern void
00212 ESM_addToRegisterCreate(DbHandle const *dbh, const Oid *oid, unsigned int size);
00213
00214 extern void
00215 ESM_addToRegisterRead(DbHandle const *dbh, const Oid *oid, int start, int length);
00216
00217 extern void
00218 ESM_addToRegisterWrite(DbHandle const *dbh, const Oid *oid, int start, int length);
00219
00220 extern void
00221 ESM_addToRegisterSizeMod(DbHandle const *dbh, const Oid *oid, unsigned int size);
00222
00223 extern void
00224 ESM_addToRegisterSizeGet(DbHandle const *dbh, const Oid *oid);
00225
00226 extern void
00227 ESM_addToRegisterLock(DbHandle const *dbh, const Oid *oid, OP lock);
00228
00229 extern void
00230 ESM_addToRegisterDelete(DbHandle const *dbh, const Oid *oid);
00231
00232 extern Boolean
00233 ESM_isExclusive(DbHandle const *dbh);
00234
00235 extern OidLoc
00236 oidLocGet(DbHandle const *const dbh, const Oid *oid);
00237
00238 extern OidLoc
00239 oidLocGet_(DbHandle const *const dbh, Oid::NX nx);
00240
00241 extern int
00242 isNxValid(DbHandle const *const dbh, Oid::NX nx);
00243
00244 extern Status
00245 nxAlloc(DbHandle const *const dbh, const OidLoc &oidloc, Oid::NX *pnx);
00246
00247 extern void
00248 nxFree(DbHandle const *const dbh, Oid::NX nx);
00249
00250 extern void
00251 nxSet(DbHandle const *const dbh, Oid::NX nx, NS ns, short datid);
00252
00253 extern Oid::NX
00254 nxNextBusyGet(DbHandle const *const dbh, Oid::NX nx);
00255
00256 extern const char *
00257 get_time();
00258
00259 extern Status
00260 mapAlloc(DbHandle const *dbh, short datid, unsigned int size, NS *pns,
00261 NS *pneedslots, NS *pmax_free_slots);
00262
00263 extern void
00264 mapFree(DbDescription *vd, NS ns, short datid, unsigned int size);
00265
00266 extern void
00267 mapMark(DbDescription *vd, NS ns, short datid, unsigned int needslots, int value);
00268
00269 extern ObjectHeader *
00270 oid2objh_(const Oid *oid, NS ns, short datid, const DbHandle *dbh,
00271 ObjectHeader **objh, MmapH *hdl, int *up,
00272 Boolean *oid2addr_failed);
00273
00274 extern ObjectHeader *
00275 oid2objh(const Oid *oid, const DbHandle *dbh, ObjectHeader **objh,
00276 MmapH *hdl, Boolean *oid2addr_failed);
00277
00278 static const char* msg_2 = __FILE__;
00279 #define TTT(S) (write( 1, S, strlen(S)))
00280 static int dummy_off_t_2 = (sizeof(off_t) != 8 ? (TTT(msg_2), *(char *)0 = 0) : 1);
00281
00282
00283
00284
00285
00286
00287 extern int
00288 check_oid(const DbHandle *dbh, const Oid *oid);
00289
00290 extern char *
00291 slot2addr(const DbHandle *dbh, off_t ns, short datid,
00292 unsigned int size, char **pt, MmapH *hdl, int *up);
00293
00294 extern char *
00295 oidloc2addr(const DbHandle *dbh, const OidLoc &oidloc,
00296 unsigned int size, char **pt, MmapH *hdl, int *up);
00297
00298 extern void
00299 hdl_release(MmapH *hdl);
00300
00301 extern int
00302 oidloc_cmp(const OidLoc &, const OidLoc &);
00303
00304 extern void
00305 display_invalid_oid(const Oid *oid, ObjectHeader *xobjh);
00306
00307 extern int
00308 oid_cmp(Oid *a, Oid *b);
00309
00310 extern unsigned int
00311 getDbVersion(void *dbh);
00312
00313 extern Boolean
00314 isWholeMapped(void *dbh);
00315
00316 extern void
00317 DbMutexesInit(DbDescription *, DbShmHeader *);
00318
00319 extern void
00320 DbMutexesLightInit(DbDescription *, DbShmHeader *);
00321
00322 extern Status
00323 DbMutexesRelease(DbDescription *, DbShmHeader *, unsigned int);
00324
00325 extern Boolean
00326 isDatValid(DbHandle const *dbh, short datid);
00327
00328 extern Boolean
00329 isDspValid(DbHandle const *dbh, short dspid);
00330
00331 extern DatType
00332 getDatType(DbHeader const *dbh, short datid);
00333
00334 extern DatType
00335 getDatType_inplace(DbHeader const *dbh, short datid);
00336
00337 extern void
00338 setDatType(DbHeader *dbh, short datid, DatType dtype);
00339
00340 extern void
00341 setDatType_inplace(DbHeader *dbh, short datid, DatType dtype);
00342
00343 extern short
00344 getDataspace(const DbHeader *dbh, short datid);
00345
00346 extern short
00347 getDataspace(const DbHeader *dbh, short datid);
00348
00349 extern short
00350 getDataspace_inplace(const DbHeader *dbh, short datid);
00351
00352 extern void
00353 setDataspace(DbHeader *dbh, short datid, short dspid);
00354
00355 extern void
00356 setDataspace_inplace(DbHeader *dbh, short datid, short dspid);
00357
00358 extern Status
00359 copyfile(const char *from, const char *to,
00360 const char *fromdbdir, const char *todbdir,
00361 int sparsify);
00362
00363 extern Status
00364 renamefile(const char *from, const char *to,
00365 const char *fromdbdir, const char *todbdir,
00366 int sparsify);
00367
00368 extern char *
00369 makefile(const char *dir, const char *file);
00370
00371 extern Boolean
00372 is_number(const char *s);
00373
00374 extern void
00375 errorInit(void);
00376
00377 extern int
00378 power2(int);
00379
00380 extern size_t
00381 fdSizeGet(int);
00382
00383 extern size_t
00384 fileSizeGet(const char *);
00385
00386 extern Status
00387 nxFileSizeExtends(DbHandle const *dbh, Oid::NX);
00388
00389 extern Status
00390 nsFileSizeExtends(DbHandle const *dbh, short datid, NS);
00391
00392 extern Boolean
00393 isPhy(DbHandle const *dbh, const Oid *oid);
00394
00395 extern void
00396 setPhyInfo(Oid *oid, NS ns, short datid);
00397
00398 extern void
00399 getPhyInfo(const Oid *oid, NS *pns, short *datid);
00400
00401 extern void
00402 oidCopySlot(DbHandle const *dbh, Oid::NX nx, Oid *oid, unsigned int *psize);
00403
00404 extern void
00405 oidCopySlot_(DbHandle const *dbh, Oid::NX nx, const OidLoc &, Oid *oid,
00406 unsigned int *psize);
00407
00408 extern NS
00409 oidLastSlotGet(DbHandle const *dbh, const OidLoc &);
00410
00411
00412 extern int pgsize, pgsize_pow2;
00413 extern unsigned long curref;
00414 extern const void *ObjectZero, *ObjectNone;
00415 extern const Protection p_all, p_none;
00416 extern Boolean backend_interrupt;
00417 extern Boolean backend;
00418 extern unsigned int import_xid;
00419 extern const int INVALID;
00420
00421 extern const char ompext[];
00422 extern const char shmext[];
00423 extern const char dbsext[];
00424 extern const char datext[];
00425 extern const char dmpext[];
00426 extern int dbsext_len;
00427 extern int datext_len;
00428 extern Boolean cleanup;
00429
00430 #define ONE_K 1024
00431 #define ONE_M (1024*1024)
00432 #define BITS_PER_BYTE 8
00433 #define IDBH "database handle is invalid"
00434
00435 #define WF_P "database is not in write access mode"
00436 #define WF WF_P ": '%s'"
00437 #define NS_OFFSET 1
00438
00439 #define OIDDBIDGET(oid) ((oid)->getDbID())
00440 #define OIDDBIDMAKE(oid, _dbid) (oid)->setDbID(_dbid)
00441
00442 #define check_dbh(dbh) (1)
00443
00444 #define MAX(x,y) ((int)(x) > (int)(y) ? (x) : (y))
00445 #define MIN(x,y) ((x) < (y) ? (x) : (y))
00446
00447 #define DBSADDR(dbh) ((dbh)->vd->dbs_addr)
00448
00449 #define DAT2MP(dbh, datid) MapHeader(DbHeader_dat_ref(DBSADDR(dbh), datid) + DatafileDesc_mp_OFF)
00450
00451 #define DAT2MP_(vd, datid) MapHeader(DbHeader_dat_ref(vd->dbs_addr, datid) + DatafileDesc_mp_OFF)
00452
00453 #define LASTIDXBUSY(dbh) DbHeader___lastidxbusy(DBSADDR(dbh))
00454
00455 #define CURIDXBUSY(dbh) DbHeader___curidxbusy(DBSADDR(dbh))
00456
00457 #define LASTIDXBLKALLOC(dbh) DbHeader___lastidxblkalloc(DBSADDR(dbh))
00458
00459 #define LASTNSBLKALLOC(dbh, datid) DbHeader___lastnsblkalloc(DBSADDR(dbh), datid)
00460
00461 #define SZ2NS(sz, mp) ((((sz)-1)>>(mp)->pow2())+1)
00462 #define SZ2NS_XDR(sz, mp) ((((sz)-1)>>x2h_u32((mp)->pow2()))+1)
00463
00464 #define NEXT_OIDLOC(omp_addr) (void *)((char *)omp_addr + OIDLOCSIZE)
00465 #define OIDLOC(omp_addr, nx) (void *)((char *)omp_addr + ((unsigned long long)nx)*OIDLOCSIZE)
00466
00467 #define oid2addr_(ns, datid, dbh, size, pt, hdl, up) \
00468 slot2addr(dbh, ns, datid, size, (char **)pt, hdl, up)
00469
00470 #define oid2addr(oid, dbh, size, pt, hdl) \
00471 oidloc2addr(dbh, oidLocGet(dbh, oid), size, (char **)pt, hdl, 0)
00472
00473 #define oidloc2addr_(oidloc, dbh, size, pt, hdl) \
00474 oidloc2addr(dbh, oidloc, size, (char **)pt, hdl, 0)
00475
00476 #define InvalidMask 0x80000000
00477 #define makeInvalid(SZ) ((SZ) | InvalidMask)
00478 #define makeValid(SZ) ((SZ) & ~InvalidMask)
00479 #define getSize(SZ) ((SZ) & ~InvalidMask)
00480 #define isValidObject(SZ) (!((SZ) & InvalidMask))
00481
00482 #define BMH u.bmh
00483 #define LMH u.lmh
00484 #define BMSTAT mstat.u.bmstat
00485 #define LMSTAT mstat.u.lmstat
00486
00487 #define SEGMENT_UNMAP(MMD) \
00488 { \
00489 (MMD)->ismapped = False; \
00490 (MMD)->ref = 0; \
00491 (MMD)->locked = False; \
00492 syscheck("", m_munmap((MMD)->m, (MMD)->mapaddr, (MMD)->a_end - (MMD)->a_start), ""); \
00493 }
00494
00495 #define KB2SLOT(SZ, POW2SLOT) \
00496 (((unsigned long long)(SZ) * ONE_K)>> (POW2SLOT))
00497
00498 #define LASTNS(START, SZ, POW2SLOT) \
00499 ((START) + KB2SLOT(SZ, POW2SLOT))
00500
00501 #define DELTANS(NEWSZ, OLDSZ, POW2SLOT) \
00502 (((((long long)(NEWSZ)) - (OLDSZ)) * ONE_K) >> (POW2SLOT))
00503
00504 #define SLOT2KB(NS, SZSLOT) \
00505 ((((NS) * (SZSLOT)) / ONE_K) + 1)
00506
00507
00508
00509
00510
00511
00512
00513
00514 #define DMP_SIZE(MTYPE, NSLOTS) \
00515 ((MTYPE == BitmapType) ? \
00516 ((size_t)NSLOTS / BITS_PER_BYTE) : 0)
00517
00518 #define CHECK_X(dbh, msg) \
00519 if (!ESM_isExclusive(dbh)) \
00520 return statusMake(ERROR, \
00521 "exclusive database access is needed when " msg);
00522
00523 #define PHYOID_VERSION 205015
00524
00525 #define PHYDATID_SHIFT 13
00526 #define PHYOID_BITMASK 0x200000
00527
00528 #define DATTYPE_SHIFT 15
00529 #define DATTYPE_BITMASK (1 << DATTYPE_SHIFT)
00530 #define DATTYPE_CLEAN(X) ((X) & ~DATTYPE_BITMASK)
00531
00532 #define maskSize(SIZE) (SIZE)
00533
00534 #define objDataOffset (2 * sizeof(int))
00535
00536 #define objDataGetSize(SIZE) \
00537 (objDataOffset + SIZE + maskSize(SIZE))
00538
00539 #define objDataSize(DATA) (*(int *)((char *)DATA))
00540 #define objDataAll(DATA) (*(char *)((char *)DATA+sizeof(int)))
00541 #define objDataData(DATA) (((char *)(DATA)+objDataOffset))
00542 #define objDataMask(DATA) (objDataData(DATA) + objDataSize(DATA))
00543 }
00544
00545 #define DEFAULT_PWD_SIZE 1024
00546
00547 #endif