/* CreateTable * create a new or open an existing table under database * * "tbl" [ OUT ] - return parameter for newly opened table * * "member" [ IN ] - name of table member template under database * the named member is a table template rather than a named table. * * "cmode" [ IN ] - creation mode * * "cmode_mask" [ IN ] - if a bit of "cmode_mask" is set (1) then * the corresponding bit of "cmode" is used for the table, * otherwise (0) the corresponding bit is taken from db and "cmode"'s * bit is ignored * the mask for setting mode (kcmOpen, kcmInit, kcmCreate) is at least * one bit set in the mask kcmValueMask. * * "name" [ IN ] - NUL terminated string in * db-native character set giving actual table name */ LIB_EXPORT rc_t CC VDatabaseVCreateTableByMask ( VDatabase *self, VTable **tblp, const char *member, KCreateMode cmode, KCreateMode cmode_mask, const char *name, va_list args ) { rc_t rc; if ( tblp == NULL ) rc = RC ( rcVDB, rcDatabase, rcCreating, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcVDB, rcDatabase, rcCreating, rcSelf, rcNull ); else if ( member == NULL ) rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcNull ); else if ( member [ 0 ] == 0 ) rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcEmpty ); else if ( self -> read_only ) rc = RC ( rcVDB, rcDatabase, rcCreating, rcDatabase, rcReadonly ); else { rc = VTableMake ( tblp, self -> mgr, self, self -> schema ); if ( rc == 0 ) { VTable *tbl = * tblp; rc = KDatabaseVCreateTableByMask ( self -> kdb, & tbl -> ktbl, cmode, cmode_mask, name, args ); if ( rc == 0 ) { rc = VTableOpenUpdate ( tbl, member ); if ( rc == 0 ) { tbl -> pgsize = self -> pgsize; tbl -> cmode = KDatabaseGetCmode ( self->kdb ); /* TODO: do we really want to inherit open mode from db? */ tbl -> checksum = KDatabaseGetChecksum ( self->kdb ); #if LAZY_OPEN_COL_NODE KMDataNodeRelease ( tbl -> col_node ); tbl -> col_node = NULL; #endif return 0; } rc = ResetRCContext ( rc, rcVDB, rcDatabase, rcCreating ); } VTableWhack ( tbl ); } } * tblp = NULL; } return rc; }
/* CreateTable * create a new or open an existing table using manager * * "tbl" [ OUT ] - return parameter for newly opened table * * "schema" [ IN ] - schema object containg table * declaration to be used in creating tbl. * * "typespec" [ IN ] - type and optionally version of table schema, * e.g. 'MY_NAMESPACE:MyTable' or 'MY_NAMESPACE:MyTable#1.1' * * "cmode" [ IN ] - creation mode * * "path" [ IN ] - NUL terminated string in * wd-native character set giving path to table */ LIB_EXPORT rc_t CC VDBManagerVCreateTable ( VDBManager *self, VTable **tblp, const VSchema *schema, const char *typespec, KCreateMode cmode, const char *path, va_list args ) { rc_t rc; if ( tblp == NULL ) rc = RC ( rcVDB, rcMgr, rcCreating, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcVDB, rcMgr, rcCreating, rcSelf, rcNull ); else if ( schema == NULL ) rc = RC ( rcVDB, rcMgr, rcOpening, rcSchema, rcNull ); else if ( typespec == NULL ) rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcNull ); else if ( typespec [ 0 ] == 0 ) rc = RC ( rcVDB, rcMgr, rcOpening, rcName, rcEmpty ); else { /* create object with new schema */ rc = VTableMake ( tblp, self, NULL, schema ); if ( rc == 0 ) { VTable *tbl = * tblp; /* create physical object */ rc = KDBManagerVCreateTable ( self -> kmgr, & tbl -> ktbl, cmode, path, args ); if ( rc == 0 ) { rc = VTableOpenUpdate ( tbl, typespec ); if ( rc == 0 ) { #if LAZY_OPEN_COL_NODE KMDataNodeRelease ( tbl -> col_node ); tbl -> col_node = NULL; #endif return 0; } rc = ResetRCContext ( rc, rcVDB, rcMgr, rcCreating ); } VTableWhack ( tbl ); } } * tblp = NULL; } return rc; }
/* OpenTableRead * VOpenTableRead * open a table for read * * "tbl" [ OUT ] - return parameter for newly opened table * * "path" [ IN ] - NUL terminated string in * wd-native character set giving path to table */ LIB_EXPORT rc_t CC VDBManagerVOpenTableRead ( const VDBManager *self, const VTable **tblp, const VSchema *schema, const char *path, va_list args ) { rc_t rc; if ( tblp == NULL ) rc = RC ( rcVDB, rcMgr, rcOpening, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcVDB, rcMgr, rcOpening, rcSelf, rcNull ); else { VTable *tbl; /* if no schema is given, always pass intrinsic */ if ( schema == NULL ) schema = self -> schema; rc = VTableMake ( & tbl, self, NULL, schema ); if ( rc == 0 ) { tbl -> read_only = true; rc = KDBManagerVOpenTableRead ( self -> kmgr, & tbl -> ktbl, path, args ); if ( rc == 0 ) { rc = VTableOpenRead ( tbl ); if ( rc == 0 ) { #if LAZY_OPEN_COL_NODE KMDataNodeRelease ( tbl -> col_node ); tbl -> col_node = NULL; #endif * tblp = tbl; return 0; } } VTableWhack ( tbl ); } } * tblp = NULL; } return rc; }
/* OpenTableUpdate * VOpenTableUpdate * open a table for read/write * * "tbl" [ OUT ] - return parameter for newly opened table * * "name" [ IN ] - NUL terminated string in UTF-8 giving name of table */ LIB_EXPORT rc_t CC VDBManagerVOpenTableUpdate ( VDBManager *self, VTable **tblp, const VSchema *schema, const char *path, va_list args ) { rc_t rc; if ( tblp == NULL ) rc = RC ( rcVDB, rcMgr, rcOpening, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcVDB, rcMgr, rcOpening, rcSelf, rcNull ); else { /* if no schema is given, always pass intrinsic */ if ( schema == NULL ) schema = self -> schema; rc = VTableMake ( tblp, self, NULL, schema ); if ( rc == 0 ) { VTable *tbl = * tblp; rc = KDBManagerVOpenTableUpdate ( self -> kmgr, & tbl -> ktbl, path, args ); if ( rc == 0 ) { tbl -> blob_validation = KTableHasRemoteData ( tbl -> ktbl ); rc = VTableOpenUpdate ( tbl, NULL ); if ( rc == 0 ) { #if LAZY_OPEN_COL_NODE KMDataNodeRelease ( tbl -> col_node ); tbl -> col_node = NULL; #endif return 0; } } VTableWhack ( tbl ); } } * tblp = NULL; } return rc; }
LIB_EXPORT rc_t CC VDatabaseVOpenTableUpdate ( VDatabase *self, VTable **tblp, const char *name, va_list args ) { rc_t rc; if ( tblp == NULL ) rc = RC ( rcVDB, rcDatabase, rcOpening, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcVDB, rcDatabase, rcOpening, rcSelf, rcNull ); else { rc = VTableMake ( tblp, self -> mgr, self, self -> schema ); if ( rc == 0 ) { VTable *tbl = * tblp; rc = KDatabaseVOpenTableUpdate ( self -> kdb, & tbl -> ktbl, name, args ); if ( rc == 0 ) { tbl -> blob_validation = KTableHasRemoteData ( tbl -> ktbl ); rc = VTableOpenUpdate ( tbl, NULL ); if ( rc == 0 ) { #if LAZY_OPEN_COL_NODE KMDataNodeRelease ( tbl -> col_node ); tbl -> col_node = NULL; #endif return 0; } } VTableWhack ( tbl ); } } * tblp = NULL; } return rc; }
LIB_EXPORT rc_t CC VDatabaseVOpenTableRead ( const VDatabase *self, const VTable **tblp, const char *path, va_list args ) { rc_t rc; if ( tblp == NULL ) rc = RC ( rcVDB, rcDatabase, rcOpening, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcVDB, rcDatabase, rcOpening, rcSelf, rcNull ); else { VTable *tbl; rc = VTableMake ( & tbl, self -> mgr, self, self -> schema ); if ( rc == 0 ) { tbl -> read_only = true; rc = KDatabaseVOpenTableRead ( self -> kdb, & tbl -> ktbl, path, args ); if ( rc == 0 ) { rc = VTableOpenRead ( tbl ); if ( rc == 0 ) { * tblp = tbl; return 0; } } VTableWhack ( tbl ); } } * tblp = NULL; } return rc; }