static void sdb_restore_file_cells( sdb_table_t *tbl) { struct sdb_read_ctx_t rctx; struct bsd_data_t bsd; int nread; sdb_read_init( & rctx, tbl); while( (nread = sdb_read_data( & rctx, & bsd, 1)) > 0) { // restore data analysis switch( bsd.kind) { case BSD_INT: sdb_analyze_integer(tbl, bsd.content.i); break; case BSD_DOUBLE: sdb_analyze_noninteger(tbl, 1); break; default: sdb_analyze_noninteger(tbl, 0); break; } tbl->nwrittenbytes += nread; tbl->nwrittenobjects ++; } // printf( "exited with code %d, found %d objects encoded in %d bytes\n", // nread, tbl->nwrittenobjects, tbl->nwrittenbytes); sdb_read_close( & rctx); }
int sdb_raw( sdb_table_t *tbl, unsigned const char *serialized_cell, int length) { int r; if( tbl->state != SDB_ST_READING) return SDB_EBADSTATE; if( tbl->maxwrittenobjects && tbl->maxwrittenobjects >= tbl->nwrittenobjects) return SDB_EFULL; sdb_untrim( tbl); sdb_analyze_noninteger(tbl, 0); r = sdb_bss_writer( serialized_cell, length, tbl); if( r<0) { return 0; } else if( r != length) { return SDB_EINTERNAL; } else { tbl->nwrittenobjects++; return SDB_EOK; } }
// special case to handle 4 byte forced packing int sdb_double( sdb_table_t *tbl, double d) { int r; if( tbl->state != SDB_ST_READING) return SDB_EBADSTATE; if( tbl->maxwrittenobjects && tbl->maxwrittenobjects >= tbl->nwrittenobjects) return SDB_EFULL; sdb_untrim( tbl); if( tbl->columns[tbl->nwrittenobjects % tbl->ncolumns].serialization_method & SDB_SM_4_BYTES_FLOATS) { d = (double) (float) d; } sdb_analyze_noninteger(tbl, 1); r = bss_double(tbl->bss_ctx, d); if( r) { return r; } else { tbl->nwrittenobjects++; return SDB_EOK; } }