LIB_EXPORT rc_t CC KDatabaseVOpenDBRead ( const KDatabase *self, const KDatabase **dbp, const char *name, va_list args ) { rc_t rc; char path [ 256 ]; if ( dbp == NULL ) return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull ); * dbp = NULL; if ( self == NULL ) return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull ); rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, "db", 2, name, args ); if ( rc == 0 ) { bool is_cached; rc = KDBManagerVOpenDBReadInt ( self -> mgr, dbp, self -> dir, path, NULL, & is_cached, false ); if ( rc == 0 && ! is_cached ) { KDatabase *db = ( KDatabase* ) * dbp; db -> dad = KDatabaseAttach ( self ); } } return rc; }
LIB_EXPORT rc_t CC KDatabaseVOpenDBUpdate ( KDatabase *self, KDatabase **dbp, const char *name, va_list args ) { rc_t rc; char path [ 256 ]; if ( dbp == NULL ) return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull ); * dbp = NULL; if ( self == NULL ) return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull ); if ( self -> read_only ) return RC ( rcDB, rcDatabase, rcOpening, rcDatabase, rcReadonly ); rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, "db", 2, name, args ); if ( rc == 0 ) { rc = KDBManagerVOpenDBUpdateInt ( self -> mgr, dbp, self -> dir, path, NULL ); if ( rc == 0 ) { KDatabase *db = ( KDatabase* ) * dbp; db -> dad = self; atomic32_inc ( & self -> refcount ); } } return rc; }
/* Writable * returns 0 if object is writable * or a reason why if not * * "type" [ IN ] - a KDBPathType * valid values are kptDatabase, kptTable and kptIndex * * "path" [ IN ] - NUL terminated path */ static rc_t KDatabaseLockInt (const KDatabase * self, char * path, size_t path_size, int type, const char * name, va_list args ) { rc_t rc; if (self == NULL) rc = RC ( rcDB, rcMgr, rcAccessing, rcSelf, rcNull ); else if (name == NULL) rc = RC (rcDB, rcMgr, rcAccessing, rcPath, rcNull); else { const char * ns; char path [ 256 ]; ns = KDBGetNamespaceString (type); switch (type) { default: rc = RC (rcDB, rcMgr, rcAccessing, rcParam, rcInvalid); break; case kptDatabase: case kptTable: /* case kptIndex: */ rc = KDBVMakeSubPath (self->dir, path, sizeof path, ns, strlen (ns), name, args); break; } } return rc; }
LIB_EXPORT rc_t CC KDatabaseVOpenTableRead ( const KDatabase *self, const KTable **tblp, const char *name, va_list args ) { rc_t rc; char path [ 256 ]; if ( tblp == NULL ) return RC ( rcDB, rcDatabase, rcOpening, rcParam, rcNull ); * tblp = NULL; if ( self == NULL ) return RC ( rcDB, rcDatabase, rcOpening, rcSelf, rcNull ); rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, "tbl", 3, name, args ); if ( rc == 0 ) { rc = KDBManagerVOpenTableReadInt ( self -> mgr, tblp, self -> dir, false, path, NULL ); if ( rc == 0 ) { KTable *tbl = ( KTable* ) * tblp; tbl -> db = KDatabaseAttach ( self ); } } return rc; }
LIB_EXPORT rc_t CC KTableVOpenColumnRead ( const KTable *self, const KColumn **colp, const char *name, va_list args ) { rc_t rc; char path [ 256 ]; if ( colp == NULL ) return RC ( rcDB, rcTable, rcOpening, rcParam, rcNull ); * colp = NULL; if ( self == NULL ) return RC ( rcDB, rcTable, rcOpening, rcSelf, rcNull ); rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, "col", 3, name, args ); if ( rc == 0 ) { rc = KDBManagerVOpenColumnReadInt ( self -> mgr, colp, self -> dir, false, path, NULL ); if ( rc == 0 ) { KColumn *col = ( KColumn* ) * colp; col -> tbl = KTableAttach ( self ); } } return rc; }
/* KDBMakeSubPath * adds a namespace to path spec */ rc_t KDBMakeSubPath ( struct KDirectory const *dir, char *subpath, size_t subpath_max, const char *ns, uint32_t ns_size, const char *path, ... ) { rc_t rc = 0; va_list args; va_start(args, path); rc = KDBVMakeSubPath(dir, subpath, subpath_max, ns, ns_size, path, args); va_end(args); return rc; }
/* Exists * returns true if requested object exists * * "type" [ IN ] - a KDBPathType * valid values are kptTable * * "path" [ IN ] - NUL terminated path */ LIB_EXPORT bool CC KDatabaseVExists ( const KDatabase *self, uint32_t type, const char *name, va_list args ) { if ( self != NULL && name != NULL && name [ 0 ] != 0 ) { rc_t rc; size_t len; const char *ns; char path [ 256 ]; switch ( type ) { case kptDatabase: ns = "db"; len = 2; break; case kptTable: ns = "tbl"; len = 3; break; case kptIndex: ns = "idx"; len = 3; break; default: return false; } rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, ns, len, name, args ); if ( rc == 0 ) { switch ( KDirectoryPathType ( self -> dir, "%s", path ) ) { case kptFile: case kptDir: case kptFile | kptAlias: case kptDir | kptAlias: return true; } } } return false; }
LIB_EXPORT rc_t CC KDatabaseVCreateDB ( KDatabase *self, KDatabase **dbp, KCreateMode cmode, const char *name, va_list args ) { rc_t rc; char path [ 256 ]; if ( dbp == NULL ) return RC ( rcDB, rcDatabase, rcCreating, rcParam, rcNull ); * dbp = NULL; if ( self == NULL ) return RC ( rcDB, rcDatabase, rcCreating, rcSelf, rcNull ); if ( self -> read_only ) return RC ( rcDB, rcDatabase, rcCreating, rcDatabase, rcReadonly ); rc = KDBVMakeSubPath ( self -> dir, path, sizeof path, "db", 2, name, args ); if ( rc == 0 ) { /* ensure that the "db" namespace directory is there */ rc = KDirectoryCreateDir ( self -> dir, 0775, kcmOpen, "db" ); if ( rc == 0 ) { rc = KDBManagerVCreateDBInt ( self -> mgr, dbp, self -> dir, cmode, path, NULL ); if ( rc == 0 ) { KDatabase *db = ( KDatabase* ) * dbp; db -> dad = self; atomic32_inc ( & self -> refcount ); } } } return rc; }