static void vg_db_commit( vg_db *db, FILE *fwal )
{
void *temp_page = malloc( VG_PAGE_SIZE );
-
- vg_info( "Commiting WAL...\n" );
u64 last_good_checkpoint = 0,
last_good_log = 0;
/* read one log */
if( !fread( &log, sizeof(log), 1, fwal ) )
- {
- vg_info( "Reached end of log\n" );
break;
- }
if( log.type == k_wal_log_data )
{
void vg_db_open( vg_db *db, const char *path, const char *wal_path )
{
u32 k_ident = 0xf32b1a00;
- vg_rand_seed( &db->rand, k_ident + time(NULL) );
+ vg_rand_seed( &db->rand, k_ident
+#ifndef DB_PREDICTABLE
+ + time(NULL)
+#else
+#warning PREDICTABLE DB MODE ( DEBUGGING ONLY )
+#endif
+ );
db->fp = fopen( path, "rb+" );
db->fp_wal = NULL;
FILE *fwal = fopen( wal_path, "rb" );
if( fwal )
{
- vg_info( "WAL file found (%s), need to apply.\n", wal_path );
vg_db_commit( db, fwal );
fclose( fwal );
remove( wal_path );
vg_db_page *page = &db->page_cache[ cache_id-1 ];
if( page->unwritten )
{
+ //vg_low( "Syncing page @0x%lx to disk\n", page->physical_offset );
if( fseek( db->fp, page->physical_offset, SEEK_SET ) )
vg_db_abort( db, "SEEK_SET(%lx) failed\n", page->physical_offset );
void *page_data = db->page_data + (u64)(cache_id-1)*VG_PAGE_SIZE;
before = current;
current = db->page_cache[ current-1 ].hash_prev;
}
- if( before )
- db->page_cache[ before-1 ].hash_prev = page->hash_prev;
- else
- db->hash_table[ old_hash ] = 0;
+ if( before ) db->page_cache[ before-1 ].hash_prev = page->hash_prev;
+ else db->hash_table[ old_hash ] = page->hash_prev;
}
page->hash_prev = db->hash_table[ hash ];
db->hash_table[ hash ] = cache_id;
if( db->wal_writes > 1000 )
{
- vg_info( "WAL reached %u writes (>1000), flushing...\n", db->wal_writes );
vg_db_commit( db, db->fp_wal );
fclose( db->fp_wal );
remove( db->wal_path );