static rc_t OpenTableAndCursor(VDatabase *db, VTable **ptbl, VCursor **pcurs, uint32_t cid[], unsigned ncols) { rc_t rc = VDatabaseCreateTable(db, ptbl, "READ_STATS", kcmCreate | kcmMD5, "READ_STATS"); if (rc == 0) { rc = VTableColumnCreateParams(*ptbl, kcmCreate, kcsCRC32, 0); if (rc == 0) { rc = VTableCreateCursorWrite(*ptbl, &pcurs, kcmInsert); if (rc == 0) { unsigned i; for (i = 0; i < ncols && rc == 0; ++i) { rc = VCursorAddColumn(*pcurs, &cid[i], column_name[i]); } if (rc == 0) { rc = VCursorOpen(*pcurs); if (rc == 0) return 0; } VCursorRelease(*pcurs); } } VTableRelease(*ptbl); } *pcurs = NULL; *ptbl = NULL; 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; }
LIB_EXPORT rc_t CC SRAMgrVOpenTableUpdate(SRAMgr *mgr, SRATable **rslt, const char *spec, va_list args) { SRATable *self; char path[4096]; rc_t rc; if (mgr == NULL) return RC(RC_MODULE, RC_TARGET, rcConstructing, rcSelf, rcNull); if (spec == NULL || rslt == NULL) return RC(RC_MODULE, RC_TARGET, rcConstructing, rcParam, rcNull); *rslt = NULL; rc = ResolveTablePath(mgr, path, sizeof(path), spec, args); if (rc) return rc; self = calloc(1, sizeof(*self)); if (self == NULL) return RC(RC_MODULE, RC_TARGET, rcConstructing, rcMemory, rcExhausted); rc = VDBManagerOpenTableUpdate(mgr->vmgr, &self->vtbl, mgr->schema, "%s", path); if (rc == 0) { rc = VTableOpenMetadataUpdate(self->vtbl, &self->meta); if (rc == 0) { rc = KMetadataVersion(self->meta, &self->metavers); if (rc == 0) { rc = VTableCreateCursorWrite(self->vtbl, &self->curs, kcmInsert); if (rc == 0) { self->mgr = SRAMgrAttach(mgr); self->mode = mgr->mode; self->read_only = false; KRefcountInit(&self->refcount, 1, "SRATable", "OpenTableUpdate", path); rc = SRATableFillOut ( self, true ); if ( rc == 0 ) { VectorInit ( & self -> wcol, 0, 16 ); *rslt = self; return 0; } } } } } SRATableWhack(self); return rc; }
rc_t open_write_cursor (VTable * table, VCursor ** cursor, uint32_t * dat, uint32_t * len, const char * dat_name, const char* len_name) { rc_t rc; rc = VTableCreateCursorWrite (table, cursor, kcmInsert); if (rc) { LOGERR (klogErr, rc, "Failed to create Cursor"); *cursor = NULL; } else { do { rc = VCursorAddColumn (*cursor, dat, dat_name); if (rc) { pLOGERR (klogErr, rc, "Failed to add column $(C)", PLOG_S(C), dat_name); break; } rc = VCursorAddColumn (*cursor, len, len_name); if (rc) { pLOGERR (klogErr, rc, "Failed to add column $(C)", PLOG_S(C), len_name); break; } rc = VCursorOpen (*cursor); if (rc) { LOGERR (klogErr, rc, "Failed to open cursor"); break; } return 0; } while (0); } VCursorRelease (*cursor); *dat = 0; *len = 0; *cursor = NULL; return rc; }
/* vtblcp */ static rc_t vtblcp ( const vtblcp_parms *pb, const VTable *stbl, VTable *dtbl, const Vector *v ) { const VCursor *scurs; rc_t rc = VTableCreateCursorRead ( stbl, & scurs ); if ( rc != 0 ) LOGERR ( klogInt, rc, "failed to create empty destination cursor" ); else { VCursor *dcurs; rc = VTableCreateCursorWrite ( dtbl, & dcurs, kcmInsert ); if ( rc != 0 ) LOGERR ( klogInt, rc, "failed to create empty destination cursor" ); else { uint32_t count = VectorLength ( v ); vtblcp_column_map *cm = malloc ( sizeof *cm * count ); if ( cm == NULL ) { rc = RC ( rcExe, rcVector, rcAllocating, rcMemory, rcExhausted ); LOGERR ( klogInt, rc, "failed to create column index map" ); } else { uint32_t rd_filt; rc = populate_cursors ( dtbl, dcurs, scurs, cm, v, & rd_filt ); if ( rc == 0 ) rc = copy_table ( pb, dcurs, scurs, cm, count, rd_filt ); free ( cm ); } VCursorRelease ( dcurs ); } VCursorRelease ( scurs ); } return rc; }
static rc_t write_statistic_cmn( VTable * my_table, statistic * data, uint64_t * written, bool show_progress ) { VCursor *my_cursor; rc_t rc = VTableCreateCursorWrite( my_table, &my_cursor, kcmInsert ); if ( rc != 0 ) LogErr( klogInt, rc, "VTableCreateCursorWrite() failed\n" ); else { statistic_writer writer; rc = make_statistic_writer( &writer, my_cursor ); if ( rc == 0 ) { rc = write_statistic( &writer, data, written, show_progress ); if ( rc == 0 ) rc = whack_statistic_writer( &writer ); } VCursorRelease( my_cursor ); } return rc; }
rc_t CC KMain(int argc, char* argv[]) { const char table[] = "/home/klymenka/REDACT-IN"; const char name[] = "READ_FILTER"; rc_t rc = 0; bool locked = false; VDBManager* mgr; VTable *tbl; const VCursor *rCursor = NULL; int i; LogLevelSet("info"); for (i = 1; i < argc; ++i) { if (!strcmp(argv[i], "-+")) { if (++i <= argc) { #if _DEBUGGING KDbgSetString(argv[i]); #endif } } } /*KDbgSetString("VDB");*/ if (rc == 0) { /* +01: ManagerMake */ LOGMSG(klogInfo, "VDBManagerMakeUpdate"); rc = VDBManagerMakeUpdate(&mgr, NULL); DISP_RC_INT(rc, "while calling VDBManagerMakeUpdate"); } if (rc == 0) { rc = VDBManagerWritable(mgr, table); if (GetRCState(rc) == rcLocked) { LOGMSG(klogInfo, "VDBManagerUnlock"); rc = VDBManagerUnlock(mgr, table); DISP_RC_INT(rc, "while calling VDBManagerUnlock"); locked = true; } } if (rc == 0) { /* +02: OpenTable */ PLOGMSG(klogInfo, (klogInfo, "VDBManagerOpenTableUpdate(\"$(t)\")", "t=%s", table)); rc = VDBManagerOpenTableUpdate (mgr, &tbl, NULL, table); if (rc != 0) { PLOGERR(klogErr, (klogErr, rc, "while opening VTable '$(path)'", "path=%s", table)); } } if (rc == 0) { /* +03: CreateCursorRead */ LOGMSG(klogInfo, "VDBManagerUnlock"); rc = VTableCreateCursorRead(tbl, &rCursor); DISP_RC_INT(rc, "while creating read cursor"); #if 1 if (rc == 0) { uint32_t idx; PLOGMSG(klogInfo, (klogInfo, "VCursorAddColumn(read cursor, \"$(n)\")", "n=%s", name)); rc = VCursorAddColumn(rCursor, &idx, name); if (rc != 0) { PLOGERR(klogErr, (klogErr, rc, "while adding $(name) to read cursor", "name=%s", name)); } } #endif if (rc == 0) { LOGMSG(klogInfo, "VCursorOpen(read cursor)"); rc = VCursorOpen(rCursor); DISP_RC_INT(rc, "while opening read cursor"); } } if (rc == 0) { VCursor *cursor; uint32_t idx; /* +04: CreateCursorWrite */ LOGMSG(klogInfo, "VTableCreateCursorWrite"); rc = VTableCreateCursorWrite(tbl, &cursor, kcmInsert); DISP_RC_INT(rc, "while creating write cursor"); if (rc == 0) { PLOGMSG(klogInfo, (klogInfo, "VCursorAddColumn(write cursor, \"$(n)\")", "n=%s", name)); rc = VCursorAddColumn(cursor, &idx, name); if (rc != 0) { PLOGERR(klogErr, (klogErr, rc, "while adding $(name) to write cursor", "name=%s", name)); } } if (rc == 0) { LOGMSG(klogInfo, "VCursorOpen(write cursor)"); rc = VCursorOpen(cursor); DISP_RC_INT(rc, "while opening write cursor"); } #if 1 for (i = 0; i < 3 && rc == 0; ++i) { if (rc == 0) { PLOGMSG(klogInfo, (klogInfo, "VCursorOpenRow(write cursor) $(i)", "i=%d", i)); rc = VCursorOpenRow(cursor); DISP_RC_INT(rc, "while opening row to write"); } if (rc == 0) { char buffer[1]; char b; switch (i) { case 0: buffer[0] = SRA_READ_FILTER_CRITERIA; buffer[0] = SRA_READ_FILTER_REJECT; break; case 1: buffer[0] = SRA_READ_FILTER_REJECT; buffer[0] = SRA_READ_FILTER_CRITERIA; break; case 2: buffer[0] = SRA_READ_FILTER_REDACTED; break; } buffer[0] = SRA_READ_FILTER_PASS; b = buffer[0]; PLOGMSG(klogInfo, (klogInfo, "VCursorWrite('$(v)') $(i)", "v=%s,i=%d", b == SRA_READ_FILTER_REDACTED ? "SRA_READ_FILTER_REDACTED" : "?", i)); rc = VCursorWrite(cursor, idx, 8, buffer, 0, 1); DISP_RC_INT(rc, "while writing"); } if (rc == 0) { PLOGMSG(klogInfo, (klogInfo, "VCursorCommitRow(write cursor) $(i)", "i=%d", i)); rc = VCursorCommitRow(cursor); DISP_RC_INT(rc, "while committing row"); } PLOGMSG(klogInfo, (klogInfo, "VCursorCloseRow(write cursor) $(i)", "i=%d", i)); { rc_t rc2 = VCursorCloseRow(cursor); DISP_RC_INT(rc2, "while closing row"); if (rc == 0) { rc = rc2; } } } #endif LOGMSG(klogInfo, "VCursorRelease(read cursor)"); /* -03: CreateCursorRead */ VCursorRelease(rCursor); if (rc == 0) { LOGMSG(klogInfo, "VCursorCommit(write cursor)"); rc = VCursorCommit(cursor); DISP_RC_INT(rc, "while committing cursor"); } LOGMSG(klogInfo, "VCursorRelease(write cursor)"); /* -04: CreateCursorWrite */ VCursorRelease(cursor); } LOGMSG(klogInfo, "VTableRelease"); /* -02: OpenTable */ VTableRelease(tbl); LOGMSG(klogInfo, "VDBManagerLock"); if (locked) { rc_t rc2 = VDBManagerLock(mgr, table); DISP_RC_INT(rc2, "while VDBManagerLock"); } /* -01: ManagerMake */ LOGMSG(klogInfo, "VDBManagerRelease"); VDBManagerRelease(mgr); if (rc == 0) { LOGMSG(klogInfo, "SUCCESS"); } else { LOGMSG(klogInfo, "FAILURE"); } return rc; }
LIB_EXPORT rc_t CC SRAMgrVCreateTable ( SRAMgr *self, SRATable **rslt, const char *typespec, const char *spec, va_list args ) { rc_t rc; if ( rslt == NULL ) rc = RC ( rcSRA, rcTable, rcConstructing, rcParam, rcNull ); else { if ( self == NULL ) rc = RC ( rcSRA, rcTable, rcConstructing, rcSelf, rcNull ); else if ( spec == NULL ) rc = RC ( rcSRA, rcTable, rcConstructing, rcString, rcNull ); else if ( spec [ 0 ] == 0 ) rc = RC ( rcSRA, rcTable, rcConstructing, rcString, rcEmpty ); else { char path [ 4097 ]; size_t act_size = 0; rc = string_vprintf(path, 4097, &act_size, spec, args); path[act_size] = '\0'; if ( rc == 0 ) { VTable *vtbl; rc = VDBManagerCreateTable ( self -> vmgr, & vtbl, self -> schema, typespec, ( self -> mode & kcmBitMask ) | kcmCreate, "%s", path ); if ( rc == 0 ) { rc = VTableColumnCreateParams ( vtbl, kcmCreate, kcsCRC32, 0 ); if ( rc == 0 ) { SRATable *tbl = calloc ( 1, sizeof * tbl ); if ( tbl == NULL ) rc = RC ( rcSRA, rcTable, rcConstructing, rcMemory, rcExhausted ); else { tbl -> vtbl = vtbl; rc = VTableOpenMetadataUpdate ( vtbl, & tbl -> meta ); if ( rc == 0 ) rc = KMetadataVersion ( tbl -> meta, & tbl -> metavers ); if ( rc == 0 ) rc = VTableCreateCursorWrite ( vtbl, & tbl -> curs, kcmInsert ); if ( rc == 0 ) { tbl -> mgr = SRAMgrAttach ( self ); tbl -> mode = self -> mode; tbl -> read_only = false; KRefcountInit ( & tbl -> refcount, 1, "SRATable", "OpenTableUpdate", path ); VectorInit ( & tbl -> wcol, 0, 16 ); * rslt = tbl; return 0; } vtbl = NULL; SRATableWhack ( tbl ); } } VTableRelease ( vtbl ); } } } * rslt = NULL; } return rc; }
static rc_t static_write(void) { const char *schema_text = "version 1; include 'vdb/vdb.vschema'; table foo #1 { column ascii bar { read = .bar; } physical ascii .bar = bar; }"; bool force = 1; rc_t rc; VDBManager *vmgr; rc = VDBManagerMakeUpdate ( & vmgr, NULL ); if ( rc != 0 ) LOGERR ( klogInt, rc, "failed to make VDB manager" ); else { VSchema *schema; rc = VDBManagerMakeSchema ( vmgr, & schema ); if ( rc != 0 ) LOGERR ( klogInt, rc, "failed to make empty schema" ); else { rc = VSchemaParseText( schema, "static_schema", schema_text, strlen(schema_text) ); if ( rc != 0 ) PLOGERR ( klogErr, (klogErr, rc, "failed to parse schema '$(text)'", "test=%s", schema_text )); else { VTable *vtbl; rc = VDBManagerCreateTable ( vmgr, & vtbl, schema, "foo", force ? kcmInit : kcmCreate, table_path ); if ( rc != 0 ) { PLOGERR ( klogErr, (klogErr, rc, "failed to $(cmode) table '$(path)'" , "cmode=%s,path=%s" , force ? "create or replace" : "create" , table_path )); } else { VCursor *curs; rc = VTableCreateCursorWrite ( vtbl, & curs, kcmInsert ); if ( rc != 0 ) LOGERR ( klogInt, rc, "failed to create cursor" ); else { uint32_t idx; rc = VCursorAddColumn ( curs, &idx, "bar" ); if ( rc != 0 ) { PLOGERR ( klogErr, (klogErr, rc, "failed to add column '$(col)' to cursor" , "col=bar" )); } else { rc = VCursorOpen ( curs ); if ( rc != 0 ) LOGERR ( klogErr, rc, "failed to open cursor" ); else { int i; for ( i = 0; i != 10 && rc == 0; ++i ) { rc = VCursorOpenRow ( curs ); if ( rc != 0 ) LOGERR ( klogErr, rc, "failed to open cursor row" ); else { rc_t rc2; uint32_t count = sizeof(buff) - 1; rc = VCursorWrite ( curs, idx, 8, buff, 0, count ); if ( rc != 0 ) { int64_t rid = 0; VCursorRowId ( curs, & rid ); PLOGERR ( klogInt, (klogInt, rc, "failed to write data to row $(row_id)'" , "row_id=%ld" , rid )); break; } if ( rc == 0 ) { rc = VCursorCommitRow ( curs ); if ( rc != 0 ) LOGERR ( klogErr, rc, "failed to commit row" ); } rc2 = VCursorCloseRow ( curs ); if ( rc2 != 0 ) { LOGERR ( klogErr, rc2, "failed to close cursor row" ); if ( rc == 0 ) rc = rc2; } } } if ( GetRCState ( rc ) == rcDone ) rc = 0; if ( rc == 0 ) rc = VCursorCommit ( curs ); } } VCursorRelease ( curs ); } #if 1 if ( rc == 0 ) rc = VTableReindex ( vtbl ); #endif VTableRelease ( vtbl ); } } VSchemaRelease ( schema ); } VDBManagerRelease ( vmgr ); } return rc; }
rc_t run (const char * table_path, uint64_t N ) { static const char *colInf[] = { "C1: Same value, same length", "C2: Var. value, same length", "C3: Var. value, var. legnth", "C4: Same value except I row", "C5: Same value except L row" }; rc_t rc; uint64_t row = 0; VDBManager *mgr = NULL; VSchema *schema = NULL; VTable *table = NULL; VCursor *cursor; uint32_t idx[COLUMNS]; uint64_t total[COLUMNS]; int i = 0, j = 0, prev = 0; char *buffer[BUFFERS]; /* Initialize arrays */ memset(&idx, 0, sizeof idx); memset(&total, 0, sizeof total); for (i = 0; i < BUFFERS; ++i) { char c; size_t sz = ROWLEN + 1; if (i == (BUFFERS - 1)) sz += ROWLEN; buffer[i] = malloc(sz); for (j = 0, c = 0; j < sz - 1; ++j, ++c) { if (c >= ROWLEN) c -= ROWLEN; buffer[i][j] = '0' + c; } buffer[i][j] = '\0'; } /* Create manager */ rc = VDBManagerMakeUpdate(&mgr, NULL); if (rc != 0) { LOGERR(klogInt, rc, "failed to open vdb library"); } /* Initialize schema */ if (rc == 0) { rc = VDBManagerMakeSchema(mgr, &schema); if (rc != 0) LOGERR(klogInt, rc, "failed to create empty schema"); } if (rc == 0) { char text[512] = "table Table #1 {\n"; char col [128]; for (i = 1; i <= COLUMNS; ++i) { sprintf(col, " column ascii C%d = .C%d; physical ascii .C%d = C%d;\n", i, i, i, i); strcat(text, col); } strcat(text, "};"); STSMSG(1,("Parsing schema:\n%s", text)); rc = VSchemaParseText(schema, "Schema", text, strlen(text)); if (rc != 0) LOGERR(klogInt, rc, "failed to parse schema"); } /* Create table */ if (rc == 0) { STSMSG(1,("Creating %s", tablePath)); rc = VDBManagerCreateTable(mgr, &table, schema, "Table", kcmInit, tablePath); if (rc != 0) LOGERR(klogInt, rc, "failed to create table"); } /* Initialize cursor */ if (rc == 0) { rc = VTableCreateCursorWrite(table, &cursor, kcmInsert); if (rc != 0) LOGERR(klogInt, rc, "failed to create cursor"); } for (i = 0; rc == 0 && i < COLUMNS; ++i) { char col[3]; sprintf(col, "C%d", i + 1); STSMSG(2,("Adding column %s to cursor", col)); rc = VCursorAddColumn(cursor, &idx[i], col); if (rc != 0) PLOGERR(klogInt, (klogInt, rc, "failed to add $(c) to cursor", "c=%s", col)); } if (rc == 0) { rc = VCursorOpen(cursor); if (rc != 0) LOGERR(klogInt, rc, "failed to open cursor"); } /* Write data */ for (row = 0; row < N && rc == 0; ++row) { int max = 2 * ROWLEN - 1; int sz = 0; if ((row % 2) == 0) { int min = 1; sz = min + (int) (max * (rand() / (RAND_MAX + 1.0))); prev = sz; buffer[1][0] = '1'; } else { sz = max + 1 - prev; buffer[1][0] = '2'; } rc = Quitting(); if (rc == 0) { KStsLevel lvl = 2; if (row > 0 && ((row % ROWS) == 0)) { lvl = 1; } STSMSG (lvl, ("Writing row %ji / %ji", row + 1, N)); rc = VCursorOpenRow(cursor); if (rc != 0) LOGERR(klogInt, rc, "failed to open row"); } for (j = 0; j < COLUMNS && rc == 0; ++j) { uint32_t count = 0; int buf = j; switch (j) { case 0: case 1: count = strlen(buffer[j]); break; case 2: count = sz; break; case 3: buf = 0; if (row == 0) buf = 1; count = strlen(buffer[buf]); break; case 4: buf = 0; if (row == (N - 1)) buf = 1; count = strlen(buffer[buf]); break; default: assert(0); break; } STSMSG (3, ("Row %ji/Col.%d: %sd %.*s\n", row + 1, j + 1, count, count, buffer[buf])); rc = VCursorWrite (cursor, idx[j], 8, buffer[buf], 0, count); if (rc != 0) PLOGERR(klogInt, (klogInt, rc, "failed to write row[$i]", "i=%d", j + 1)); total[j] += count; } if (rc == 0) { rc = VCursorCommitRow(cursor); if (rc != 0) LOGERR(klogInt, rc, "failed to commit row"); } if (rc == 0) { rc = VCursorCloseRow(cursor); if (rc != 0) LOGERR(klogInt, rc, "failed to close row"); } } if (rc == 0) { STSMSG (1, ("Commiting cursor\n")); rc = VCursorCommit(cursor); if (rc != 0) LOGERR(klogInt, rc, "failed to commit cursor"); } /* Cleanup */ VCursorRelease(cursor); VTableRelease(table); VSchemaRelease(schema); VDBManagerRelease(mgr); for (i = 0; i < BUFFERS; ++i) { free(buffer[i]); } /* Log */ if (rc == 0) { PLOGMSG(klogInfo, (klogInfo, "$(t)", "t=%s", tablePath)); PLOGMSG(klogInfo,(klogInfo, "$(n)($(N)) rows written - $(b) bytes per row", PLOG_I64(n) "," PLOG_X64(N) ",b=%d", N, N, ROWLEN)); for (i = 0; i < COLUMNS; ++i) { PLOGMSG(klogInfo,(klogInfo, "$(i): $(n)($(N)) bytes", "i=%s," PLOG_I64(n) "," PLOG_X64(N), colInf[i], total[i], total[i])); } } if (rc == 0) { KDirectory *dir = NULL; uint64_t sizes[COLUMNS]; memset(&sizes, 0, sizeof sizes); rc = KDirectoryNativeDir(&dir); if (rc != 0) LOGERR(klogInt, rc, "failed to KDirectoryNativeDir"); else { for (i = 1; i <= COLUMNS; ++i) { uint64_t size = 0; #define FORMAT "%s/col/%s/data" #define KFORMAT "$(d)/col/$(n)/data", "d=%s,n=%s" #define STATUS(action) (action FORMAT, tablePath, name) char name[3]; sprintf(name, "C%d", i); STSMSG (1, STATUS("checking ")); rc = KDirectoryFileSize(dir, &size, FORMAT, tablePath, name); if (rc != 0) { if (GetRCState(rc) == rcNotFound) { STSMSG (2, STATUS("not found ")); rc = 0; } else PLOGERR(klogInt, (klogInt, rc, "failed to check " KFORMAT, tablePath, name)); } else { STSMSG (2, STATUS("found ")); } PLOGMSG(klogInfo, (klogInfo, "Size of $(d)/col/$(n)/data = $(s)", "d=%s,n=%s," PLOG_I64(s), tablePath, name, size)); sizes[i - 1] = size; } } KDirectoryRelease(dir); if (rc == 0) { puts(""); KOutMsg("%ld rows, %d bytes per row:\n", N, ROWLEN); for (i = 0; i < COLUMNS; ++i) { puts(colInf[i]); } puts(""); for (i = 0; i < COLUMNS; ++i) { int64_t over = sizes[i] - total[i]; KOutMsg("C%d: %9ld bytes written; " "%9ld in 'data'", i + 1, total[i], sizes[i]); if (over > 0) { double p = 100.0 * over / sizes[i]; printf(": %7ld extra bytes (%.4f%%)\n", over, p); } else { puts(""); } } } } return rc; }
static rc_t DbInit(rc_t rc, const CmdLine* args, Db* db) { const char name[] = "READ_FILTER"; assert(args && db); memset(db, 0, sizeof *db); if (rc != 0) { return rc; } db->table = args->table; if (rc == 0) { rc = VDBManagerMakeUpdate(&db->mgr, NULL); DISP_RC(rc, "while calling VDBManagerMakeUpdate"); } if (rc == 0) { rc = VDBManagerWritable(db->mgr, args->table); if (rc != 0) { if (GetRCState(rc) == rcLocked) { rc = VDBManagerUnlock(db->mgr, args->table); if (rc != 0) { PLOGERR(klogErr, (klogErr, rc, "while calling VDBManagerUnlock('$(table)')", "table=%s", args->table)); } db->locked = true; } else { PLOGERR(klogErr, (klogErr, rc, "while calling VDBManagerWritable('$(table)')", "table=%s", args->table)); if (rc == RC(rcDB, rcPath, rcAccessing, rcPath, rcReadonly)) { PLOGERR(klogErr, (klogErr, rc, "N.B. It is possible '$(table)' was not locked properly" , "table=%s", args->table)); } } } } if (rc == 0) { db->locked = true; /* has to be locked in production mode */ rc = VDBManagerOpenTableUpdate (db->mgr, &db->tbl, NULL, args->table); if (rc != 0) { VDatabase *vdb; rc_t rc2 = VDBManagerOpenDBUpdate ( db->mgr, &vdb, NULL , args->table ); if( rc2 == 0) { rc2 = VDatabaseOpenTableUpdate ( vdb, &db->tbl, "SEQUENCE" ); if (rc2 == 0 ) rc = 0; VDatabaseRelease ( vdb ); } } if(rc != 0){ PLOGERR(klogErr, (klogErr, rc, "while opening VTable '$(table)'", "table=%s", args->table)); } } if( rc == 0) { rc = VTableCreateCursorRead(db->tbl, &db->rCursor); DISP_RC(rc, "while creating read cursor"); if (rc == 0) { rc = VCursorAddColumn(db->rCursor, &db->rFilterIdx, "%s", name); if (rc != 0) { PLOGERR(klogErr, (klogErr, rc, "while adding $(name) to read cursor", "name=%s", name)); } } if (rc == 0) { rc = VCursorOpen(db->rCursor); DISP_RC(rc, "while opening read cursor"); } } if (rc == 0) { rc = VTableCreateCursorWrite(db->tbl, &db->wCursor, kcmInsert); DISP_RC(rc, "while creating write cursor"); if (rc == 0) { rc = VCursorAddColumn(db->wCursor, &db->wIdx, "%s", name); if (rc != 0) { PLOGERR(klogErr, (klogErr, rc, "while adding $(name) to write cursor", "name=%s", name)); } } if (rc == 0) { rc = VCursorOpen(db->wCursor); DISP_RC(rc, "while opening write cursor"); } } return rc; }
rc_t open (param_block * pb) { rc_t rc; rc = KDirectoryNativeDir (&pb->pwd); if (rc) LOGERR (klogFatal, rc, "Failed to open file system"); else { rc = KDirectoryOpenFileRead (pb->pwd, &pb->file, "%s", pb->file_path); if (rc) LOGERR (klogFatal, rc, "Failed to open input file"); else { rc = KMMapMakeRead (&pb->mmap, pb->file); if (rc) LOGERR (klogFatal, rc, "unable to map file"); else { rc = VDBManagerMakeUpdate (&pb->mgr, pb->pwd); if (rc) LOGERR (klogFatal, rc, "Failed to open DB Manager"); else { rc = VDBManagerMakeSchema (pb->mgr, &pb->schema); if (rc) LOGERR (klogFatal, rc, "Failed to create a schema object"); else { VSchemaAddIncludePath (pb->schema, "interfaces"); rc = VSchemaParseFile (pb->schema, "%s", pb->schema_path); if (rc) LOGERR (klogFatal, rc, "Failed to parse schema"); else { rc = VDBManagerCreateTable (pb->mgr, &pb->table, pb->schema, TYPESPEC, kcmCreate, "%s", pb->table_path); if (rc) LOGERR (klogFatal, rc, "Failed to create table"); else { rc = VTableCreateCursorWrite (pb->table, &pb->cursor, kcmCreate); if (rc) LOGERR (klogFatal, rc, "Failed to create cursor"); else { rc = VCursorAddColumn (pb->cursor, &pb->idx, "READ"); if (rc) LOGERR (klogFatal, rc, "Failed to add READ to cursor"); else { rc = VCursorOpen (pb->cursor); if (rc) LOGERR (klogFatal, rc, "Failed to open cursor"); else { rc = write_rows (pb); if (rc == 0) VCursorCommit (pb->cursor); } } VCursorRelease (pb->cursor); } VTableRelease (pb->table); } } VSchemaRelease (pb->schema); } VDBManagerRelease (pb->mgr); } KMMapRelease (pb->mmap); } KFileRelease (pb->file); } KDirectoryRelease (pb->pwd); } return rc; }