Overview
Comment: | Correct a few things in the file handling; make it read/write by default, but add a read-only option |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
ea3c873bb0dd8af5648b8770febf49be |
User & Date: | user on 2020-12-19 07:12:41 |
Other Links: | manifest | tags |
Context
2020-12-19
| ||
22:21 | Fix a mistake in the beginning phase in exec.c check-in: 99bee720be user: user tags: trunk | |
07:12 | Correct a few things in the file handling; make it read/write by default, but add a read-only option check-in: ea3c873bb0 user: user tags: trunk | |
05:47 | Add documentation about command-line arguments check-in: cb27aaf96b user: user tags: trunk | |
Changes
Modified commandline.doc from [7edcb5b597] to [4eca270fe2].
︙ | ︙ | |||
35 36 37 38 39 40 41 42 43 44 45 46 47 48 | -e Start in the editor instead of game. -n (not implemented yet) Create a new puzzle set. -t Enable tracing. -v More verbose error logging. -x | > > > | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | -e Start in the editor instead of game. -n (not implemented yet) Create a new puzzle set. -r Open in read-only mode. -t Enable tracing. -v More verbose error logging. -x |
︙ | ︙ |
Modified main.c from [4316790edd] to [0ebe47f999].
︙ | ︙ | |||
141 142 143 144 145 146 147 | sqlite3_bind_int(readusercachest,2,lvl); if(sqlite3_step(readusercachest)==SQLITE_ROW) { if(us) *us=sqlite3_value_dup(sqlite3_column_value(readusercachest,6)); if(sqlite3_column_type(readusercachest,5)==SQLITE_BLOB) { const unsigned char*con=sqlite3_column_blob(readusercachest,5); *sz=sqlite3_column_bytes(readusercachest,5); buf=malloc(*sz); | | | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | sqlite3_bind_int(readusercachest,2,lvl); if(sqlite3_step(readusercachest)==SQLITE_ROW) { if(us) *us=sqlite3_value_dup(sqlite3_column_value(readusercachest,6)); if(sqlite3_column_type(readusercachest,5)==SQLITE_BLOB) { const unsigned char*con=sqlite3_column_blob(readusercachest,5); *sz=sqlite3_column_bytes(readusercachest,5); buf=malloc(*sz); if(*sz && !buf) fatal("Allocation failed\n"); memcpy(buf,con,*sz); } else { FILE*fp=sol?solutionfp:levelfp; rewind(fp); fseek(fp,sqlite3_column_int64(readusercachest,4)-4,SEEK_SET); *sz=fgetc(fp)<<16; *sz|=fgetc(fp)<<24; *sz|=fgetc(fp); *sz|=fgetc(fp)<<8; if(feof(fp) || *sz<0) fatal("Invalid Hamster archive\n"); |
︙ | ︙ | |||
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 | ofs[i++]=sqlite3_column_int64(st,0); if(sqlite3_column_type(st,1)!=SQLITE_TEXT || sqlite3_column_type(st,2)!=SQLITE_BLOB) fatal("Corrupted user cache database (NAME and DATA columns have wrong types)\n"); fwrite(sqlite3_column_text(st,1),1,sqlite3_column_bytes(st,1)+1,fp); j=sqlite3_column_bytes(st,2); fputc(j>>16,fp); fputc(j>>24,fp); fputc(j,fp); fputc(j>>8,fp); ofs[i++]=ftell(fp); fwrite(sqlite3_column_blob(st,2),1,j,fp); } if(e!=SQLITE_DONE) fatal("SQL error (%d): %s\n",e,sqlite3_errmsg(userdb)); if(ftruncate(fd,ftell(fp))) fatal("I/O error: %m\n"); sqlite3_finalize(st); if(e=sqlite3_prepare_v2(userdb,"UPDATE `USERCACHEDATA` SET `OFFSET` = ?2 WHERE `ID` = ?1;",-1,&st,0)) fatal("SQL error (%d): %s\n",e,sqlite3_errmsg(userdb)); i=0; while(i<c) { sqlite3_reset(st); sqlite3_bind_int64(st,1,ofs[i++]); sqlite3_bind_int64(st,2,ofs[i++]); | > > | 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 | ofs[i++]=sqlite3_column_int64(st,0); if(sqlite3_column_type(st,1)!=SQLITE_TEXT || sqlite3_column_type(st,2)!=SQLITE_BLOB) fatal("Corrupted user cache database (NAME and DATA columns have wrong types)\n"); fwrite(sqlite3_column_text(st,1),1,sqlite3_column_bytes(st,1)+1,fp); j=sqlite3_column_bytes(st,2); fputc(j>>16,fp); fputc(j>>24,fp); fputc(j,fp); fputc(j>>8,fp); ofs[i++]=ftell(fp); fwrite(sqlite3_column_blob(st,2),1,j,fp); if(ferror(fp)) fatal("I/O error: %m\n"); } if(e!=SQLITE_DONE) fatal("SQL error (%d): %s\n",e,sqlite3_errmsg(userdb)); if(ftruncate(fd,ftell(fp))) fatal("I/O error: %m\n"); rewind(fp); sqlite3_finalize(st); if(e=sqlite3_prepare_v2(userdb,"UPDATE `USERCACHEDATA` SET `OFFSET` = ?2 WHERE `ID` = ?1;",-1,&st,0)) fatal("SQL error (%d): %s\n",e,sqlite3_errmsg(userdb)); i=0; while(i<c) { sqlite3_reset(st); sqlite3_bind_int64(st,1,ofs[i++]); sqlite3_bind_int64(st,2,ofs[i++]); |
︙ | ︙ | |||
436 437 438 439 440 441 442 | fprintf(stderr,"Initializing user cache...\n"); if(z=sqlite3_exec(userdb,"BEGIN;",0,0,0)) fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); if(z=sqlite3_prepare_v2(userdb,"SELECT `ID`, `TIME` FROM `USERCACHEINDEX` WHERE `NAME` = ?1;",-1,&st,0)) fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); nam1=sqlite3_mprintf("%s.level",basefilename); if(!nam1) fatal("Allocation failed\n"); nam2=realpath(nam1,0); if(!nam2) fatal("Cannot find real path of '%s': %m\n",nam1); | | | | | < | 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 | fprintf(stderr,"Initializing user cache...\n"); if(z=sqlite3_exec(userdb,"BEGIN;",0,0,0)) fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); if(z=sqlite3_prepare_v2(userdb,"SELECT `ID`, `TIME` FROM `USERCACHEINDEX` WHERE `NAME` = ?1;",-1,&st,0)) fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); nam1=sqlite3_mprintf("%s.level",basefilename); if(!nam1) fatal("Allocation failed\n"); nam2=realpath(nam1,0); if(!nam2) fatal("Cannot find real path of '%s': %m\n",nam1); levelfp=fopen(nam2,main_options['r']?"r":"r+"); if(!levelfp) fatal("Cannot open '%s' for reading%s: %m\n",nam2,main_options['r']?"":"/writing"); sqlite3_free(nam1); sqlite3_bind_text(st,1,nam2,-1,0); z=sqlite3_step(st); if(z==SQLITE_ROW) { leveluc=sqlite3_column_int64(st,0); t1=sqlite3_column_int64(st,1); } else if(z==SQLITE_DONE) { leveluc=t1=-1; } else { fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); } sqlite3_reset(st); nam1=sqlite3_mprintf("%s.solution",basefilename); if(!nam1) fatal("Allocation failed\n"); nam3=realpath(nam1,0); if(!nam3) fatal("Cannot find real path of '%s': %m\n",nam1); if(!strcmp(nam2,nam3)) fatal("Level and solution files seem to be the same file\n"); solutionfp=fopen(nam3,main_options['r']?"r":"r+"); if(!solutionfp) fatal("Cannot open '%s' for reading%s: %m\n",nam3,main_options['r']?"":"/writing"); sqlite3_free(nam1); sqlite3_bind_text(st,1,nam3,-1,0); z=sqlite3_step(st); if(z==SQLITE_ROW) { solutionuc=sqlite3_column_int64(st,0); t2=sqlite3_column_int64(st,1); } else if(z==SQLITE_DONE) { solutionuc=t2=-1; } else { fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); } sqlite3_finalize(st); if(stat(nam2,&fst)) fatal("Unable to stat '%s': %m\n",nam2); if(!fst.st_size) fatal("File '%s' has zero size\n",nam2); if(fst.st_mtime>t1 || fst.st_ctime>t1) leveluc=reset_usercache(levelfp,nam2,&fst,".LVL"); if(stat(nam3,&fst)) fatal("Unable to stat '%s': %m\n",nam3); if(fst.st_mtime>t2 || fst.st_ctime>t2) solutionuc=reset_usercache(solutionfp,nam3,&fst,".SOL"); free(nam2); free(nam3); if(z=sqlite3_prepare_v3(userdb,"SELECT * FROM `USERCACHEDATA` WHERE `FILE` = ?1 AND `LEVEL` = ?2;",-1,SQLITE_PREPARE_PERSISTENT,&readusercachest,0)) { fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); } if(z=sqlite3_exec(userdb,"COMMIT;",0,0,0)) fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); |
︙ | ︙ |