· 8 years ago · Apr 01, 2018, 08:18 AM
1#include <stdio.h>
2#include <signal.h>
3#include <stdlib.h>
4#include <unistd.h>
5#include <string.h>
6
7#include <assert.h>
8
9#include <sqlite3.h>
10
11#define TOTAL_INSERTS 1000
12volatile sig_atomic_t work = 1;
13void sig_handler(int sig) {
14 work = 0;
15}
16const char *create_statement = "create table if not exists example_t ( "\
17 "id integer primary key autoincrement"\
18 ", value integer"\
19 ")";
20
21
22
23int query_callback(void *unused, int count, char **data, char **columns) {
24 int idx;
25 printf("There are %d column(s)\n", count);
26 for (idx = 0; idx < count; idx++) {
27 printf("The data in column \"%s\" is: %s\n", columns[idx], data[idx]);
28 }
29 printf("\n");
30 return 0;
31}
32
33const char *get_err_msg(int code);
34
35int main(int argc, char* argv[])
36{
37 int rc = 0;
38 int successful_inserts = 0;
39 char insert_statement[256] = {0};
40 int flags = SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_WAL | SQLITE_OPEN_SHAREDCACHE;
41 char *errmsg = NULL;
42 sqlite3 *db = NULL;
43
44 signal(SIGINT, sig_handler);
45 signal(SIGTERM, sig_handler);
46
47 rc = sqlite3_open_v2("example.db", &db, flags, NULL);
48 if(rc != SQLITE_OK && db == NULL) {
49 printf("Failed to open DB\nrc: %d, msg: %s, errmsg: %s\n", rc, get_err_msg(rc), errmsg);
50 _exit(-1);
51 }
52/*
53void *sqlite3_wal_hook
54db,
55 int(*wal_hook)(void *,sqlite3*,const char*,int),
56 v
57);
58*/
59
60 if(argc > 2 && (0 == strcmp(argv[1], "skip"))) {
61 printf("Create table...\n");
62#ifndef NDEBUG
63 printf("%s\n", create_statement);
64#endif
65 rc = sqlite3_exec(db, create_statement, NULL, NULL, &errmsg);
66 if(rc != SQLITE_OK) {
67 printf("Failed to create table\nrc: %d, msg: %s, errmsg: %s\n", rc, get_err_msg(rc), errmsg);
68 _exit(-2);
69 }
70 } else {
71 printf("Skip creating table...\n");
72 }
73 printf("Performing query (insert)...\n");
74#ifndef NDEBUG
75 snprintf(insert_statement, sizeof(insert_statement), "insert into example_t (value) VALUES (\"%d\")", getpid());
76 printf("%s\n", insert_statement);
77#endif
78
79 while (work && successful_inserts < TOTAL_INSERTS) {
80 rc = sqlite3_exec(db, insert_statement, NULL, NULL, &errmsg);
81 if(rc == SQLITE_BUSY) {
82 continue;
83 } else if(rc != SQLITE_OK) {
84 printf("Failed to insert\nrc: %d, msg: %s, errmsg: %s\n", rc, get_err_msg(rc), errmsg);
85 //_exit(-3);
86 } else {
87 successful_inserts++;
88 if(successful_inserts%100 == 0)
89 printf("Total inserts: %d\n", successful_inserts);
90 }
91 //sleep(1);
92 //usleep(10);
93 }
94 printf("Total inserts: %d\n", successful_inserts);
95 printf("Exit Ok\n");
96 return 0;
97}
98
99const char *get_err_msg(int code) {
100 switch(code) {
101 case SQLITE_OK :
102 return "Successful result";
103 case SQLITE_ERROR :
104 return "Generic error";
105 case SQLITE_INTERNAL :
106 return "Internal logic error in SQLite";
107 case SQLITE_PERM :
108 return "Access permission denied";
109 case SQLITE_ABORT :
110 return "Callback routine requested an abort";
111 case SQLITE_BUSY :
112 return "The database file is locked";
113 case SQLITE_LOCKED :
114 return "A table in the database is locked";
115 case SQLITE_NOMEM :
116 return "A malloc() failed";
117 case SQLITE_READONLY :
118 return "Attempt to write a readonly database";
119 case SQLITE_INTERRUPT :
120 return "Operation terminated by sqlite3_interrupt()";
121 case SQLITE_IOERR :
122 return "Some kind of disk I/O error occurred";
123 case SQLITE_CORRUPT :
124 return "The database disk image is malformed";
125 case SQLITE_NOTFOUND :
126 return "Unknown opcode in sqlite3_file_control()";
127 case SQLITE_FULL :
128 return "Insertion failed because database is full";
129 case SQLITE_CANTOPEN :
130 return "Unable to open the database file";
131 case SQLITE_PROTOCOL :
132 return "Database lock protocol error";
133 case SQLITE_EMPTY :
134 return "Internal use only";
135 case SQLITE_SCHEMA :
136 return "The database schema changed";
137 case SQLITE_TOOBIG :
138 return "String or BLOB exceeds size limit";
139 case SQLITE_CONSTRAINT :
140 return "Abort due to constraint violation";
141 case SQLITE_MISMATCH :
142 return "Data type mismatch";
143 case SQLITE_MISUSE :
144 return "Library used incorrectly";
145 case SQLITE_NOLFS :
146 return "Uses OS features not supported on host";
147 case SQLITE_AUTH :
148 return "Authorization denied";
149 case SQLITE_FORMAT :
150 return "Not used";
151 case SQLITE_RANGE :
152 return "2nd parameter to sqlite3_bind out of range";
153 case SQLITE_NOTADB :
154 return "File opened that is not a database file";
155 case SQLITE_NOTICE :
156 return "Notifications from sqlite3_log()";
157 case SQLITE_WARNING :
158 return "Warnings from sqlite3_log()";
159 case SQLITE_ROW :
160 return "sqlite3_step() has another row ready";
161 case SQLITE_DONE :
162 return "sqlite3_step() has finished executing";
163 default:
164 return "unknown sqlite error";
165 }
166}