64 bit build fix
[csql.git] / test / dbapi / Threads / autoincTest.c
blob82e9c0ce1e06d3d20b0d09ae61fd5d46d24c5c6d
1 //#include <NanoTimer.h>
2 //TestCase: It creates 5 threads and all threads insert ITERATION records simultanesouly.
3 //after insertion, it checks whether 50000 records are there in the table
4 //after that, 5 threads select 10K records each simultanesouly.
5 //verify that 10K records are selected in each thread.
6 //The test is repeated with no index, hash index and tree index
7 #include<CSql.h>
8 #define THREADS 5
9 #define ITERATION 25000
10 void* runInsTest(void *p);
11 void* runSelTest(void *p);
12 void* runDelTest(void *p);
13 int main()
16 Connection conn;
17 DbRetVal rv = conn.open("root", "manager");
18 if (rv != OK)
20 printf("Error during connection %d\n", rv);
21 return -1;
23 DatabaseManager *dbMgr = conn.getDatabaseManager();
24 if (dbMgr == NULL) { printf("Auth failed\n"); return -1;}
25 TableDef tabDef;
26 tabDef.addField("f1", typeInt, 0, NULL, true, true);
27 tabDef.addField("f2", typeString, 12);
28 rv = dbMgr->createTable("t1", tabDef);
29 if (rv != OK) { printf("Table creation failed\n"); return -1; }
30 HashIndexInitInfo *idxInfo = new HashIndexInitInfo();
31 strcpy(idxInfo->tableName, "t1");
32 idxInfo->list.append("f1");
33 idxInfo->isPrimary = true;
34 idxInfo->isUnique = true;
35 #ifdef HASH
36 idxInfo->indType = hashIndex;
37 rv = dbMgr->createIndex("indx1", idxInfo);
38 if (rv != OK) { printf("Index creation failed\n"); return -1; }
39 #endif
40 #ifdef TREE
41 idxInfo->indType = treeIndex;
42 rv = dbMgr->createIndex("indx1", idxInfo);
43 if (rv != OK) { printf("Index creation failed\n"); return -1; }
44 #endif
45 delete idxInfo;
46 pthread_t thr[THREADS];
47 int message[THREADS];
48 int status;
49 for (int i=0; i <THREADS; i++) {
50 message[i] = i;
51 pthread_create (&thr[i], NULL,
52 &runInsTest, (void *) &message[i]);
54 for (int i=0; i <THREADS; i++) {
55 pthread_join(thr[i], (void**)&status);
58 Table *table = dbMgr->openTable("t1");
59 if (table == NULL) { printf("Unable to open table\n"); return -1; }
60 table->setCondition(NULL);
61 rv = conn.startTransaction();
62 if (rv != OK) while (rv !=OK) rv = conn.startTransaction();
63 table->execute();
64 int count=0;
65 void *tuple = NULL;
66 while ((tuple = (char*) table->fetch())) {
67 count++;
69 printf("Tuples found: %d\n", count);
70 table->closeScan();
71 conn.commit();
73 #ifdef HASH
74 Condition p1;
75 int valTerm = 0;
76 p1.setTerm("f1", OpEquals, &valTerm);
77 table->setCondition(&p1);
78 int icount=0;
79 for(int i = 0; i< THREADS * ITERATION; i++)
81 rv = conn.startTransaction();
82 if (rv != OK) while (rv !=OK) rv = conn.startTransaction();
83 valTerm = i+1;
84 rv = table->execute();
85 tuple = (char*)table->fetch() ;
86 if (tuple == NULL) break;
87 icount++;
88 table->closeScan();
89 conn.commit();
90 //if (i%ITERATION == 0) printf("%d\n", i);
92 printf("Index Tuples found: %d\n", icount);
93 #endif
97 dbMgr->closeTable(table);
99 for (int i=0; i <THREADS; i++) {
100 message[i] = i;
101 pthread_create (&thr[i], NULL,
102 &runSelTest, (void *) &message[i]);
104 for (int i=0; i <THREADS; i++) {
105 pthread_join(thr[i], (void**)&status);
108 dbMgr->dropTable("t1");
110 conn.close();
111 return 0;
113 void* runInsTest(void *message)
115 Connection conn;
116 DbRetVal rv = conn.open("root", "manager");
117 if (rv != OK)
119 printf("Error during connection %d\n", rv);
120 return NULL;
122 DatabaseManager *dbMgr = conn.getDatabaseManager();
123 if (dbMgr == NULL) { printf("Auth failed\n"); return NULL;}
124 Table *table = dbMgr->openTable("t1");
125 if (table == NULL) { printf("Unable to open table\n"); return NULL; }
126 int id = 0;
127 char name[20] = "PRABAKARAN";
128 //table->bindFld("f1", &id);
129 table->bindFld("f2", name);
130 char *tuple;
131 int ret;
132 int i;
133 int icount =0;
134 int val = *(int*)message;
135 int retrycnt=0;
136 for(i = val * ITERATION; i< (val *ITERATION) +ITERATION; i++)
138 rv = conn.startTransaction();
139 if (rv != OK) while (rv !=OK) rv = conn.startTransaction();
140 id= i;
141 strcpy(name, "KARAN123");
142 ret = table->insertTuple();
143 retrycnt=0;
144 while (ret == ErrLockTimeOut)
146 rv = conn.rollback();
147 if (rv != OK) {
148 while (rv == ErrLockTimeOut)
150 printf("retrying abort\n");
151 rv = conn.rollback();
154 if (retrycnt == 3) { ret = 1; break;}
155 rv = conn.startTransaction();
156 if (rv != OK) {
157 while (rv == ErrLockTimeOut)
159 printf("retrying startTransaction\n");
160 rv = conn.startTransaction();
163 ret = table->insertTuple();
164 retrycnt++;
165 //ret =1; break; //temp to analyse issue
167 if (ret != 0) { printf("RETURNING EARLY: %d with i:%d\n", ret, i); break;}
168 icount++;
169 rv = conn.commit();
170 if (rv != OK) {
171 printf("COMMIT returned %d\n", rv);
172 os::usleep(500);
173 while (rv == ErrLockTimeOut) {
174 printf("retrying commit\n");
175 rv = conn.commit();
178 //if (icount %ITERATION ==0) printf("%d\n", i);
180 char msgBuf[1024];
181 sprintf(msgBuf,"Insert: Thread %lu %d: Total rows :%d\n",os::getthrid(), val, icount);
182 os::write(1,msgBuf,strlen(msgBuf));
183 dbMgr->closeTable(table);
184 rv = conn.close();
185 return NULL;
187 void* runSelTest(void *message)
189 Connection conn;
190 DbRetVal rv = conn.open("root", "manager");
191 if (rv != OK)
193 printf("Error during connection %d\n", rv);
194 return NULL;
196 DatabaseManager *dbMgr = conn.getDatabaseManager();
197 if (dbMgr == NULL) { printf("Auth failed\n"); return NULL;}
198 Table *table = dbMgr->openTable("t1");
199 if (table == NULL) { printf("Unable to open table\n"); return NULL; }
200 int id = 0;
201 char name[1020] = "PRABAKARAN";
202 table->bindFld("f1", &id);
203 table->bindFld("f2", name);
204 char *tuple;
205 int i;
206 int icount =0;
207 int val = *(int*)message;
209 Condition p1;
210 int valTerm = 0;
211 p1.setTerm("f1", OpEquals, &valTerm);
212 table->setCondition(&p1);
214 for(i = val * ITERATION; i< (val *ITERATION) +ITERATION; i++)
216 rv = conn.startTransaction();
217 if (rv != OK) while (rv !=OK) rv = conn.startTransaction();
218 valTerm = i;
219 if (valTerm ==0) valTerm=1;
220 rv = table->execute();
221 if (rv != OK) {
222 printf("Execute returned %d\n", rv);
223 os::usleep(500);
224 int retry=5;
225 while (rv == ErrLockTimeOut) {
226 if (retry == 0) break;
227 printf("retrying execute\n");
228 rv = table->execute();
229 retry--;
232 tuple = (char*)table->fetch() ;
233 if (tuple == NULL) break;
234 icount++;
235 table->closeScan();
236 rv = conn.commit();
237 if (rv != OK) {
238 while (rv == ErrLockTimeOut) {
239 printf("retrying commit\n");
240 rv = conn.commit();
245 char msgBuf[1024];
246 sprintf(msgBuf,"Select: Thread %lu %d: Total rows :%d\n",os::getthrid(), val, icount);
247 os::write(1,msgBuf,strlen(msgBuf));
248 dbMgr->closeTable(table);
249 rv = conn.close();
250 return NULL;
252 void* runDelTest(void *message)
254 Connection conn;
255 DbRetVal rv = conn.open("root", "manager");
256 if (rv != OK)
258 printf("Error during connection %d\n", rv);
259 return NULL;
261 DatabaseManager *dbMgr = conn.getDatabaseManager();
262 if (dbMgr == NULL) { printf("Auth failed\n"); return NULL;}
263 Table *table = dbMgr->openTable("t1");
264 if (table == NULL) { printf("Unable to open table\n"); return NULL; }
265 int id = 0;
266 char name[20] = "PRABAKARAN";
267 table->bindFld("f1", &id);
268 table->bindFld("f2", name);
269 char *tuple;
270 int i;
271 int ret;
272 int retrycnt=0;
273 int icount =0;
274 int val = *(int*)message;
276 Condition p1;
277 int valTerm = 0;
278 p1.setTerm("f1", OpEquals, &valTerm);
279 table->setCondition(&p1);
281 for(i = val * ITERATION; i< (val *ITERATION) +ITERATION; i++)
283 rv = conn.startTransaction();
284 if (rv != OK) while (rv !=OK) rv = conn.startTransaction();
285 id= i;
286 valTerm = i;
287 rv = table->execute();
288 if (rv != OK) {
289 printf("Execute returned %d\n", rv);
290 os::usleep(500);
291 int retry=5;
292 while (rv == ErrLockTimeOut) {
293 if (retry == 0) { printf("DELETE:execute failed\n"); break;}
294 printf("retrying execute\n");
295 rv = table->execute();
296 retry--;
299 tuple = (char*)table->fetch() ;
300 if (tuple == NULL) { printf("DELETE:fetch failed\n");break;}
301 ret = table->deleteTuple();
302 retrycnt=0;
303 while (ret == ErrLockTimeOut)
305 table->closeScan();
306 rv = conn.rollback();
307 if (rv != OK) {
308 while (rv == ErrLockTimeOut)
310 printf("retrying abort\n");
311 rv = conn.rollback();
314 if (retrycnt == 10) { ret = 1; break;}
315 rv = conn.startTransaction();
316 if (rv != OK) {
317 while (rv == ErrLockTimeOut)
319 printf("retrying startTransaction\n");
320 rv = conn.startTransaction();
323 rv = table->execute();
324 if (rv != OK) {
325 printf("Execute returned %d\n", rv);
326 os::usleep(500);
327 int retry=5;
328 while (rv == ErrLockTimeOut) {
329 if (retry == 0) { printf("DELETE:execute failed\n"); break;}
330 printf("retrying execute\n");
331 rv = table->execute();
332 retry--;
335 tuple = (char*)table->fetch() ;
336 if (tuple == NULL) { printf("DELETE:fetch failed\n");break;}
337 ret = table->deleteTuple();
338 retrycnt++;
340 if (ret != 0) { printf("RETURNING EARLY: %d with i:%d\n", ret, i); break;}
341 table->closeScan();
342 rv = conn.commit();
343 if (rv != OK) {
344 printf("COMMIT returned %d for record %d\n", rv, i);
345 if (rv != ErrLockTimeOut)
347 printf("RETURNING EARLY: with i:%d\n", i);
348 break;
351 os::usleep(500);
352 while (rv == ErrLockTimeOut) {
353 printf("retrying commit\n");
354 rv = conn.commit();
357 icount++;
359 char msgBuf[1024];
360 sprintf(msgBuf,"Delete: Thread %lu %d: Total rows :%d\n",os::getthrid(), val, icount);
361 os::write(1,msgBuf,strlen(msgBuf));
362 dbMgr->closeTable(table);
363 rv = conn.close();
364 return NULL;