|
1 /* |
|
2 ** 2006 January 07 |
|
3 ** |
|
4 ** The author disclaims copyright to this source code. In place of |
|
5 ** a legal notice, here is a blessing: |
|
6 ** |
|
7 ** May you do good and not evil. |
|
8 ** May you find forgiveness for yourself and forgive others. |
|
9 ** May you share freely, never taking more than you give. |
|
10 ** |
|
11 ****************************************************************************** |
|
12 ** |
|
13 ** $Id: test_server.c,v 1.8 2008/06/26 10:41:19 danielk1977 Exp $ |
|
14 ** |
|
15 ** This file contains demonstration code. Nothing in this file gets compiled |
|
16 ** or linked into the SQLite library unless you use a non-standard option: |
|
17 ** |
|
18 ** -DSQLITE_SERVER=1 |
|
19 ** |
|
20 ** The configure script will never generate a Makefile with the option |
|
21 ** above. You will need to manually modify the Makefile if you want to |
|
22 ** include any of the code from this file in your project. Or, at your |
|
23 ** option, you may copy and paste the code from this file and |
|
24 ** thereby avoiding a recompile of SQLite. |
|
25 ** |
|
26 ** |
|
27 ** This source file demonstrates how to use SQLite to create an SQL database |
|
28 ** server thread in a multiple-threaded program. One or more client threads |
|
29 ** send messages to the server thread and the server thread processes those |
|
30 ** messages in the order received and returns the results to the client. |
|
31 ** |
|
32 ** One might ask: "Why bother? Why not just let each thread connect |
|
33 ** to the database directly?" There are a several of reasons to |
|
34 ** prefer the client/server approach. |
|
35 ** |
|
36 ** (1) Some systems (ex: Redhat9) have broken threading implementations |
|
37 ** that prevent SQLite database connections from being used in |
|
38 ** a thread different from the one where they were created. With |
|
39 ** the client/server approach, all database connections are created |
|
40 ** and used within the server thread. Client calls to the database |
|
41 ** can be made from multiple threads (though not at the same time!) |
|
42 ** |
|
43 ** (2) Beginning with SQLite version 3.3.0, when two or more |
|
44 ** connections to the same database occur within the same thread, |
|
45 ** they can optionally share their database cache. This reduces |
|
46 ** I/O and memory requirements. Cache shared is controlled using |
|
47 ** the sqlite3_enable_shared_cache() API. |
|
48 ** |
|
49 ** (3) Database connections on a shared cache use table-level locking |
|
50 ** instead of file-level locking for improved concurrency. |
|
51 ** |
|
52 ** (4) Database connections on a shared cache can by optionally |
|
53 ** set to READ UNCOMMITTED isolation. (The default isolation for |
|
54 ** SQLite is SERIALIZABLE.) When this occurs, readers will |
|
55 ** never be blocked by a writer and writers will not be |
|
56 ** blocked by readers. There can still only be a single writer |
|
57 ** at a time, but multiple readers can simultaneously exist with |
|
58 ** that writer. This is a huge increase in concurrency. |
|
59 ** |
|
60 ** To summarize the rational for using a client/server approach: prior |
|
61 ** to SQLite version 3.3.0 it probably was not worth the trouble. But |
|
62 ** with SQLite version 3.3.0 and beyond you can get significant performance |
|
63 ** and concurrency improvements and memory usage reductions by going |
|
64 ** client/server. |
|
65 ** |
|
66 ** Note: The extra features of version 3.3.0 described by points (2) |
|
67 ** through (4) above are only available if you compile without the |
|
68 ** option -DSQLITE_OMIT_SHARED_CACHE. |
|
69 ** |
|
70 ** Here is how the client/server approach works: The database server |
|
71 ** thread is started on this procedure: |
|
72 ** |
|
73 ** void *sqlite3_server(void *NotUsed); |
|
74 ** |
|
75 ** The sqlite_server procedure runs as long as the g.serverHalt variable |
|
76 ** is false. A mutex is used to make sure no more than one server runs |
|
77 ** at a time. The server waits for messages to arrive on a message |
|
78 ** queue and processes the messages in order. |
|
79 ** |
|
80 ** Two convenience routines are provided for starting and stopping the |
|
81 ** server thread: |
|
82 ** |
|
83 ** void sqlite3_server_start(void); |
|
84 ** void sqlite3_server_stop(void); |
|
85 ** |
|
86 ** Both of the convenience routines return immediately. Neither will |
|
87 ** ever give an error. If a server is already started or already halted, |
|
88 ** then the routines are effectively no-ops. |
|
89 ** |
|
90 ** Clients use the following interfaces: |
|
91 ** |
|
92 ** sqlite3_client_open |
|
93 ** sqlite3_client_prepare |
|
94 ** sqlite3_client_step |
|
95 ** sqlite3_client_reset |
|
96 ** sqlite3_client_finalize |
|
97 ** sqlite3_client_close |
|
98 ** |
|
99 ** These interfaces work exactly like the standard core SQLite interfaces |
|
100 ** having the same names without the "_client_" infix. Many other SQLite |
|
101 ** interfaces can be used directly without having to send messages to the |
|
102 ** server as long as SQLITE_ENABLE_MEMORY_MANAGEMENT is not defined. |
|
103 ** The following interfaces fall into this second category: |
|
104 ** |
|
105 ** sqlite3_bind_* |
|
106 ** sqlite3_changes |
|
107 ** sqlite3_clear_bindings |
|
108 ** sqlite3_column_* |
|
109 ** sqlite3_complete |
|
110 ** sqlite3_create_collation |
|
111 ** sqlite3_create_function |
|
112 ** sqlite3_data_count |
|
113 ** sqlite3_db_handle |
|
114 ** sqlite3_errcode |
|
115 ** sqlite3_errmsg |
|
116 ** sqlite3_last_insert_rowid |
|
117 ** sqlite3_total_changes |
|
118 ** sqlite3_transfer_bindings |
|
119 ** |
|
120 ** A single SQLite connection (an sqlite3* object) or an SQLite statement |
|
121 ** (an sqlite3_stmt* object) should only be passed to a single interface |
|
122 ** function at a time. The connections and statements can be passed from |
|
123 ** any thread to any of the functions listed in the second group above as |
|
124 ** long as the same connection is not in use by two threads at once and |
|
125 ** as long as SQLITE_ENABLE_MEMORY_MANAGEMENT is not defined. Additional |
|
126 ** information about the SQLITE_ENABLE_MEMORY_MANAGEMENT constraint is |
|
127 ** below. |
|
128 ** |
|
129 ** The busy handler for all database connections should remain turned |
|
130 ** off. That means that any lock contention will cause the associated |
|
131 ** sqlite3_client_step() call to return immediately with an SQLITE_BUSY |
|
132 ** error code. If a busy handler is enabled and lock contention occurs, |
|
133 ** then the entire server thread will block. This will cause not only |
|
134 ** the requesting client to block but every other database client as |
|
135 ** well. It is possible to enhance the code below so that lock |
|
136 ** contention will cause the message to be placed back on the top of |
|
137 ** the queue to be tried again later. But such enhanced processing is |
|
138 ** not included here, in order to keep the example simple. |
|
139 ** |
|
140 ** This example code assumes the use of pthreads. Pthreads |
|
141 ** implementations are available for windows. (See, for example |
|
142 ** http://sourceware.org/pthreads-win32/announcement.html.) Or, you |
|
143 ** can translate the locking and thread synchronization code to use |
|
144 ** windows primitives easily enough. The details are left as an |
|
145 ** exercise to the reader. |
|
146 ** |
|
147 **** Restrictions Associated With SQLITE_ENABLE_MEMORY_MANAGEMENT **** |
|
148 ** |
|
149 ** If you compile with SQLITE_ENABLE_MEMORY_MANAGEMENT defined, then |
|
150 ** SQLite includes code that tracks how much memory is being used by |
|
151 ** each thread. These memory counts can become confused if memory |
|
152 ** is allocated by one thread and then freed by another. For that |
|
153 ** reason, when SQLITE_ENABLE_MEMORY_MANAGEMENT is used, all operations |
|
154 ** that might allocate or free memory should be performanced in the same |
|
155 ** thread that originally created the database connection. In that case, |
|
156 ** many of the operations that are listed above as safe to be performed |
|
157 ** in separate threads would need to be sent over to the server to be |
|
158 ** done there. If SQLITE_ENABLE_MEMORY_MANAGEMENT is defined, then |
|
159 ** the following functions can be used safely from different threads |
|
160 ** without messing up the allocation counts: |
|
161 ** |
|
162 ** sqlite3_bind_parameter_name |
|
163 ** sqlite3_bind_parameter_index |
|
164 ** sqlite3_changes |
|
165 ** sqlite3_column_blob |
|
166 ** sqlite3_column_count |
|
167 ** sqlite3_complete |
|
168 ** sqlite3_data_count |
|
169 ** sqlite3_db_handle |
|
170 ** sqlite3_errcode |
|
171 ** sqlite3_errmsg |
|
172 ** sqlite3_last_insert_rowid |
|
173 ** sqlite3_total_changes |
|
174 ** |
|
175 ** The remaining functions are not thread-safe when memory management |
|
176 ** is enabled. So one would have to define some new interface routines |
|
177 ** along the following lines: |
|
178 ** |
|
179 ** sqlite3_client_bind_* |
|
180 ** sqlite3_client_clear_bindings |
|
181 ** sqlite3_client_column_* |
|
182 ** sqlite3_client_create_collation |
|
183 ** sqlite3_client_create_function |
|
184 ** sqlite3_client_transfer_bindings |
|
185 ** |
|
186 ** The example code in this file is intended for use with memory |
|
187 ** management turned off. So the implementation of these additional |
|
188 ** client interfaces is left as an exercise to the reader. |
|
189 ** |
|
190 ** It may seem surprising to the reader that the list of safe functions |
|
191 ** above does not include things like sqlite3_bind_int() or |
|
192 ** sqlite3_column_int(). But those routines might, in fact, allocate |
|
193 ** or deallocate memory. In the case of sqlite3_bind_int(), if the |
|
194 ** parameter was previously bound to a string that string might need |
|
195 ** to be deallocated before the new integer value is inserted. In |
|
196 ** the case of sqlite3_column_int(), the value of the column might be |
|
197 ** a UTF-16 string which will need to be converted to UTF-8 then into |
|
198 ** an integer. |
|
199 */ |
|
200 |
|
201 /* Include this to get the definition of SQLITE_THREADSAFE, in the |
|
202 ** case that default values are used. |
|
203 */ |
|
204 #include "sqliteInt.h" |
|
205 |
|
206 /* |
|
207 ** Only compile the code in this file on UNIX with a SQLITE_THREADSAFE build |
|
208 ** and only if the SQLITE_SERVER macro is defined. |
|
209 */ |
|
210 #if defined(SQLITE_SERVER) && !defined(SQLITE_OMIT_SHARED_CACHE) |
|
211 #if defined(SQLITE_OS_UNIX) && OS_UNIX && SQLITE_THREADSAFE |
|
212 |
|
213 /* |
|
214 ** We require only pthreads and the public interface of SQLite. |
|
215 */ |
|
216 #include <pthread.h> |
|
217 #include "sqlite3.h" |
|
218 |
|
219 /* |
|
220 ** Messages are passed from client to server and back again as |
|
221 ** instances of the following structure. |
|
222 */ |
|
223 typedef struct SqlMessage SqlMessage; |
|
224 struct SqlMessage { |
|
225 int op; /* Opcode for the message */ |
|
226 sqlite3 *pDb; /* The SQLite connection */ |
|
227 sqlite3_stmt *pStmt; /* A specific statement */ |
|
228 int errCode; /* Error code returned */ |
|
229 const char *zIn; /* Input filename or SQL statement */ |
|
230 int nByte; /* Size of the zIn parameter for prepare() */ |
|
231 const char *zOut; /* Tail of the SQL statement */ |
|
232 SqlMessage *pNext; /* Next message in the queue */ |
|
233 SqlMessage *pPrev; /* Previous message in the queue */ |
|
234 pthread_mutex_t clientMutex; /* Hold this mutex to access the message */ |
|
235 pthread_cond_t clientWakeup; /* Signal to wake up the client */ |
|
236 }; |
|
237 |
|
238 /* |
|
239 ** Legal values for SqlMessage.op |
|
240 */ |
|
241 #define MSG_Open 1 /* sqlite3_open(zIn, &pDb) */ |
|
242 #define MSG_Prepare 2 /* sqlite3_prepare(pDb, zIn, nByte, &pStmt, &zOut) */ |
|
243 #define MSG_Step 3 /* sqlite3_step(pStmt) */ |
|
244 #define MSG_Reset 4 /* sqlite3_reset(pStmt) */ |
|
245 #define MSG_Finalize 5 /* sqlite3_finalize(pStmt) */ |
|
246 #define MSG_Close 6 /* sqlite3_close(pDb) */ |
|
247 #define MSG_Done 7 /* Server has finished with this message */ |
|
248 |
|
249 |
|
250 /* |
|
251 ** State information about the server is stored in a static variable |
|
252 ** named "g" as follows: |
|
253 */ |
|
254 static struct ServerState { |
|
255 pthread_mutex_t queueMutex; /* Hold this mutex to access the msg queue */ |
|
256 pthread_mutex_t serverMutex; /* Held by the server while it is running */ |
|
257 pthread_cond_t serverWakeup; /* Signal this condvar to wake up the server */ |
|
258 volatile int serverHalt; /* Server halts itself when true */ |
|
259 SqlMessage *pQueueHead; /* Head of the message queue */ |
|
260 SqlMessage *pQueueTail; /* Tail of the message queue */ |
|
261 } g = { |
|
262 PTHREAD_MUTEX_INITIALIZER, |
|
263 PTHREAD_MUTEX_INITIALIZER, |
|
264 PTHREAD_COND_INITIALIZER, |
|
265 }; |
|
266 |
|
267 /* |
|
268 ** Send a message to the server. Block until we get a reply. |
|
269 ** |
|
270 ** The mutex and condition variable in the message are uninitialized |
|
271 ** when this routine is called. This routine takes care of |
|
272 ** initializing them and destroying them when it has finished. |
|
273 */ |
|
274 static void sendToServer(SqlMessage *pMsg){ |
|
275 /* Initialize the mutex and condition variable on the message |
|
276 */ |
|
277 pthread_mutex_init(&pMsg->clientMutex, 0); |
|
278 pthread_cond_init(&pMsg->clientWakeup, 0); |
|
279 |
|
280 /* Add the message to the head of the server's message queue. |
|
281 */ |
|
282 pthread_mutex_lock(&g.queueMutex); |
|
283 pMsg->pNext = g.pQueueHead; |
|
284 if( g.pQueueHead==0 ){ |
|
285 g.pQueueTail = pMsg; |
|
286 }else{ |
|
287 g.pQueueHead->pPrev = pMsg; |
|
288 } |
|
289 pMsg->pPrev = 0; |
|
290 g.pQueueHead = pMsg; |
|
291 pthread_mutex_unlock(&g.queueMutex); |
|
292 |
|
293 /* Signal the server that the new message has be queued, then |
|
294 ** block waiting for the server to process the message. |
|
295 */ |
|
296 pthread_mutex_lock(&pMsg->clientMutex); |
|
297 pthread_cond_signal(&g.serverWakeup); |
|
298 while( pMsg->op!=MSG_Done ){ |
|
299 pthread_cond_wait(&pMsg->clientWakeup, &pMsg->clientMutex); |
|
300 } |
|
301 pthread_mutex_unlock(&pMsg->clientMutex); |
|
302 |
|
303 /* Destroy the mutex and condition variable of the message. |
|
304 */ |
|
305 pthread_mutex_destroy(&pMsg->clientMutex); |
|
306 pthread_cond_destroy(&pMsg->clientWakeup); |
|
307 } |
|
308 |
|
309 /* |
|
310 ** The following 6 routines are client-side implementations of the |
|
311 ** core SQLite interfaces: |
|
312 ** |
|
313 ** sqlite3_open |
|
314 ** sqlite3_prepare |
|
315 ** sqlite3_step |
|
316 ** sqlite3_reset |
|
317 ** sqlite3_finalize |
|
318 ** sqlite3_close |
|
319 ** |
|
320 ** Clients should use the following client-side routines instead of |
|
321 ** the core routines above. |
|
322 ** |
|
323 ** sqlite3_client_open |
|
324 ** sqlite3_client_prepare |
|
325 ** sqlite3_client_step |
|
326 ** sqlite3_client_reset |
|
327 ** sqlite3_client_finalize |
|
328 ** sqlite3_client_close |
|
329 ** |
|
330 ** Each of these routines creates a message for the desired operation, |
|
331 ** sends that message to the server, waits for the server to process |
|
332 ** then message and return a response. |
|
333 */ |
|
334 int sqlite3_client_open(const char *zDatabaseName, sqlite3 **ppDb){ |
|
335 SqlMessage msg; |
|
336 msg.op = MSG_Open; |
|
337 msg.zIn = zDatabaseName; |
|
338 sendToServer(&msg); |
|
339 *ppDb = msg.pDb; |
|
340 return msg.errCode; |
|
341 } |
|
342 int sqlite3_client_prepare( |
|
343 sqlite3 *pDb, |
|
344 const char *zSql, |
|
345 int nByte, |
|
346 sqlite3_stmt **ppStmt, |
|
347 const char **pzTail |
|
348 ){ |
|
349 SqlMessage msg; |
|
350 msg.op = MSG_Prepare; |
|
351 msg.pDb = pDb; |
|
352 msg.zIn = zSql; |
|
353 msg.nByte = nByte; |
|
354 sendToServer(&msg); |
|
355 *ppStmt = msg.pStmt; |
|
356 if( pzTail ) *pzTail = msg.zOut; |
|
357 return msg.errCode; |
|
358 } |
|
359 int sqlite3_client_step(sqlite3_stmt *pStmt){ |
|
360 SqlMessage msg; |
|
361 msg.op = MSG_Step; |
|
362 msg.pStmt = pStmt; |
|
363 sendToServer(&msg); |
|
364 return msg.errCode; |
|
365 } |
|
366 int sqlite3_client_reset(sqlite3_stmt *pStmt){ |
|
367 SqlMessage msg; |
|
368 msg.op = MSG_Reset; |
|
369 msg.pStmt = pStmt; |
|
370 sendToServer(&msg); |
|
371 return msg.errCode; |
|
372 } |
|
373 int sqlite3_client_finalize(sqlite3_stmt *pStmt){ |
|
374 SqlMessage msg; |
|
375 msg.op = MSG_Finalize; |
|
376 msg.pStmt = pStmt; |
|
377 sendToServer(&msg); |
|
378 return msg.errCode; |
|
379 } |
|
380 int sqlite3_client_close(sqlite3 *pDb){ |
|
381 SqlMessage msg; |
|
382 msg.op = MSG_Close; |
|
383 msg.pDb = pDb; |
|
384 sendToServer(&msg); |
|
385 return msg.errCode; |
|
386 } |
|
387 |
|
388 /* |
|
389 ** This routine implements the server. To start the server, first |
|
390 ** make sure g.serverHalt is false, then create a new detached thread |
|
391 ** on this procedure. See the sqlite3_server_start() routine below |
|
392 ** for an example. This procedure loops until g.serverHalt becomes |
|
393 ** true. |
|
394 */ |
|
395 void *sqlite3_server(void *NotUsed){ |
|
396 if( pthread_mutex_trylock(&g.serverMutex) ){ |
|
397 return 0; /* Another server is already running */ |
|
398 } |
|
399 sqlite3_enable_shared_cache(1); |
|
400 while( !g.serverHalt ){ |
|
401 SqlMessage *pMsg; |
|
402 |
|
403 /* Remove the last message from the message queue. |
|
404 */ |
|
405 pthread_mutex_lock(&g.queueMutex); |
|
406 while( g.pQueueTail==0 && g.serverHalt==0 ){ |
|
407 pthread_cond_wait(&g.serverWakeup, &g.queueMutex); |
|
408 } |
|
409 pMsg = g.pQueueTail; |
|
410 if( pMsg ){ |
|
411 if( pMsg->pPrev ){ |
|
412 pMsg->pPrev->pNext = 0; |
|
413 }else{ |
|
414 g.pQueueHead = 0; |
|
415 } |
|
416 g.pQueueTail = pMsg->pPrev; |
|
417 } |
|
418 pthread_mutex_unlock(&g.queueMutex); |
|
419 if( pMsg==0 ) break; |
|
420 |
|
421 /* Process the message just removed |
|
422 */ |
|
423 pthread_mutex_lock(&pMsg->clientMutex); |
|
424 switch( pMsg->op ){ |
|
425 case MSG_Open: { |
|
426 pMsg->errCode = sqlite3_open(pMsg->zIn, &pMsg->pDb); |
|
427 break; |
|
428 } |
|
429 case MSG_Prepare: { |
|
430 pMsg->errCode = sqlite3_prepare(pMsg->pDb, pMsg->zIn, pMsg->nByte, |
|
431 &pMsg->pStmt, &pMsg->zOut); |
|
432 break; |
|
433 } |
|
434 case MSG_Step: { |
|
435 pMsg->errCode = sqlite3_step(pMsg->pStmt); |
|
436 break; |
|
437 } |
|
438 case MSG_Reset: { |
|
439 pMsg->errCode = sqlite3_reset(pMsg->pStmt); |
|
440 break; |
|
441 } |
|
442 case MSG_Finalize: { |
|
443 pMsg->errCode = sqlite3_finalize(pMsg->pStmt); |
|
444 break; |
|
445 } |
|
446 case MSG_Close: { |
|
447 pMsg->errCode = sqlite3_close(pMsg->pDb); |
|
448 break; |
|
449 } |
|
450 } |
|
451 |
|
452 /* Signal the client that the message has been processed. |
|
453 */ |
|
454 pMsg->op = MSG_Done; |
|
455 pthread_mutex_unlock(&pMsg->clientMutex); |
|
456 pthread_cond_signal(&pMsg->clientWakeup); |
|
457 } |
|
458 sqlite3_thread_cleanup(); |
|
459 pthread_mutex_unlock(&g.serverMutex); |
|
460 return 0; |
|
461 } |
|
462 |
|
463 /* |
|
464 ** Start a server thread if one is not already running. If there |
|
465 ** is aleady a server thread running, the new thread will quickly |
|
466 ** die and this routine is effectively a no-op. |
|
467 */ |
|
468 void sqlite3_server_start(void){ |
|
469 pthread_t x; |
|
470 int rc; |
|
471 g.serverHalt = 0; |
|
472 rc = pthread_create(&x, 0, sqlite3_server, 0); |
|
473 if( rc==0 ){ |
|
474 pthread_detach(x); |
|
475 } |
|
476 } |
|
477 |
|
478 /* |
|
479 ** If a server thread is running, then stop it. If no server is |
|
480 ** running, this routine is effectively a no-op. |
|
481 ** |
|
482 ** This routine waits until the server has actually stopped before |
|
483 ** returning. |
|
484 */ |
|
485 void sqlite3_server_stop(void){ |
|
486 g.serverHalt = 1; |
|
487 pthread_cond_broadcast(&g.serverWakeup); |
|
488 pthread_mutex_lock(&g.serverMutex); |
|
489 pthread_mutex_unlock(&g.serverMutex); |
|
490 } |
|
491 |
|
492 #endif /* defined(SQLITE_OS_UNIX) && OS_UNIX && SQLITE_THREADSAFE */ |
|
493 #endif /* defined(SQLITE_SERVER) */ |