Changeset 196

Show
Ignore:
Timestamp:
10/12/06 22:35:52 (2 years ago)
Author:
ug
Message:

Changed GameList so as to keep the db connection open all the time.
Added resetFormat, getSGF methods. Slight changes to how the format
string works. Some minor bugs fixed.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • 06/libkombilo/Makefile

    r195 r196  
    22        g++ -o cpptest -lsqlite3 -lboost_filesystem cpptest.o search.o sgfparser.o abstractboard.o 
    33 
    4 cpptest.o: 
     4cpptest.o: cpptest.cc 
    55        g++ -c cpptest.cc 
    66 
  • 06/libkombilo/cpptest.cc

    r195 r196  
    88 
    99int main(int argc, char** argv) { 
     10  // ----------------- parse command line arguments --------------------------------- 
    1011  int algos = ALGO_FINALPOS | ALGO_MOVELIST | ALGO_HASH_FULL | ALGO_HASH_CORNER; 
    1112  bool process = false; 
     
    1617  } 
    1718 
     19  // ----------------- set up processing options ----------------------------------- 
    1820  ProcessOptions* p_op = new ProcessOptions; 
    1921  p_op->algos = ALGO_FINALPOS | ALGO_MOVELIST; 
    2022 
    21   GameList gl("t1.db", "id", "[[PW]] - [[PB]] ([[winner]]), [[filename.]]", 0); 
     23  // ----------------- create GameList instance ----------------------------------- 
     24  GameList gl("t1.db", "id", "[[PW]] - [[PB]] ([[winner]]), [[filename.]], ", 0); 
     25  delete p_op; 
    2226 
     27  // ---------------- process SGF games --------------------------------------------- 
    2328  if (process) { // process sgf's. must be first argument 
    2429    gl.start_processing(); 
     
    4954  printf("%d games.\n", gl.size()); 
    5055 
     56  // ------------------- set up search pattern ---------------------------------------- 
    5157  Pattern p(CORNER_NW_PATTERN,19,8,8,"...................X......X.......XO......OO...................."); 
    5258  // Pattern p(CORNER_NW_PATTERN,19,7,7,".................X.....X......XO.....OO.........."); 
     
    6167  // Pattern p(FULLBOARD_PATTERN, 19, 19, 19, ".....................O.O........OX......XO......X.OXX.XX...X,.OOXXX..OOOX.O....X.OXOOXOO..OX.......XOXXOXXOOXXOO....OX.XXXOOOXO.O.O...OXX..XOX..XO.X.XO...O.......X.....XO..O.,X....,.....XOO................X......X............X....O...........................................O.O...........O.....,.....X...........X.O.X............................................", contList); 
    6268  // Pattern p(FULLBOARD_PATTERN, 19, 19, 19, "..O.O....X...XXXXX.OOXO....OXO.XXOOOXOXXXXOO.OOXO.OXO..O..X.X..OOX,X.XO.O.....XOOOXOXX..XO......X.XOXXX..XXXO........XOX..XXOOXO.OOO.....OOXOXOO.O...XX...X..OXXOO.XOX........O..OX.,..X..X.....X...OX...X..........O....XXXO...XO...X...OOOXOOXX...X....O..OX.O..OX..........OXX....OX..OO..O.OOOOX..O.OX..XX..OOXXXOX.XOOX..X....XXXXXOX...OX.......X.O.XO............."); 
     69 
     70  // -------------------- set up search options ---------------------------------- 
    6371  SearchOptions so; 
    6472  // so.searchInVariations = false; 
     73   
     74  // -------------------- do pattern search -------------------------------------- 
    6575  gl.search(p, &so); 
     76 
     77  // ------------------- print some information about current list of games ------------ 
    6678  printf("num games: %d, num hits: %d\n", gl.size(), gl.numHits()); 
    6779  // vector<string> res = gl.currentEntriesAsStrings(); 
     
    6981  //   printf("%s\n", it->c_str()); 
    7082  for(int i=0; i<gl.size(); i++) printf("%s\n", gl.currentEntryAsString(i).c_str()); 
     83 
     84  // ------------------- print some statistics ------------------------------------------ 
    7185  printf("Search pattern:\n"); 
    7286  printf("%s\n", p.printPattern().c_str()); 
     
    90104    } 
    91105  } 
     106 
     107  // ------------------- resetFormat ------------------------------------------ 
     108  gl.resetFormat("pb"); 
     109  vector<string> res = gl.currentEntriesAsStrings(0, 40); 
     110  for(vector<string>::iterator it = res.begin(); it != res.end(); it++) 
     111    printf("%s\n", it->c_str()); 
    92112} 
  • 06/libkombilo/search.cc

    r195 r196  
    32933293int dbinfo_callback(void *s, int argc, char **argv, char **asColName) { 
    32943294  char** cpp = (char**)s; 
    3295   if (argc && argv[0] && argv[0]) { 
     3295  if (argc && argv[0]) { 
    32963296    // printf("dbi_cb %s\n", argv[0]); 
    3297     *cpp = new char[strlen(argv[0]+1)]; 
     3297    *cpp = new char[strlen(argv[0])+1]; 
    32983298    strcpy(*cpp, argv[0]); 
    32993299  } 
     
    33083308 
    33093309  // try to retrieve basic options from database 
    3310   sqlite3* db; 
    33113310  int rc = sqlite3_open(dbname, &db);  
    33123311  if (rc) { 
     
    33253324    // printf("dbinfo: %s\n", dbinfo); 
    33263325    p_op = new ProcessOptions(dbinfo); 
     3326    delete [] dbinfo; 
    33273327    char* bsizes = 0; 
    33283328    rc = sqlite3_exec(db, "select * from db_info where rowid = 2;", dbinfo_callback, &bsizes, 0); 
     
    33313331      // printf("board sizes %s\n", bsizes); // should be a comma-sep. list of integers *ending w/ a comma* 
    33323332      string bsizes_str(bsizes); 
     3333      delete [] bsizes; 
    33333334      unsigned int p = 0; 
    33343335      unsigned int pn = bsizes_str.find(",",p); 
     
    33553356    if (rc != SQLITE_OK) throw DBError(); 
    33563357  } 
    3357   rc = sqlite3_close(db); 
    3358   if (rc != SQLITE_OK) throw DBError(); 
    3359   db = 0; 
    3360  
    3361   // printf("parse the FORMAT string\n"); 
     3358  // rc = sqlite3_close(db); 
     3359  // if (rc != SQLITE_OK) throw DBError(); 
     3360  // db = 0; 
     3361 
     3362 
     3363  // printf("set up Algorithm instances\n"); 
     3364  for(vector<int>::iterator it = boardsizes.begin(); it != boardsizes.end(); it++) 
     3365    addAlgos(*it); 
     3366  all = 0; 
     3367  currentList = oldList = 0; 
     3368  readDBs = 0; 
     3369  resetFormat(ORDERBY, FORMAT); 
     3370
     3371 
     3372void GameList::resetFormat(string ORDERBY, string FORMAT) { 
     3373  // printf("enter resetFormat\n"); 
    33623374  if (FORMAT == "") { // use default format string 
    33633375    numColumns = 5; 
    33643376    format1 = "id,re,pw,pb,dt"; 
    3365     format2 = "[[2 - [[3 ([[W), [[4"; 
     3377    format2 = "[[2 - [[3 ([[W), [[4, "; 
    33663378  } else { 
    33673379    char buf[10]; 
     
    33943406  if (ORDERBY == "" || ORDERBY == "id" || ORDERBY == "ID" || ORDERBY == "Id" || ORDERBY == "iD") orderby = "id"; 
    33953407  else orderby = ORDERBY + ",id"; 
    3396  
    3397   // printf("set up Algorithm instances\n"); 
    3398   for(vector<int>::iterator it = boardsizes.begin(); it != boardsizes.end(); it++) 
    3399     addAlgos(*it); 
    3400   all = 0; 
    3401   currentList = oldList = 0; 
     3408  // printf("finished parsing\n"); 
     3409 
    34023410  readDB(); 
    34033411} 
     3412 
    34043413 
    34053414void GameList::addAlgos(int bs) { 
     
    34363445  oldList = 0; 
    34373446   
    3438   db = 0; 
    3439   int rc = sqlite3_open(dbname, &db); 
    3440   if (rc) { 
    3441     fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
    3442     sqlite3_close(db); 
    3443     db = 0; 
    3444     throw DBError(); 
    3445   } 
     3447  int rc; 
     3448  // db = 0; 
     3449  // rc = sqlite3_open(dbname, &db); 
     3450  // if (rc) { 
     3451  //   fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
     3452  //   sqlite3_close(db); 
     3453  //   db = 0; 
     3454  //   throw DBError(); 
     3455  // } 
    34463456  rc = sqlite3_busy_timeout(db, 200); 
    34473457  if (rc) throw DBError(); 
     
    34633473    throw DBError();  
    34643474  } 
     3475  // printf("read.\n"); 
    34653476  // SQLITE_ERROR may occur since table might not yet exist 
    34663477   
    3467   if (rc == SQLITE_OK) { 
     3478  if (rc == SQLITE_OK && !readDBs) { 
    34683479    for(unsigned int a=0; a < 20*boardsizes.size(); a++) { 
    3469       if (a >= algo_ps.size()) printf("ouch\n"); 
    34703480      if (algo_ps[a]) algo_ps[a]->readDB(db); 
    34713481    } 
     
    34743484  rc = sqlite3_exec(db, "commit;", 0, 0, 0); 
    34753485  if (rc != SQLITE_OK) throw DBError(); 
    3476  
    3477   rc = sqlite3_close(db); 
    3478   if (rc != SQLITE_OK) throw DBError(); 
    3479   db = 0; 
     3486  // printf("read.\n"); 
     3487 
     3488  // rc = sqlite3_close(db); 
     3489  // if (rc != SQLITE_OK) throw DBError(); 
     3490  // db = 0; 
    34803491  reset(); 
    34813492  // printf("leave readDB\n"); 
     
    34973508  for(int i=0; i<20; i++)  
    34983509    if (algo_ps[i]) delete algo_ps[i]; 
     3510  if (db) sqlite3_close(db); 
     3511  db = 0; 
    34993512  // printf("leave ~GameList\n"); 
    35003513} 
     
    36353648} 
    36363649 
    3637 void GameList::resetFormat(char* FORMAT, char* ORDERBY) { 
    3638   // FIXME 
    3639 } 
    3640  
    36413650int gis_callback(void *gl, int argc, char **argv, char **azColName) { 
    36423651  if (!argc) throw DBError(); 
     
    37233732  if (start>end || end > (int)currentList->size()) return result; 
    37243733  for(int i=start; i<end; i++) { 
    3725     result.push_back((*all)[(*currentList)[i].second]->gameInfoStr + ", " + resultsStr((*all)[(*currentList)[i].second])); 
     3734    result.push_back((*all)[(*currentList)[i].second]->gameInfoStr + resultsStr((*all)[(*currentList)[i].second])); 
    37263735  } 
    37273736  return result; 
     
    37303739string GameList::currentEntryAsString(int i) { 
    37313740  if (i < 0 || i >= (int)currentList->size()) return ""; 
    3732   else return (*all)[(*currentList)[i].second]->gameInfoStr + ", " + resultsStr((*all)[(*currentList)[i].second]); 
     3741  else return (*all)[(*currentList)[i].second]->gameInfoStr + resultsStr((*all)[(*currentList)[i].second]); 
     3742
     3743 
     3744int getsgfcallback(void *s, int argc, char **argv, char **azColName) { 
     3745  char** sgf = (char**)s; 
     3746  if (argc && argv[0]) { 
     3747    *sgf = new char[strlen(argv[0])+1]; 
     3748    strcpy(*sgf, argv[0]); 
     3749  } 
     3750  return 0; 
     3751
     3752 
     3753string GameList::getSGF(int i) { 
     3754  if (i < 0 || i >= (int)currentList->size()) return ""; 
     3755  int index = (*currentList)[i].second; 
     3756  // int rc = sqlite3_open(dbname, &db);  
     3757  // if (rc) { 
     3758  //   sqlite3_close(db); 
     3759  //   db = 0; 
     3760  //   throw DBError(); 
     3761  // } 
     3762  char* sgf = 0; 
     3763  char sql[200]; 
     3764  sprintf(sql, "select sgf from games where id = %d;", index); 
     3765  // printf("%s\n", sql); 
     3766  sqlite3_exec(db, sql, getsgfcallback, &sgf, 0); 
     3767 
     3768  // sqlite3_close(db); 
     3769  // db = 0; 
     3770 
     3771  if (!sgf) return ""; 
     3772  string sgf_str(sgf); 
     3773  delete [] sgf; 
     3774  return sgf_str; 
    37333775} 
    37343776 
     
    37393781  sizeX = pattern.sizeX; // need this in lookupLabel 
    37403782  PatternList pl(pattern, searchOptions->fixedColor, searchOptions->nextMove); 
    3741   sqlite3* db
    3742   int rc = sqlite3_open(dbname, &db);  
    3743   if (rc) { 
    3744     sqlite3_close(db); 
    3745     db = 0; 
    3746     throw DBError(); 
    3747  
     3783  int rc
     3784  // rc = sqlite3_open(dbname, &db);  
     3785  // if (rc) { 
     3786  //   sqlite3_close(db); 
     3787  //   db = 0; 
     3788  //   throw DBError(); 
     3789  //
    37483790  rc = sqlite3_exec(db, "pragma synchronous = off;", 0, 0, 0); 
    37493791  if (rc) throw DBError(); 
     
    37903832    } 
    37913833  } 
    3792   sqlite3_close(db); 
    3793   db = 0; 
     3834  // sqlite3_close(db); 
     3835  // db = 0; 
    37943836  if (labels) delete [] labels; 
    37953837  labels = pl.sortContinuations(); 
     
    38323874  } 
    38333875  sql_ins_rnp += p_op->rootNodeTags + ") values (" + question_marks + ");"; 
    3834   int rc = sqlite3_open(dbname, &db);  
    3835   if (rc) { 
    3836     sqlite3_close(db); 
    3837     db = 0; 
    3838     throw DBError(); 
    3839   } 
     3876  int rc; 
     3877  // rc = sqlite3_open(dbname, &db);  
     3878  // if (rc) { 
     3879  //   sqlite3_close(db); 
     3880  //   db = 0; 
     3881  //   throw DBError(); 
     3882  // } 
    38403883  string sql1 = "create table if not exists GAMES ( id integer primary key, path text, filename text, pos integer default 0, duplicate integer, date date"; 
    38413884  if (p_op->sgfInDB) sql1 += ", sgf text"; 
     
    38863929  rc = sqlite3_exec(db, sql.c_str(), 0, 0, 0); 
    38873930  if (rc != SQLITE_OK) throw DBError(); 
    3888   sqlite3_close(db); 
    3889   db = 0; 
     3931  // sqlite3_close(db); 
     3932  // db = 0; 
     3933  readDBs = 0; 
    38903934  readDB(); 
    38913935  delete tags; 
  • 06/libkombilo/search.h

    r195 r196  
    593593     
    594594    void reset(); // reset currentList to all 
    595     void resetFormat(char* FORMAT, char* ORDERBY); // NOT YET IMPLEMENTED 
     595    void resetFormat(std::string ORDERBY="", std::string FORMAT=""); 
    596596    void gisearch(char* sql) throw(DBError); 
    597597    int size(); 
     
    599599    std::string currentEntryAsString(int i); 
    600600    std::vector<std::string> currentEntriesAsStrings(int start=0, int end=0); 
     601    std::string getSGF(int i); 
    601602    int numHits(); 
    602603 
     
    623624    void readDB() throw(DBError); 
    624625    void addAlgos(int bs); 
     626    void parseFormatString(std::string ORDERBY, std::string FORMAT); 
    625627    int posDT; // used when parsing the DT field during processing 
    626628    int posSZ; // used when parsing the SZ field during processing 
  • 06/libkombilo/testhash.py

    r195 r196  
    66from libkombilo import * 
    77 
    8 gl = GameList('t1.db', '', '[[PW]] - [[PB]] ([[winner]]), [[filename]]') 
     8gl = GameList('t1.db', '', '[[PW]] - [[PB]] ([[winner]]), [[filename]], ') 
    99print gl.size(), 'games in the database' 
    1010 
  • 06/libkombilo/testsearch.py

    r195 r196  
    3939                  (gl.lookupLabel(x,y), cont.B, cont.wB, cont.lB, cont.W, cont.wW, cont.lW) 
    4040print 'This search took %.2f seconds.' % (end - start) 
    41 sys.exit() 
    4241 
    4342p = Pattern(CENTER_PATTERN, 19, 2, 2, 'XO' + 'OX')  
     
    4948print 'This search took %.2f seconds.' % (end - start) 
    5049 
     50print 'SGF of last game' 
     51print gl.getSGF(gl.size()-1) 
    5152