modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/lsm1/lsm-test/lsmtest9.c (about)

     1  
     2  #include "lsmtest.h"
     3  
     4  #define DATA_SEQUENTIAL TEST_DATASOURCE_SEQUENCE
     5  #define DATA_RANDOM     TEST_DATASOURCE_RANDOM
     6  
     7  typedef struct Datatest4 Datatest4;
     8  
     9  /*
    10  ** Test overview:
    11  **
    12  **   1. Insert (Datatest4.nRec) records into a database.
    13  **
    14  **   2. Repeat (Datatest4.nRepeat) times:
    15  **
    16  **      2a. Delete 2/3 of the records in the database.
    17  **
    18  **      2b. Run lsm_work(nMerge=1).
    19  **
    20  **      2c. Insert as many records as were deleted in 2a.
    21  **
    22  **      2d. Check database content is as expected.
    23  **
    24  **      2e. If (Datatest4.bReopen) is true, close and reopen the database.
    25  */
    26  struct Datatest4 {
    27    /* Datasource definition */
    28    DatasourceDefn defn;
    29  
    30    int nRec;
    31    int nRepeat;
    32    int bReopen;
    33  };
    34  
    35  static void doDataTest4(
    36    const char *zSystem,            /* Database system to test */
    37    Datatest4 *p,                   /* Structure containing test parameters */
    38    int *pRc                        /* OUT: Error code */
    39  ){
    40    lsm_db *db = 0;
    41    TestDb *pDb;
    42    TestDb *pControl;
    43    Datasource *pData;
    44    int i;
    45    int rc = 0;
    46    int iDot = 0;
    47    int bMultiThreaded = 0;         /* True for MT LSM database */
    48  
    49    int nRecOn3 = (p->nRec / 3);
    50    int iData = 0;
    51  
    52    /* Start the test case, open a database and allocate the datasource. */
    53    rc = testControlDb(&pControl);
    54    pDb = testOpen(zSystem, 1, &rc);
    55    pData = testDatasourceNew(&p->defn);
    56    if( rc==0 ){
    57      db = tdb_lsm(pDb);
    58      bMultiThreaded = tdb_lsm_multithread(pDb);
    59    }
    60  
    61    testWriteDatasourceRange(pControl, pData, iData, nRecOn3*3, &rc);
    62    testWriteDatasourceRange(pDb,      pData, iData, nRecOn3*3, &rc);
    63  
    64    for(i=0; rc==0 && i<p->nRepeat; i++){
    65  
    66      testDeleteDatasourceRange(pControl, pData, iData, nRecOn3*2, &rc);
    67      testDeleteDatasourceRange(pDb,      pData, iData, nRecOn3*2, &rc);
    68  
    69      if( db ){
    70        int nDone;
    71  #if 0
    72        fprintf(stderr, "lsm_work() start...\n"); fflush(stderr);
    73  #endif
    74        do {
    75          nDone = 0;
    76          rc = lsm_work(db, 1, (1<<30), &nDone);
    77        }while( rc==0 && nDone>0 );
    78        if( bMultiThreaded && rc==LSM_BUSY ) rc = LSM_OK;
    79  #if 0 
    80        fprintf(stderr, "lsm_work() done...\n"); fflush(stderr);
    81  #endif
    82      }
    83  
    84  if( i+1<p->nRepeat ){
    85      iData += (nRecOn3*2);
    86      testWriteDatasourceRange(pControl, pData, iData+nRecOn3, nRecOn3*2, &rc);
    87      testWriteDatasourceRange(pDb,      pData, iData+nRecOn3, nRecOn3*2, &rc);
    88  
    89      testCompareDb(pData, nRecOn3*3, iData, pControl, pDb, &rc);
    90  
    91      /* If Datatest4.bReopen is true, close and reopen the database */
    92      if( p->bReopen ){
    93        testReopen(&pDb, &rc);
    94        if( rc==0 ) db = tdb_lsm(pDb);
    95      }
    96  }
    97  
    98      /* Update the progress dots... */
    99      testCaseProgress(i, p->nRepeat, testCaseNDot(), &iDot);
   100    }
   101  
   102    testClose(&pDb);
   103    testClose(&pControl);
   104    testDatasourceFree(pData);
   105    testCaseFinish(rc);
   106    *pRc = rc;
   107  }
   108  
   109  static char *getName4(const char *zSystem, Datatest4 *pTest){
   110    char *zRet;
   111    char *zData;
   112    zData = testDatasourceName(&pTest->defn);
   113    zRet = testMallocPrintf("data4.%s.%s.%d.%d.%d", 
   114        zSystem, zData, pTest->nRec, pTest->nRepeat, pTest->bReopen
   115    );
   116    testFree(zData);
   117    return zRet;
   118  }
   119  
   120  void test_data_4(
   121    const char *zSystem,            /* Database system name */
   122    const char *zPattern,           /* Run test cases that match this pattern */
   123    int *pRc                        /* IN/OUT: Error code */
   124  ){
   125    Datatest4 aTest[] = {
   126        /* defn,                                 nRec, nRepeat, bReopen */
   127      { {DATA_RANDOM,     20,25,     500,600}, 10000,      10,       0   },
   128      { {DATA_RANDOM,     20,25,     500,600}, 10000,      10,       1   },
   129    };
   130  
   131    int i;
   132  
   133    for(i=0; *pRc==LSM_OK && i<ArraySize(aTest); i++){
   134      char *zName = getName4(zSystem, &aTest[i]);
   135      if( testCaseBegin(pRc, zPattern, "%s", zName) ){
   136        doDataTest4(zSystem, &aTest[i], pRc);
   137      }
   138      testFree(zName);
   139    }
   140  }
   141  
   142  
   143