int mercdb_txt_sync(void) { FILE *fp; int lock; if( !merc_db ) return 1; if( (fp = lock_fopen(merc_txt, &lock)) == NULL ) { printf("mercdb_txt_sync: can't write [%s] !!! data is lost !!!\n", merc_txt); return 1; } numdb_foreach(merc_db, mercdb_txt_sync_sub, fp); lock_fclose(fp, merc_txt, &lock); #ifdef TXT_JOURNAL if( merc_journal_enable ) { // コミットしたのでジャーナルを新規作成する journal_final( &merc_journal ); journal_create( &merc_journal, sizeof(struct mmo_mercstatus), merc_journal_cache, merc_journal_file ); } #endif return 0; }
int storagedb_txt_sync(void) { FILE *fp; int lock; if( !storage_db ) return 1; if( (fp = lock_fopen(storage_txt, &lock)) == NULL ) { printf("storagedb_txt_sync: can't write [%s] !!! data is lost !!!\n", storage_txt); return 1; } numdb_foreach(storage_db, storagedb_txt_sync_sub, fp); lock_fclose(fp, storage_txt, &lock); #ifdef TXT_JOURNAL if( storage_journal_enable ) { // コミットしたのでジャーナルを新規作成する journal_final( &storage_journal ); journal_create( &storage_journal, sizeof(struct storage), storage_journal_cache, storage_journal_file ); } #endif return 0; }
void mercdb_txt_final(void) { if(merc_db) numdb_final(merc_db, mercdb_txt_final_sub); #ifdef TXT_JOURNAL if( merc_journal_enable ) { journal_final( &merc_journal ); } #endif }
/*========================================== * 傭兵データファイルの読み込み *------------------------------------------ */ static bool mercdb_txt_read(void) { FILE *fp; bool ret = true; merc_db = numdb_init(); if((fp = fopen(merc_txt, "r")) == NULL) { printf("mercdb_txt_read: open [%s] failed !\n", merc_txt); ret = false; } else { int count = 0; char line[8192]; while(fgets(line, sizeof(line), fp)) { struct mmo_mercstatus *m = (struct mmo_mercstatus *)aCalloc(1, sizeof(struct mmo_mercstatus)); if(merc_fromstr(line, m) == 0 && m->merc_id > 0) { if(m->merc_id >= merc_newid) merc_newid = m->merc_id + 1; numdb_insert(merc_db, m->merc_id, m); } else { printf("int_merc: broken data [%s] line %d\n", merc_txt, count); aFree(m); } count++; } fclose(fp); } #ifdef TXT_JOURNAL if( merc_journal_enable ) { // ジャーナルデータのロールフォワード if( journal_load( &merc_journal, sizeof(struct mmo_mercstatus), merc_journal_file ) ) { int c = journal_rollforward( &merc_journal, merc_journal_rollforward ); printf("int_merc: journal: roll-forward (%d)\n", c ); // ロールフォワードしたので、txt データを保存する ( journal も新規作成される) mercdb_txt_sync(); } else { // ジャーナルを新規作成する journal_final( &merc_journal ); journal_create( &merc_journal, sizeof(struct mmo_mercstatus), merc_journal_cache, merc_journal_file ); } } #endif return ret; }
/*========================================== * アカウント変数の読み込み *------------------------------------------ */ static bool accregdb_txt_read(void) { FILE *fp; bool ret = true; accreg_db = numdb_init(); if((fp = fopen(accreg_txt, "r")) == NULL) { printf("accregdb_txt_read: open [%s] failed !\n", accreg_txt); ret = false; } else { int count = 0; char line[8192]; while(fgets(line, sizeof(line), fp)) { struct accreg *reg = (struct accreg *)aCalloc(1, sizeof(struct accreg)); if(accregdb_fromstr(line, reg) == 0 && reg->account_id > 0) { numdb_insert(accreg_db, reg->account_id, reg); } else { printf("inter: accreg: broken data [%s] line %d\n", accreg_txt, count); aFree(reg); } count++; } fclose(fp); } #ifdef TXT_JOURNAL if( accreg_journal_enable ) { // ジャーナルデータのロールフォワード if( journal_load( &accreg_journal, sizeof(struct accreg), accreg_journal_file ) ) { int c = journal_rollforward( &accreg_journal, accregdb_journal_rollforward ); printf("inter: accreg_journal: roll-forward (%d)\n", c ); // ロールフォワードしたので、txt データを保存する ( journal も新規作成される) accregdb_txt_sync(); } else { // ジャーナルを新規作成する journal_final( &accreg_journal ); journal_create( &accreg_journal, sizeof(struct accreg), accreg_journal_cache, accreg_journal_file ); } } #endif return ret; }