static rc_t bam_header(const VDatabase* db) { rc_t rc = 0; const char path[] = "BAM_HEADER"; const KMetadata* meta = NULL; const KMDataNode* node = NULL; char* buffer = NULL; assert(db); if (rc == 0) { rc = VDatabaseOpenMetadataRead(db, &meta); DISP_RC(rc, "while calling VDatabaseOpenMetadataRead"); } if (rc == 0) { rc = KMetadataOpenNodeRead(meta, &node, "%s", path); if (GetRCState(rc) == rcNotFound) { rc = 0; } else { DISP_RC2(rc, path, "while calling KMetadataOpenNodeRead"); if (rc == 0) { int i = 0; size_t bsize = 0; size_t size = 1024; for (i = 0; i < 2; ++i) { free(buffer); bsize = size + 1; buffer = malloc(bsize); if (buffer == NULL) { rc = RC(rcExe, rcStorage, rcAllocating, rcMemory, rcExhausted); } else { rc = KMDataNodeReadCString(node, buffer, bsize, &size); if (rc == 0) { break; } else if (i == 0 && GetRCObject(rc) == (enum RCObject)rcBuffer && GetRCState (rc) == rcInsufficient) { rc = 0; } } DISP_RC2(rc, path, "while calling KMDataNodeReadCString"); } } } } if (rc == 0 && buffer) { OUTMSG(("BAM_HEADER: {\n%s}\n\n", buffer)); } DESTRUCT(KMDataNode, node); DESTRUCT(KMetadata, meta); free(buffer); return rc; }
rc_t AlignRefTableCursor(const VTable* table, const VCursor *native_curs, const VCursor** ref_cursor,const VTable **reftbl) { rc_t rc = 0; char ref_tbl_name[512] = "REFERENCE"; const KMetadata* meta; const VCursor *curs; if( (rc = VTableOpenMetadataRead(table, &meta)) == 0 ) { const KMDataNode* node; if( (rc = KMetadataOpenNodeRead(meta, &node, "CONFIG/REF_TABLE")) == 0 ) { size_t sz; rc = KMDataNodeReadCString(node, ref_tbl_name, sizeof(ref_tbl_name), &sz); ref_tbl_name[sz] = '\0'; KMDataNodeRelease(node); } KMetadataRelease(meta); } rc = VCursorLinkedCursorGet(native_curs,ref_tbl_name,&curs); if(rc != 0){ const VDatabase *db; const VTable *tbl; /* get at the parent database */ rc = VTableOpenParentRead ( table, & db ); if(rc != 0) return rc; /* open the table */ rc = VDatabaseOpenTableRead ( db, &tbl, ref_tbl_name); VDatabaseRelease ( db ); if(rc != 0) return rc; /* create a cursor */ rc = VTableCreateCachedCursorRead(tbl, &curs,256*1024*1024); if(reftbl){ *reftbl = tbl; } else { VTableRelease(tbl); } if(rc != 0) return rc; rc = VCursorPermitPostOpenAdd( curs ); if(rc != 0) return rc; rc = VCursorOpen( curs ); if(rc != 0) return rc; if(native_curs){ rc = VCursorLinkedCursorSet(native_curs,ref_tbl_name,curs); } if(rc != 0) return rc; } else { VCursorAddRef(curs); } *ref_cursor = curs; return 0; }
static bool KMetadataStrEqual ( const KMetadata *meta, const char *path, const char *str ) { const KMDataNode *node; rc_t rc = KMetadataOpenNodeRead ( meta, & node, "%s", path ); if ( rc == 0 ) { size_t num_read; char buff [ 4096 ]; rc = KMDataNodeReadCString ( node, buff, sizeof buff, & num_read ); KMDataNodeRelease ( node ); if ( rc == 0 ) { if ( strcmp ( buff, str ) == 0 ) return true; } } return false; }
/* Read ( formatted ) * reads as C-string * * "buffer" [ OUT ] and "bsize" [ IN ] - output buffer for * NUL terminated string. * * "size" [ OUT ] - return parameter giving size of string * not including NUL byte. the size is set both upon success * and insufficient buffer space error. */ inline rc_t Read ( char *buffer, size_t bsize, size_t *size ) const throw() { return KMDataNodeReadCString ( this, buffer, bsize, size ); }