Index: heromesh.h ================================================================== --- heromesh.h +++ heromesh.h @@ -40,10 +40,11 @@ extern xrm_quark optionquery[16]; extern Uint32 generation_number; extern char main_options[128]; unsigned char*read_lump(int sol,int lvl,long*sz,sqlite3_value**us); +void write_lump(int sol,int lvl,long sz,const unsigned char*data); void set_cursor(int id); #define FIL_SOLUTION 1 #define FIL_LEVEL 0 #define LUMP_LEVEL_IDX (-1) Index: main.c ================================================================== --- main.c +++ main.c @@ -173,10 +173,26 @@ if(us) *us=0; } sqlite3_reset(readusercachest); return buf; } + +void write_lump(int sol,int lvl,long sz,const unsigned char*data) { + // Writes a lump to the user cache. + // The actual Hamster archive files will be updated when the program terminates. + sqlite3_stmt*st; + int e; + if(e=sqlite3_prepare_v2(userdb,"INSERT INTO `USERCACHEDATA`(`FILE`,`LEVEL`,`NAME`,`DATA`) VALUES(?1,?2,CASE WHEN ?2 < 0 THEN ?3 ELSE ?2 || ?3 END,?4)" + " ON CONFLICT(`FILE`,`LEVEL`) DO UPDATE SET `DATA` = ?4;",-1,&st,0)) fatal("SQL error (%d): %s\n",e,sqlite3_errmsg(userdb)); + sqlite3_bind_int64(st,1,sol?solutionuc:leveluc); + sqlite3_bind_int(st,2,lvl); + sqlite3_bind_text(st,3,lvl==LUMP_CLASS_DEF?"CLASS.DEF":lvl==LUMP_LEVEL_IDX?"LEVEL.IDX":sol?".SOL":".LVL",-1,SQLITE_STATIC); + sqlite3_bind_blob64(st,4,data,sz,0); + while((e=sqlite3_step(st))==SQLITE_ROW); + if(e!=SQLITE_DONE) fatal("SQL error (%d): %s\n",e,sqlite3_errmsg(userdb)); + sqlite3_finalize(st); +} static void init_usercache(void) { sqlite3_stmt*st; int z; sqlite3_int64 t1,t2;