bool SRA_StatisticsNextPath ( const SRA_Statistics * self, ctx_t ctx, const char * path, const char** next ) { FUNC_ENTRY ( ctx, rcSRA, rcDatabase, rcAccessing ); const DictionaryEntry * node = NULL; assert ( self ); if ( path == NULL ) INTERNAL_ERROR ( xcParamNull, "path is NULL" ); else if ( path[0] == 0 ) { node = ( const DictionaryEntry * ) BSTreeFirst ( & self -> dictionary ); } else { node = ( const DictionaryEntry * ) BSTreeFind ( & self -> dictionary, ( const void * ) path, DictionaryEntryFind ); if ( node == NULL ) { INTERNAL_ERROR ( xcUnexpected, "dictionary item '%s' is not found", path ); } else { node = ( const DictionaryEntry * ) BSTNodeNext ( & node -> dad ); } } if ( node == NULL ) { *next = NULL; return false; } *next = node -> path; return true; }
/* IdRange * returns range of ids contained within */ bool KColumnIdx1IdRange ( const KColumnIdx1 *self, int64_t *first, int64_t *upper ) { rc_t rc = KColumnIdx1LazyLoad ( self ); if ( rc != 0 ) return false; assert ( self != NULL ); assert ( first != NULL ); assert ( upper != NULL ); #if USE_BSTREE_IN_COLUMN_IDX1 { const KColumnIdx1Node *a, *z; a = ( const KColumnIdx1Node* ) BSTreeFirst ( & self -> bst ); z = ( const KColumnIdx1Node* ) BSTreeLast ( & self -> bst ); if ( a == NULL ) return false; assert ( z != NULL ); * first = a -> loc . start_id; * upper = z -> loc . start_id + z -> loc . id_range; } #else if ( self -> count == 0 ) return false; *first = self->data[0].start_id ; *upper = self->data[self->count-1].start_id + self->data[self->count-1].id_range; #endif assert ( * first < * upper ); return true; }
rc_t make_column_namelist ( const BSTree *columns, KNamelist **names ) { VNamelist *list; rc_t rc = VNamelistMake ( & list, 8 ); if ( rc == 0 ) { const String *last = NULL; const VColumnRef *cref = ( const VColumnRef* ) BSTreeFirst ( columns ); while ( cref != NULL ) { if ( last == NULL || ! StringEqual ( last, & cref -> name ) ) { rc = VNamelistAppend ( list, cref -> name . addr ); if ( rc != 0 ) break; last = & cref -> name; } cref = ( const VColumnRef* ) BSTNodeNext ( & cref -> n ); } if ( rc == 0 ) rc = VNamelistToNamelist ( list, names ); VNamelistRelease ( list ); } return rc; }
static rc_t SaveObjects ( const ObjectTable* data, VDatabase* db ) { VTable* tbl; rc_t rc = VDatabaseCreateTable(db, &tbl, "object_inst", kcmCreate | kcmMD5, "OBJECTS"); if (rc == 0) { rc_t rc2; VCursor *cur; rc = VTableCreateCursorWrite( tbl, &cur, kcmInsert ); if (rc == 0) { uint32_t id_idx, name_idx, proj_idx, dname_idx, size_idx, csum_idx, enc_idx; if (rc == 0) rc = VCursorAddColumn( cur, &id_idx, "id" ); if (rc == 0) rc = VCursorAddColumn( cur, &name_idx, "name" ); if (rc == 0) rc = VCursorAddColumn( cur, &proj_idx, "project" ); if (rc == 0) rc = VCursorAddColumn( cur, &dname_idx, "display_name" ); if (rc == 0) rc = VCursorAddColumn( cur, &size_idx, "size" ); if (rc == 0) rc = VCursorAddColumn( cur, &csum_idx, "checksum" ); if (rc == 0) rc = VCursorAddColumn( cur, &enc_idx, "encryption_key" ); if (rc == 0) { rc = VCursorOpen( cur ); if (rc == 0) { const Object* obj = (const Object*)BSTreeFirst(data); while (rc == 0 && obj != NULL) { rc = VCursorOpenRow( cur ); if (rc == 0) rc = VCursorWrite( cur, id_idx, sizeof(obj->id) * 8, &obj->id, 0, 1); if (rc == 0) rc = VCursorWrite( cur, name_idx, StringLength(obj->name) * 8, obj->name->addr, 0, 1); if (rc == 0) rc = VCursorWrite( cur, proj_idx, StringLength(obj->project) * 8, obj->project->addr, 0, 1); if (rc == 0) rc = VCursorWrite( cur, dname_idx, StringLength(obj->display_name) * 8, obj->display_name->addr, 0, 1); if (rc == 0) rc = VCursorWrite( cur, size_idx, sizeof(obj->size) * 8, &obj->size, 0, 1); if (rc == 0) rc = VCursorWrite( cur, csum_idx, StringLength(obj->encryption_key) * 8, obj->encryption_key->addr, 0, 1); if (rc == 0) rc = VCursorWrite( cur, enc_idx, StringLength(obj->encryption_key) * 8, obj->encryption_key->addr, 0, 1); if (rc == 0) rc = VCursorCommitRow( cur ); if (rc == 0) rc = VCursorCloseRow( cur ); obj = (const Object*)BSTNodeNext(&obj->dad); } if (rc == 0) rc = VCursorCommit( cur ); } } rc2 = VCursorRelease(cur); if (rc == 0) rc = rc2; } rc2 = VTableRelease(tbl); if (rc == 0) rc = rc2; } return rc; }
static rc_t SaveProjects( const ProjectTable* data, VDatabase* db ) { VTable* tbl; rc_t rc = VDatabaseCreateTable(db, &tbl, "project_inst", kcmCreate | kcmMD5, "PROJECTS"); if (rc == 0) { rc_t rc2; VCursor *cur; rc = VTableCreateCursorWrite( tbl, &cur, kcmInsert ); if (rc == 0) { uint32_t id_idx, name_idx, dl_idx, enc_idx; rc = VCursorAddColumn( cur, &id_idx, "id" ); rc = VCursorAddColumn( cur, &name_idx, "name" ); rc = VCursorAddColumn( cur, &dl_idx, "download_ticket" ); rc = VCursorAddColumn( cur, &enc_idx, "encryption_key" ); if (rc == 0) { rc = VCursorOpen( cur ); if (rc == 0) { const Project* p = (const Project*)BSTreeFirst(data); while (rc == 0 && p != NULL) { rc = VCursorOpenRow( cur ); if (rc == 0) rc = VCursorWrite( cur, id_idx, sizeof(p->id) * 8, &p->id, 0, 1); if (rc == 0) rc = VCursorWrite( cur, name_idx, StringLength(p->name) * 8, p->name->addr, 0, 1); if (rc == 0) rc = VCursorWrite( cur, dl_idx, StringLength(p->download_ticket) * 8, p->download_ticket->addr, 0, 1); if (rc == 0) rc = VCursorWrite( cur, enc_idx, StringLength(p->encryption_key) * 8, p->encryption_key->addr, 0, 1); if (rc == 0) rc = VCursorCommitRow( cur ); if (rc == 0) rc = VCursorCloseRow( cur ); p = (const Project*)BSTNodeNext(&p->dad); } if (rc == 0) rc = VCursorCommit( cur ); } } rc2 = VCursorRelease(cur); if (rc == 0) rc = rc2; } rc2 = VTableRelease(tbl); if (rc == 0) rc = rc2; } return rc; }
static rc_t VProdResolveBestColumn ( const VProdResolve *self, VProduction **out, const BSTree *ordered, bool alt ) { rc_t rc; /* walk all candidtes */ const SColumnBestFit *n = ( const SColumnBestFit* ) BSTreeFirst ( ordered ); for ( rc = 0; n != NULL; n = ( const SColumnBestFit* ) BSTNodeNext ( & n -> n ) ) { /* look for open column */ const SColumn *scol = n -> scol; /* resolve the column as appropriate */ rc = VProdResolveColumn ( self, out, scol, alt ); if ( rc != 0 || * out != NULL ) break; } return rc; }
static rc_t mark_type_sensitivity ( const BSTree *stype_tbl, const VSchema *schema, const VTypedecl *td, vtblcp_column_map *cm ) { const stype_id *node; /* simple case - look for exact matches */ if ( BSTreeFind ( stype_tbl, td, stype_id_cmp ) != NULL ) { cm -> sensitive = true; return 0; } /* exhaustive case - perform one by one ancestry test */ for ( node = ( const stype_id* ) BSTreeFirst ( stype_tbl ); node != NULL; node = ( const stype_id* ) BSTNodeNext ( & node -> n ) ) { cm -> redact_value = NULL; if ( td -> type_id > node -> type_id ) { VTypedecl cast; /* test for our type being a subtype */ if ( VTypedeclToType ( td, schema, node -> type_id, & cast, NULL ) ) { cm -> redact_value = node -> redact_value; cm -> sensitive = true; return 0; } } } /* doesn't appear to be sensitive */ cm -> sensitive = false; return 0; }
const struct reference_region * get_first_ref_node( const BSTree * regions ) { return ( const struct reference_region * ) BSTreeFirst ( regions ); }