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 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
00279
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
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
00503
00504
00505
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