xref: /sqlite-3.40.0/src/test_server.c (revision 5d00d0a8)
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) */
494