1 
2 #include "lsmtest.h"
3 
4 
do_work(int nArg,char ** azArg)5 int do_work(int nArg, char **azArg){
6   struct Option {
7     const char *zName;
8   } aOpt [] = {
9     { "-nmerge" },
10     { "-nkb" },
11     { 0 }
12   };
13 
14   lsm_db *pDb;
15   int rc;
16   int i;
17   const char *zDb;
18   int nMerge = 1;
19   int nKB = (1<<30);
20 
21   if( nArg==0 ) goto usage;
22   zDb = azArg[nArg-1];
23   for(i=0; i<(nArg-1); i++){
24     int iSel;
25     rc = testArgSelect(aOpt, "option", azArg[i], &iSel);
26     if( rc ) return rc;
27     switch( iSel ){
28       case 0:
29         i++;
30         if( i==(nArg-1) ) goto usage;
31         nMerge = atoi(azArg[i]);
32         break;
33       case 1:
34         i++;
35         if( i==(nArg-1) ) goto usage;
36         nKB = atoi(azArg[i]);
37         break;
38     }
39   }
40 
41   rc = lsm_new(0, &pDb);
42   if( rc!=LSM_OK ){
43     testPrintError("lsm_open(): rc=%d\n", rc);
44   }else{
45     rc = lsm_open(pDb, zDb);
46     if( rc!=LSM_OK ){
47       testPrintError("lsm_open(): rc=%d\n", rc);
48     }else{
49       int n = -1;
50       lsm_config(pDb, LSM_CONFIG_BLOCK_SIZE, &n);
51       n = n*2;
52       lsm_config(pDb, LSM_CONFIG_AUTOCHECKPOINT, &n);
53 
54       rc = lsm_work(pDb, nMerge, nKB, 0);
55       if( rc!=LSM_OK ){
56         testPrintError("lsm_work(): rc=%d\n", rc);
57       }
58     }
59   }
60   if( rc==LSM_OK ){
61     rc = lsm_checkpoint(pDb, 0);
62   }
63 
64   lsm_close(pDb);
65   return rc;
66 
67  usage:
68   testPrintUsage("?-optimize? ?-n N? DATABASE");
69   return -1;
70 }
71 
72 
73 /*
74 **   lsmtest show ?-config LSM-CONFIG? DATABASE ?COMMAND ?PGNO??
75 */
do_show(int nArg,char ** azArg)76 int do_show(int nArg, char **azArg){
77   lsm_db *pDb;
78   int rc;
79   const char *zDb;
80 
81   int eOpt = LSM_INFO_DB_STRUCTURE;
82   unsigned int iPg = 0;
83   int bConfig = 0;
84   const char *zConfig = "";
85 
86   struct Option {
87     const char *zName;
88     int bConfig;
89     int eOpt;
90   } aOpt [] = {
91     { "array",       0, LSM_INFO_ARRAY_STRUCTURE },
92     { "array-pages", 0, LSM_INFO_ARRAY_PAGES },
93     { "blocksize",   1, LSM_CONFIG_BLOCK_SIZE },
94     { "pagesize",    1, LSM_CONFIG_PAGE_SIZE },
95     { "freelist",    0, LSM_INFO_FREELIST },
96     { "page-ascii",  0, LSM_INFO_PAGE_ASCII_DUMP },
97     { "page-hex",    0, LSM_INFO_PAGE_HEX_DUMP },
98     { 0, 0 }
99   };
100 
101   char *z = 0;
102   int iDb = 0;                    /* Index of DATABASE in azArg[] */
103 
104   /* Check if there is a "-config" option: */
105   if( nArg>2 && strlen(azArg[0])>1
106    && memcmp(azArg[0], "-config", strlen(azArg[0]))==0
107   ){
108     zConfig = azArg[1];
109     iDb = 2;
110   }
111   if( nArg<(iDb+1) ) goto usage;
112 
113   if( nArg>(iDb+1) ){
114     rc = testArgSelect(aOpt, "option", azArg[iDb+1], &eOpt);
115     if( rc!=0 ) return rc;
116     bConfig = aOpt[eOpt].bConfig;
117     eOpt = aOpt[eOpt].eOpt;
118     if( (bConfig==0 && eOpt==LSM_INFO_FREELIST)
119      || (bConfig==1 && eOpt==LSM_CONFIG_BLOCK_SIZE)
120      || (bConfig==1 && eOpt==LSM_CONFIG_PAGE_SIZE)
121     ){
122       if( nArg!=(iDb+2) ) goto usage;
123     }else{
124       if( nArg!=(iDb+3) ) goto usage;
125       iPg = atoi(azArg[iDb+2]);
126     }
127   }
128   zDb = azArg[iDb];
129 
130   rc = lsm_new(0, &pDb);
131   tdb_lsm_configure(pDb, zConfig);
132   if( rc!=LSM_OK ){
133     testPrintError("lsm_new(): rc=%d\n", rc);
134   }else{
135     rc = lsm_open(pDb, zDb);
136     if( rc!=LSM_OK ){
137       testPrintError("lsm_open(): rc=%d\n", rc);
138     }
139   }
140 
141   if( rc==LSM_OK ){
142     if( bConfig==0 ){
143       switch( eOpt ){
144         case LSM_INFO_DB_STRUCTURE:
145         case LSM_INFO_FREELIST:
146           rc = lsm_info(pDb, eOpt, &z);
147           break;
148         case LSM_INFO_ARRAY_STRUCTURE:
149         case LSM_INFO_ARRAY_PAGES:
150         case LSM_INFO_PAGE_ASCII_DUMP:
151         case LSM_INFO_PAGE_HEX_DUMP:
152           rc = lsm_info(pDb, eOpt, iPg, &z);
153           break;
154         default:
155           assert( !"no chance" );
156       }
157 
158       if( rc==LSM_OK ){
159         printf("%s\n", z ? z : "");
160         fflush(stdout);
161       }
162       lsm_free(lsm_get_env(pDb), z);
163     }else{
164       int iRes = -1;
165       lsm_config(pDb, eOpt, &iRes);
166       printf("%d\n", iRes);
167       fflush(stdout);
168     }
169   }
170 
171   lsm_close(pDb);
172   return rc;
173 
174  usage:
175   testPrintUsage("DATABASE ?array|page-ascii|page-hex PGNO?");
176   return -1;
177 }
178