/ Hex Artifact Content
Login

Artifact bbba05c144b5fc4b52ff650a4328027b3fa5fcc6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 36 20 4a 61 6e 75 61  /*.** 2006 Janua
0010: 72 79 20 30 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ry 07.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
0180: 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69  This file contai
0190: 6e 73 20 64 65 6d 6f 6e 73 74 72 61 74 69 6f 6e  ns demonstration
01a0: 20 63 6f 64 65 2e 20 20 4e 6f 74 68 69 6e 67 20   code.  Nothing 
01b0: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 67 65 74  in this file get
01c0: 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 6f 72  s compiled.** or
01d0: 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 74 68 65   linked into the
01e0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
01f0: 75 6e 6c 65 73 73 20 79 6f 75 20 75 73 65 20 61  unless you use a
0200: 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 6f 70   non-standard op
0210: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tion:.**.**     
0220: 20 2d 44 53 51 4c 49 54 45 5f 53 45 52 56 45 52   -DSQLITE_SERVER
0230: 3d 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  =1.**.** The con
0240: 66 69 67 75 72 65 20 73 63 72 69 70 74 20 77 69  figure script wi
0250: 6c 6c 20 6e 65 76 65 72 20 67 65 6e 65 72 61 74  ll never generat
0260: 65 20 61 20 4d 61 6b 65 66 69 6c 65 20 77 69 74  e a Makefile wit
0270: 68 20 74 68 65 20 6f 70 74 69 6f 6e 0a 2a 2a 20  h the option.** 
0280: 61 62 6f 76 65 2e 20 20 59 6f 75 20 77 69 6c 6c  above.  You will
0290: 20 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c 6c   need to manuall
02a0: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 4d 61 6b  y modify the Mak
02b0: 65 66 69 6c 65 20 69 66 20 79 6f 75 20 77 61 6e  efile if you wan
02c0: 74 20 74 6f 0a 2a 2a 20 69 6e 63 6c 75 64 65 20  t to.** include 
02d0: 61 6e 79 20 6f 66 20 74 68 65 20 63 6f 64 65 20  any of the code 
02e0: 66 72 6f 6d 20 74 68 69 73 20 66 69 6c 65 20 69  from this file i
02f0: 6e 20 79 6f 75 72 20 70 72 6f 6a 65 63 74 2e 20  n your project. 
0300: 20 4f 72 2c 20 61 74 20 79 6f 75 72 0a 2a 2a 20   Or, at your.** 
0310: 6f 70 74 69 6f 6e 2c 20 79 6f 75 20 6d 61 79 20  option, you may 
0320: 63 6f 70 79 20 61 6e 64 20 70 61 73 74 65 20 74  copy and paste t
0330: 68 65 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  he code from thi
0340: 73 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  s file and.** th
0350: 65 72 65 62 79 20 61 76 6f 69 64 69 6e 67 20 61  ereby avoiding a
0360: 20 72 65 63 6f 6d 70 69 6c 65 20 6f 66 20 53 51   recompile of SQ
0370: 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  Lite..**.**.** T
0380: 68 69 73 20 73 6f 75 72 63 65 20 66 69 6c 65 20  his source file 
0390: 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 68 6f 77  demonstrates how
03a0: 20 74 6f 20 75 73 65 20 53 51 4c 69 74 65 20 74   to use SQLite t
03b0: 6f 20 63 72 65 61 74 65 20 61 6e 20 53 51 4c 20  o create an SQL 
03c0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 73 65 72  database .** ser
03d0: 76 65 72 20 74 68 72 65 61 64 20 69 6e 20 61 20  ver thread in a 
03e0: 6d 75 6c 74 69 70 6c 65 2d 74 68 72 65 61 64 65  multiple-threade
03f0: 64 20 70 72 6f 67 72 61 6d 2e 20 20 4f 6e 65 20  d program.  One 
0400: 6f 72 20 6d 6f 72 65 20 63 6c 69 65 6e 74 20 74  or more client t
0410: 68 72 65 61 64 73 0a 2a 2a 20 73 65 6e 64 20 6d  hreads.** send m
0420: 65 73 73 61 67 65 73 20 74 6f 20 74 68 65 20 73  essages to the s
0430: 65 72 76 65 72 20 74 68 72 65 61 64 20 61 6e 64  erver thread and
0440: 20 74 68 65 20 73 65 72 76 65 72 20 74 68 72 65   the server thre
0450: 61 64 20 70 72 6f 63 65 73 73 65 73 20 74 68 6f  ad processes tho
0460: 73 65 0a 2a 2a 20 6d 65 73 73 61 67 65 73 20 69  se.** messages i
0470: 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 63 65  n the order rece
0480: 69 76 65 64 20 61 6e 64 20 72 65 74 75 72 6e 73  ived and returns
0490: 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
04a0: 74 68 65 20 63 6c 69 65 6e 74 2e 0a 2a 2a 0a 2a  the client..**.*
04b0: 2a 20 4f 6e 65 20 6d 69 67 68 74 20 61 73 6b 3a  * One might ask:
04c0: 20 20 22 57 68 79 20 62 6f 74 68 65 72 3f 20 20    "Why bother?  
04d0: 57 68 79 20 6e 6f 74 20 6a 75 73 74 20 6c 65 74  Why not just let
04e0: 20 65 61 63 68 20 74 68 72 65 61 64 20 63 6f 6e   each thread con
04f0: 6e 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64  nect.** to the d
0500: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6c 79  atabase directly
0510: 3f 22 20 20 54 68 65 72 65 20 61 72 65 20 61 20  ?"  There are a 
0520: 73 65 76 65 72 61 6c 20 6f 66 20 72 65 61 73 6f  several of reaso
0530: 6e 73 20 74 6f 0a 2a 2a 20 70 72 65 66 65 72 20  ns to.** prefer 
0540: 74 68 65 20 63 6c 69 65 6e 74 2f 73 65 72 76 65  the client/serve
0550: 72 20 61 70 70 72 6f 61 63 68 2e 0a 2a 2a 0a 2a  r approach..**.*
0560: 2a 20 20 20 20 28 31 29 20 20 53 6f 6d 65 20 73  *    (1)  Some s
0570: 79 73 74 65 6d 73 20 28 65 78 3a 20 52 65 64 68  ystems (ex: Redh
0580: 61 74 39 29 20 68 61 76 65 20 62 72 6f 6b 65 6e  at9) have broken
0590: 20 74 68 72 65 61 64 69 6e 67 20 69 6d 70 6c 65   threading imple
05a0: 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 20 20  mentations.**   
05b0: 20 20 20 20 20 20 74 68 61 74 20 70 72 65 76 65        that preve
05c0: 6e 74 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  nt SQLite databa
05d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66  se connections f
05e0: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 69  rom being used i
05f0: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 20 74  n.**         a t
0600: 68 72 65 61 64 20 64 69 66 66 65 72 65 6e 74 20  hread different 
0610: 66 72 6f 6d 20 74 68 65 20 6f 6e 65 20 77 68 65  from the one whe
0620: 72 65 20 74 68 65 79 20 77 65 72 65 20 63 72 65  re they were cre
0630: 61 74 65 64 2e 20 20 57 69 74 68 0a 2a 2a 20 20  ated.  With.**  
0640: 20 20 20 20 20 20 20 74 68 65 20 63 6c 69 65 6e         the clien
0650: 74 2f 73 65 72 76 65 72 20 61 70 70 72 6f 61 63  t/server approac
0660: 68 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  h, all database 
0670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
0680: 63 72 65 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  created.**      
0690: 20 20 20 61 6e 64 20 75 73 65 64 20 77 69 74 68     and used with
06a0: 69 6e 20 74 68 65 20 73 65 72 76 65 72 20 74 68  in the server th
06b0: 72 65 61 64 2e 20 20 43 6c 69 65 6e 74 20 63 61  read.  Client ca
06c0: 6c 6c 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  lls to the datab
06d0: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  ase.**         c
06e0: 61 6e 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20  an be made from 
06f0: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
0700: 20 28 74 68 6f 75 67 68 20 6e 6f 74 20 61 74 20   (though not at 
0710: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 21 29 0a  the same time!).
0720: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 42 65  **.**    (2)  Be
0730: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 53 51 4c  ginning with SQL
0740: 69 74 65 20 76 65 72 73 69 6f 6e 20 33 2e 33 2e  ite version 3.3.
0750: 30 2c 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  0, when two or m
0760: 6f 72 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ore .**         
0770: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
0780: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0790: 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 74 68   occur within th
07a0: 65 20 73 61 6d 65 20 74 68 72 65 61 64 2c 0a 2a  e same thread,.*
07b0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 79 20 63  *         they c
07c0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 73 68  an optionally sh
07d0: 61 72 65 20 74 68 65 69 72 20 64 61 74 61 62 61  are their databa
07e0: 73 65 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  se cache.  This 
07f0: 72 65 64 75 63 65 73 0a 2a 2a 20 20 20 20 20 20  reduces.**      
0800: 20 20 20 49 2f 4f 20 61 6e 64 20 6d 65 6d 6f 72     I/O and memor
0810: 79 20 72 65 71 75 69 72 65 6d 65 6e 74 73 2e 20  y requirements. 
0820: 20 43 61 63 68 65 20 73 68 61 72 65 64 20 69 73   Cache shared is
0830: 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 75 73 69 6e   controlled usin
0840: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  g.**         the
0850: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0860: 73 68 61 72 65 64 5f 63 61 63 68 65 28 29 20 41  shared_cache() A
0870: 50 49 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  PI..**.**    (3)
0880: 20 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65    Database conne
0890: 63 74 69 6f 6e 73 20 6f 6e 20 61 20 73 68 61 72  ctions on a shar
08a0: 65 64 20 63 61 63 68 65 20 75 73 65 20 74 61 62  ed cache use tab
08b0: 6c 65 2d 6c 65 76 65 6c 20 6c 6f 63 6b 69 6e 67  le-level locking
08c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 74  .**         inst
08d0: 65 61 64 20 6f 66 20 66 69 6c 65 2d 6c 65 76 65  ead of file-leve
08e0: 6c 20 6c 6f 63 6b 69 6e 67 20 66 6f 72 20 69 6d  l locking for im
08f0: 70 72 6f 76 65 64 20 63 6f 6e 63 75 72 72 65 6e  proved concurren
0900: 63 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  cy..**.**    (4)
0910: 20 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65    Database conne
0920: 63 74 69 6f 6e 73 20 6f 6e 20 61 20 73 68 61 72  ctions on a shar
0930: 65 64 20 63 61 63 68 65 20 63 61 6e 20 62 79 20  ed cache can by 
0940: 6f 70 74 69 6f 6e 61 6c 6c 79 0a 2a 2a 20 20 20  optionally.**   
0950: 20 20 20 20 20 20 73 65 74 20 74 6f 20 52 45 41        set to REA
0960: 44 20 55 4e 43 4f 4d 4d 49 54 54 45 44 20 69 73  D UNCOMMITTED is
0970: 6f 6c 61 74 69 6f 6e 2e 20 20 28 54 68 65 20 64  olation.  (The d
0980: 65 66 61 75 6c 74 20 69 73 6f 6c 61 74 69 6f 6e  efault isolation
0990: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
09a0: 53 51 4c 69 74 65 20 69 73 20 53 45 52 49 41 4c  SQLite is SERIAL
09b0: 49 5a 41 42 4c 45 2e 29 20 20 57 68 65 6e 20 74  IZABLE.)  When t
09c0: 68 69 73 20 6f 63 63 75 72 73 2c 20 72 65 61 64  his occurs, read
09d0: 65 72 73 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ers will.**     
09e0: 20 20 20 20 6e 65 76 65 72 20 62 65 20 62 6c 6f      never be blo
09f0: 63 6b 65 64 20 62 79 20 61 20 77 72 69 74 65 72  cked by a writer
0a00: 20 61 6e 64 20 77 72 69 74 65 72 73 20 77 69 6c   and writers wil
0a10: 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20  l not be.**     
0a20: 20 20 20 20 62 6c 6f 63 6b 65 64 20 62 79 20 72      blocked by r
0a30: 65 61 64 65 72 73 2e 20 20 54 68 65 72 65 20 63  eaders.  There c
0a40: 61 6e 20 73 74 69 6c 6c 20 6f 6e 6c 79 20 62 65  an still only be
0a50: 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72   a single writer
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 61  .**         at a
0a70: 20 74 69 6d 65 2c 20 62 75 74 20 6d 75 6c 74 69   time, but multi
0a80: 70 6c 65 20 72 65 61 64 65 72 73 20 63 61 6e 20  ple readers can 
0a90: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20 65  simultaneously e
0aa0: 78 69 73 74 20 77 69 74 68 0a 2a 2a 20 20 20 20  xist with.**    
0ab0: 20 20 20 20 20 74 68 61 74 20 77 72 69 74 65 72       that writer
0ac0: 2e 20 20 54 68 69 73 20 69 73 20 61 20 68 75 67  .  This is a hug
0ad0: 65 20 69 6e 63 72 65 61 73 65 20 69 6e 20 63 6f  e increase in co
0ae0: 6e 63 75 72 72 65 6e 63 79 2e 0a 2a 2a 0a 2a 2a  ncurrency..**.**
0af0: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 20 74 68   To summarize th
0b00: 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 75  e rational for u
0b10: 73 69 6e 67 20 61 20 63 6c 69 65 6e 74 2f 73 65  sing a client/se
0b20: 72 76 65 72 20 61 70 70 72 6f 61 63 68 3a 20 70  rver approach: p
0b30: 72 69 6f 72 0a 2a 2a 20 74 6f 20 53 51 4c 69 74  rior.** to SQLit
0b40: 65 20 76 65 72 73 69 6f 6e 20 33 2e 33 2e 30 20  e version 3.3.0 
0b50: 69 74 20 70 72 6f 62 61 62 6c 79 20 77 61 73 20  it probably was 
0b60: 6e 6f 74 20 77 6f 72 74 68 20 74 68 65 20 74 72  not worth the tr
0b70: 6f 75 62 6c 65 2e 20 20 42 75 74 0a 2a 2a 20 77  ouble.  But.** w
0b80: 69 74 68 20 53 51 4c 69 74 65 20 76 65 72 73 69  ith SQLite versi
0b90: 6f 6e 20 33 2e 33 2e 30 20 61 6e 64 20 62 65 79  on 3.3.0 and bey
0ba0: 6f 6e 64 20 79 6f 75 20 63 61 6e 20 67 65 74 20  ond you can get 
0bb0: 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
0bc0: 6f 72 6d 61 6e 63 65 0a 2a 2a 20 61 6e 64 20 63  ormance.** and c
0bd0: 6f 6e 63 75 72 72 65 6e 63 79 20 69 6d 70 72 6f  oncurrency impro
0be0: 76 65 6d 65 6e 74 73 20 61 6e 64 20 6d 65 6d 6f  vements and memo
0bf0: 72 79 20 75 73 61 67 65 20 72 65 64 75 63 74 69  ry usage reducti
0c00: 6f 6e 73 20 62 79 20 67 6f 69 6e 67 0a 2a 2a 20  ons by going.** 
0c10: 63 6c 69 65 6e 74 2f 73 65 72 76 65 72 2e 0a 2a  client/server..*
0c20: 2a 0a 2a 2a 20 4e 6f 74 65 3a 20 20 54 68 65 20  *.** Note:  The 
0c30: 65 78 74 72 61 20 66 65 61 74 75 72 65 73 20 6f  extra features o
0c40: 66 20 76 65 72 73 69 6f 6e 20 33 2e 33 2e 30 20  f version 3.3.0 
0c50: 64 65 73 63 72 69 62 65 64 20 62 79 20 70 6f 69  described by poi
0c60: 6e 74 73 20 28 32 29 0a 2a 2a 20 74 68 72 6f 75  nts (2).** throu
0c70: 67 68 20 28 34 29 20 61 62 6f 76 65 20 61 72 65  gh (4) above are
0c80: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
0c90: 69 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 77  if you compile w
0ca0: 69 74 68 6f 75 74 20 74 68 65 0a 2a 2a 20 6f 70  ithout the.** op
0cb0: 74 69 6f 6e 20 2d 44 53 51 4c 49 54 45 5f 4f 4d  tion -DSQLITE_OM
0cc0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 2e  IT_SHARED_CACHE.
0cd0: 20 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20   .**.** Here is 
0ce0: 68 6f 77 20 74 68 65 20 63 6c 69 65 6e 74 2f 73  how the client/s
0cf0: 65 72 76 65 72 20 61 70 70 72 6f 61 63 68 20 77  erver approach w
0d00: 6f 72 6b 73 3a 20 20 54 68 65 20 64 61 74 61 62  orks:  The datab
0d10: 61 73 65 20 73 65 72 76 65 72 0a 2a 2a 20 74 68  ase server.** th
0d20: 72 65 61 64 20 69 73 20 73 74 61 72 74 65 64 20  read is started 
0d30: 6f 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  on this procedur
0d40: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 76  e:.**.**       v
0d50: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 73 65 72  oid *sqlite3_ser
0d60: 76 65 72 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65  ver(void *NotUse
0d70: 64 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  d);.**.** The sq
0d80: 6c 69 74 65 5f 73 65 72 76 65 72 20 70 72 6f 63  lite_server proc
0d90: 65 64 75 72 65 20 72 75 6e 73 20 61 73 20 6c 6f  edure runs as lo
0da0: 6e 67 20 61 73 20 74 68 65 20 67 2e 73 65 72 76  ng as the g.serv
0db0: 65 72 48 61 6c 74 20 76 61 72 69 61 62 6c 65 0a  erHalt variable.
0dc0: 2a 2a 20 69 73 20 66 61 6c 73 65 2e 20 20 41 20  ** is false.  A 
0dd0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
0de0: 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6d 6f   make sure no mo
0df0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 73 65 72 76  re than one serv
0e00: 65 72 20 72 75 6e 73 0a 2a 2a 20 61 74 20 61 20  er runs.** at a 
0e10: 74 69 6d 65 2e 20 20 54 68 65 20 73 65 72 76 65  time.  The serve
0e20: 72 20 77 61 69 74 73 20 66 6f 72 20 6d 65 73 73  r waits for mess
0e30: 61 67 65 73 20 74 6f 20 61 72 72 69 76 65 20 6f  ages to arrive o
0e40: 6e 20 61 20 6d 65 73 73 61 67 65 0a 2a 2a 20 71  n a message.** q
0e50: 75 65 75 65 20 61 6e 64 20 70 72 6f 63 65 73 73  ueue and process
0e60: 65 73 20 74 68 65 20 6d 65 73 73 61 67 65 73 20  es the messages 
0e70: 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  in order..**.** 
0e80: 54 77 6f 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  Two convenience 
0e90: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 70 72 6f  routines are pro
0ea0: 76 69 64 65 64 20 66 6f 72 20 73 74 61 72 74 69  vided for starti
0eb0: 6e 67 20 61 6e 64 20 73 74 6f 70 70 69 6e 67 20  ng and stopping 
0ec0: 74 68 65 0a 2a 2a 20 73 65 72 76 65 72 20 74 68  the.** server th
0ed0: 72 65 61 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  read:.**.**     
0ee0: 20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73    void sqlite3_s
0ef0: 65 72 76 65 72 5f 73 74 61 72 74 28 76 6f 69 64  erver_start(void
0f00: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 76 6f 69 64  );.**       void
0f10: 20 73 71 6c 69 74 65 33 5f 73 65 72 76 65 72 5f   sqlite3_server_
0f20: 73 74 6f 70 28 76 6f 69 64 29 3b 0a 2a 2a 0a 2a  stop(void);.**.*
0f30: 2a 20 42 6f 74 68 20 6f 66 20 74 68 65 20 63 6f  * Both of the co
0f40: 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
0f50: 65 73 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  es return immedi
0f60: 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20  ately.  Neither 
0f70: 77 69 6c 6c 0a 2a 2a 20 65 76 65 72 20 67 69 76  will.** ever giv
0f80: 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 66 20  e an error.  If 
0f90: 61 20 73 65 72 76 65 72 20 69 73 20 61 6c 72 65  a server is alre
0fa0: 61 64 79 20 73 74 61 72 74 65 64 20 6f 72 20 61  ady started or a
0fb0: 6c 72 65 61 64 79 20 68 61 6c 74 65 64 2c 0a 2a  lready halted,.*
0fc0: 2a 20 74 68 65 6e 20 74 68 65 20 72 6f 75 74 69  * then the routi
0fd0: 6e 65 73 20 61 72 65 20 65 66 66 65 63 74 69 76  nes are effectiv
0fe0: 65 6c 79 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a  ely no-ops..**.*
0ff0: 2a 20 43 6c 69 65 6e 74 73 20 75 73 65 20 74 68  * Clients use th
1000: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65  e following inte
1010: 72 66 61 63 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rfaces:.**.**   
1020: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 69 65      sqlite3_clie
1030: 6e 74 5f 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20  nt_open.**      
1040: 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f   sqlite3_client_
1050: 70 72 65 70 61 72 65 0a 2a 2a 20 20 20 20 20 20  prepare.**      
1060: 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f   sqlite3_client_
1070: 73 74 65 70 0a 2a 2a 20 20 20 20 20 20 20 73 71  step.**       sq
1080: 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f 72 65 73  lite3_client_res
1090: 65 74 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69  et.**       sqli
10a0: 74 65 33 5f 63 6c 69 65 6e 74 5f 66 69 6e 61 6c  te3_client_final
10b0: 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c  ize.**       sql
10c0: 69 74 65 33 5f 63 6c 69 65 6e 74 5f 63 6c 6f 73  ite3_client_clos
10d0: 65 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 69 6e  e.**.** These in
10e0: 74 65 72 66 61 63 65 73 20 77 6f 72 6b 20 65 78  terfaces work ex
10f0: 61 63 74 6c 79 20 6c 69 6b 65 20 74 68 65 20 73  actly like the s
1100: 74 61 6e 64 61 72 64 20 63 6f 72 65 20 53 51 4c  tandard core SQL
1110: 69 74 65 20 69 6e 74 65 72 66 61 63 65 73 0a 2a  ite interfaces.*
1120: 2a 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d  * having the sam
1130: 65 20 6e 61 6d 65 73 20 77 69 74 68 6f 75 74 20  e names without 
1140: 74 68 65 20 22 5f 63 6c 69 65 6e 74 5f 22 20 69  the "_client_" i
1150: 6e 66 69 78 2e 20 20 4d 61 6e 79 20 6f 74 68 65  nfix.  Many othe
1160: 72 20 53 51 4c 69 74 65 0a 2a 2a 20 69 6e 74 65  r SQLite.** inte
1170: 72 66 61 63 65 73 20 63 61 6e 20 62 65 20 75 73  rfaces can be us
1180: 65 64 20 64 69 72 65 63 74 6c 79 20 77 69 74 68  ed directly with
1190: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 73 65  out having to se
11a0: 6e 64 20 6d 65 73 73 61 67 65 73 20 74 6f 20 74  nd messages to t
11b0: 68 65 0a 2a 2a 20 73 65 72 76 65 72 20 61 73 20  he.** server as 
11c0: 6c 6f 6e 67 20 61 73 20 53 51 4c 49 54 45 5f 45  long as SQLITE_E
11d0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
11e0: 41 47 45 4d 45 4e 54 20 69 73 20 6e 6f 74 20 64  AGEMENT is not d
11f0: 65 66 69 6e 65 64 2e 0a 2a 2a 20 54 68 65 20 66  efined..** The f
1200: 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 72 66 61  ollowing interfa
1210: 63 65 73 20 66 61 6c 6c 20 69 6e 74 6f 20 74 68  ces fall into th
1220: 69 73 20 73 65 63 6f 6e 64 20 63 61 74 65 67 6f  is second catego
1230: 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
1240: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 2a 0a 2a  sqlite3_bind_*.*
1250: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  *       sqlite3_
1260: 63 68 61 6e 67 65 73 0a 2a 2a 20 20 20 20 20 20  changes.**      
1270: 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62   sqlite3_clear_b
1280: 69 6e 64 69 6e 67 73 0a 2a 2a 20 20 20 20 20 20  indings.**      
1290: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
12a0: 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74  *.**       sqlit
12b0: 65 33 5f 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 20  e3_complete.**  
12c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65       sqlite3_cre
12d0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  ate_collation.**
12e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
12f0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 0a 2a  reate_function.*
1300: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  *       sqlite3_
1310: 64 61 74 61 5f 63 6f 75 6e 74 0a 2a 2a 20 20 20  data_count.**   
1320: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 68      sqlite3_db_h
1330: 61 6e 64 6c 65 0a 2a 2a 20 20 20 20 20 20 20 73  andle.**       s
1340: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 0a 2a  qlite3_errcode.*
1350: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  *       sqlite3_
1360: 65 72 72 6d 73 67 0a 2a 2a 20 20 20 20 20 20 20  errmsg.**       
1370: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
1380: 65 72 74 5f 72 6f 77 69 64 0a 2a 2a 20 20 20 20  ert_rowid.**    
1390: 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c     sqlite3_total
13a0: 5f 63 68 61 6e 67 65 73 0a 2a 2a 20 20 20 20 20  _changes.**     
13b0: 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66    sqlite3_transf
13c0: 65 72 5f 62 69 6e 64 69 6e 67 73 0a 2a 2a 0a 2a  er_bindings.**.*
13d0: 2a 20 41 20 73 69 6e 67 6c 65 20 53 51 4c 69 74  * A single SQLit
13e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 6e  e connection (an
13f0: 20 73 71 6c 69 74 65 33 2a 20 6f 62 6a 65 63 74   sqlite3* object
1400: 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 73  ) or an SQLite s
1410: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 28 61 6e 20  tatement.** (an 
1420: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 6f 62  sqlite3_stmt* ob
1430: 6a 65 63 74 29 20 73 68 6f 75 6c 64 20 6f 6e 6c  ject) should onl
1440: 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 61  y be passed to a
1450: 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 66 61 63   single interfac
1460: 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74  e.** function at
1470: 20 61 20 74 69 6d 65 2e 20 20 54 68 65 20 63 6f   a time.  The co
1480: 6e 6e 65 63 74 69 6f 6e 73 20 61 6e 64 20 73 74  nnections and st
1490: 61 74 65 6d 65 6e 74 73 20 63 61 6e 20 62 65 20  atements can be 
14a0: 70 61 73 73 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  passed from.** a
14b0: 6e 79 20 74 68 72 65 61 64 20 74 6f 20 61 6e 79  ny thread to any
14c0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
14d0: 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20  s listed in the 
14e0: 73 65 63 6f 6e 64 20 67 72 6f 75 70 20 61 62 6f  second group abo
14f0: 76 65 20 61 73 0a 2a 2a 20 6c 6f 6e 67 20 61 73  ve as.** long as
1500: 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
1510: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 69 6e 20 75  tion is not in u
1520: 73 65 20 62 79 20 74 77 6f 20 74 68 72 65 61 64  se by two thread
1530: 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 0a 2a 2a  s at once and.**
1540: 20 61 73 20 6c 6f 6e 67 20 61 73 20 53 51 4c 49   as long as SQLI
1550: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
1560: 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 69 73 20 6e  _MANAGEMENT is n
1570: 6f 74 20 64 65 66 69 6e 65 64 2e 20 20 41 64 64  ot defined.  Add
1580: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72  itional.** infor
1590: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
15a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
15b0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
15c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a   constraint is.*
15d0: 2a 20 62 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  * below..**.** T
15e0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
15f0: 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
1600: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 73 68 6f   connections sho
1610: 75 6c 64 20 72 65 6d 61 69 6e 20 74 75 72 6e 65  uld remain turne
1620: 64 0a 2a 2a 20 6f 66 66 2e 20 20 54 68 61 74 20  d.** off.  That 
1630: 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 79 20 6c  means that any l
1640: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77  ock contention w
1650: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 61 73  ill cause the as
1660: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 73 71 6c 69  sociated.** sqli
1670: 74 65 33 5f 63 6c 69 65 6e 74 5f 73 74 65 70 28  te3_client_step(
1680: 29 20 63 61 6c 6c 20 74 6f 20 72 65 74 75 72 6e  ) call to return
1690: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
16a0: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
16b0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
16c0: 20 49 66 20 61 20 62 75 73 79 20 68 61 6e 64 6c   If a busy handl
16d0: 65 72 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e  er is enabled an
16e0: 64 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  d lock contentio
16f0: 6e 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 74 68 65  n occurs,.** the
1700: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 73 65 72  n the entire ser
1710: 76 65 72 20 74 68 72 65 61 64 20 77 69 6c 6c 20  ver thread will 
1720: 62 6c 6f 63 6b 2e 20 20 54 68 69 73 20 77 69 6c  block.  This wil
1730: 6c 20 63 61 75 73 65 20 6e 6f 74 20 6f 6e 6c 79  l cause not only
1740: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 69  .** the requesti
1750: 6e 67 20 63 6c 69 65 6e 74 20 74 6f 20 62 6c 6f  ng client to blo
1760: 63 6b 20 62 75 74 20 65 76 65 72 79 20 6f 74 68  ck but every oth
1770: 65 72 20 64 61 74 61 62 61 73 65 20 63 6c 69 65  er database clie
1780: 6e 74 20 61 73 0a 2a 2a 20 77 65 6c 6c 2e 20 20  nt as.** well.  
1790: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
17a0: 6f 20 65 6e 68 61 6e 63 65 20 74 68 65 20 63 6f  o enhance the co
17b0: 64 65 20 62 65 6c 6f 77 20 73 6f 20 74 68 61 74  de below so that
17c0: 20 6c 6f 63 6b 0a 2a 2a 20 63 6f 6e 74 65 6e 74   lock.** content
17d0: 69 6f 6e 20 77 69 6c 6c 20 63 61 75 73 65 20 74  ion will cause t
17e0: 68 65 20 6d 65 73 73 61 67 65 20 74 6f 20 62 65  he message to be
17f0: 20 70 6c 61 63 65 64 20 62 61 63 6b 20 6f 6e 20   placed back on 
1800: 74 68 65 20 74 6f 70 20 6f 66 0a 2a 2a 20 74 68  the top of.** th
1810: 65 20 71 75 65 75 65 20 74 6f 20 62 65 20 74 72  e queue to be tr
1820: 69 65 64 20 61 67 61 69 6e 20 6c 61 74 65 72 2e  ied again later.
1830: 20 20 42 75 74 20 73 75 63 68 20 65 6e 68 61 6e    But such enhan
1840: 63 65 64 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ced processing i
1850: 73 0a 2a 2a 20 6e 6f 74 20 69 6e 63 6c 75 64 65  s.** not include
1860: 64 20 68 65 72 65 2c 20 69 6e 20 6f 72 64 65 72  d here, in order
1870: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 65 78 61   to keep the exa
1880: 6d 70 6c 65 20 73 69 6d 70 6c 65 2e 0a 2a 2a 0a  mple simple..**.
1890: 2a 2a 20 54 68 69 73 20 65 78 61 6d 70 6c 65 20  ** This example 
18a0: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65  code assumes the
18b0: 20 75 73 65 20 6f 66 20 70 74 68 72 65 61 64 73   use of pthreads
18c0: 2e 20 20 50 74 68 72 65 61 64 73 0a 2a 2a 20 69  .  Pthreads.** i
18d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61  mplementations a
18e0: 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  re available for
18f0: 20 77 69 6e 64 6f 77 73 2e 20 20 28 53 65 65 2c   windows.  (See,
1900: 20 66 6f 72 20 65 78 61 6d 70 6c 65 0a 2a 2a 20   for example.** 
1910: 68 74 74 70 3a 2f 2f 73 6f 75 72 63 65 77 61 72  http://sourcewar
1920: 65 2e 6f 72 67 2f 70 74 68 72 65 61 64 73 2d 77  e.org/pthreads-w
1930: 69 6e 33 32 2f 61 6e 6e 6f 75 6e 63 65 6d 65 6e  in32/announcemen
1940: 74 2e 68 74 6d 6c 2e 29 20 20 4f 72 2c 20 79 6f  t.html.)  Or, yo
1950: 75 0a 2a 2a 20 63 61 6e 20 74 72 61 6e 73 6c 61  u.** can transla
1960: 74 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 61  te the locking a
1970: 6e 64 20 74 68 72 65 61 64 20 73 79 6e 63 68 72  nd thread synchr
1980: 6f 6e 69 7a 61 74 69 6f 6e 20 63 6f 64 65 20 74  onization code t
1990: 6f 20 75 73 65 0a 2a 2a 20 77 69 6e 64 6f 77 73  o use.** windows
19a0: 20 70 72 69 6d 69 74 69 76 65 73 20 65 61 73 69   primitives easi
19b0: 6c 79 20 65 6e 6f 75 67 68 2e 20 20 54 68 65 20  ly enough.  The 
19c0: 64 65 74 61 69 6c 73 20 61 72 65 20 6c 65 66 74  details are left
19d0: 20 61 73 20 61 6e 0a 2a 2a 20 65 78 65 72 63 69   as an.** exerci
19e0: 73 65 20 74 6f 20 74 68 65 20 72 65 61 64 65 72  se to the reader
19f0: 2e 0a 2a 2a 0a 2a 2a 2a 2a 20 52 65 73 74 72 69  ..**.**** Restri
1a00: 63 74 69 6f 6e 73 20 41 73 73 6f 63 69 61 74 65  ctions Associate
1a10: 64 20 57 69 74 68 20 53 51 4c 49 54 45 5f 45 4e  d With SQLITE_EN
1a20: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
1a30: 47 45 4d 45 4e 54 20 2a 2a 2a 2a 0a 2a 2a 0a 2a  GEMENT ****.**.*
1a40: 2a 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65  * If you compile
1a50: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45 4e 41   with SQLITE_ENA
1a60: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1a70: 45 4d 45 4e 54 20 64 65 66 69 6e 65 64 2c 20 74  EMENT defined, t
1a80: 68 65 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 69 6e  hen.** SQLite in
1a90: 63 6c 75 64 65 73 20 63 6f 64 65 20 74 68 61 74  cludes code that
1aa0: 20 74 72 61 63 6b 73 20 68 6f 77 20 6d 75 63 68   tracks how much
1ab0: 20 6d 65 6d 6f 72 79 20 69 73 20 62 65 69 6e 67   memory is being
1ac0: 20 75 73 65 64 20 62 79 0a 2a 2a 20 65 61 63 68   used by.** each
1ad0: 20 74 68 72 65 61 64 2e 20 20 54 68 65 73 65 20   thread.  These 
1ae0: 6d 65 6d 6f 72 79 20 63 6f 75 6e 74 73 20 63 61  memory counts ca
1af0: 6e 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  n become confuse
1b00: 64 20 69 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 69  d if memory.** i
1b10: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  s allocated by o
1b20: 6e 65 20 74 68 72 65 61 64 20 61 6e 64 20 74 68  ne thread and th
1b30: 65 6e 20 66 72 65 65 64 20 62 79 20 61 6e 6f 74  en freed by anot
1b40: 68 65 72 2e 20 20 46 6f 72 20 74 68 61 74 0a 2a  her.  For that.*
1b50: 2a 20 72 65 61 73 6f 6e 2c 20 77 68 65 6e 20 53  * reason, when S
1b60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1b70: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 69  ORY_MANAGEMENT i
1b80: 73 20 75 73 65 64 2c 20 61 6c 6c 20 6f 70 65 72  s used, all oper
1b90: 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 6d  ations.** that m
1ba0: 69 67 68 74 20 61 6c 6c 6f 63 61 74 65 20 6f 72  ight allocate or
1bb0: 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 73 68 6f   free memory sho
1bc0: 75 6c 64 20 62 65 20 70 65 72 66 6f 72 6d 61 6e  uld be performan
1bd0: 63 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 0a  ced in the same.
1be0: 2a 2a 20 74 68 72 65 61 64 20 74 68 61 74 20 6f  ** thread that o
1bf0: 72 69 67 69 6e 61 6c 6c 79 20 63 72 65 61 74 65  riginally create
1c00: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
1c10: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 6e 20 74  onnection.  In t
1c20: 68 61 74 20 63 61 73 65 2c 0a 2a 2a 20 6d 61 6e  hat case,.** man
1c30: 79 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69  y of the operati
1c40: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 6c 69 73  ons that are lis
1c50: 74 65 64 20 61 62 6f 76 65 20 61 73 20 73 61 66  ted above as saf
1c60: 65 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  e to be performe
1c70: 64 0a 2a 2a 20 69 6e 20 73 65 70 61 72 61 74 65  d.** in separate
1c80: 20 74 68 72 65 61 64 73 20 77 6f 75 6c 64 20 6e   threads would n
1c90: 65 65 64 20 74 6f 20 62 65 20 73 65 6e 74 20 6f  eed to be sent o
1ca0: 76 65 72 20 74 6f 20 74 68 65 20 73 65 72 76 65  ver to the serve
1cb0: 72 20 74 6f 20 62 65 0a 2a 2a 20 64 6f 6e 65 20  r to be.** done 
1cc0: 74 68 65 72 65 2e 20 20 49 66 20 53 51 4c 49 54  there.  If SQLIT
1cd0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1ce0: 4d 41 4e 41 47 45 4d 45 4e 54 20 69 73 20 64 65  MANAGEMENT is de
1cf0: 66 69 6e 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  fined, then.** t
1d00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
1d10: 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 75 73  ctions can be us
1d20: 65 64 20 73 61 66 65 6c 79 20 66 72 6f 6d 20 64  ed safely from d
1d30: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73  ifferent threads
1d40: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6d 65 73 73  .** without mess
1d50: 69 6e 67 20 75 70 20 74 68 65 20 61 6c 6c 6f 63  ing up the alloc
1d60: 61 74 69 6f 6e 20 63 6f 75 6e 74 73 3a 0a 2a 2a  ation counts:.**
1d70: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
1d80: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1d90: 5f 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 73  _name.**       s
1da0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
1db0: 6d 65 74 65 72 5f 69 6e 64 65 78 0a 2a 2a 20 20  meter_index.**  
1dc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 68 61       sqlite3_cha
1dd0: 6e 67 65 73 0a 2a 2a 20 20 20 20 20 20 20 73 71  nges.**       sq
1de0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1df0: 62 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74  b.**       sqlit
1e00: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 0a  e3_column_count.
1e10: 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  **       sqlite3
1e20: 5f 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 20 20 20  _complete.**    
1e30: 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
1e40: 63 6f 75 6e 74 0a 2a 2a 20 20 20 20 20 20 20 73  count.**       s
1e50: 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
1e60: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
1e70: 33 5f 65 72 72 63 6f 64 65 0a 2a 2a 20 20 20 20  3_errcode.**    
1e80: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
1e90: 67 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74  g.**       sqlit
1ea0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
1eb0: 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 20 73 71  owid.**       sq
1ec0: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
1ed0: 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ges.**.** The re
1ee0: 6d 61 69 6e 69 6e 67 20 66 75 6e 63 74 69 6f 6e  maining function
1ef0: 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  s are not thread
1f00: 2d 73 61 66 65 20 77 68 65 6e 20 6d 65 6d 6f 72  -safe when memor
1f10: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 0a 2a 2a 20  y management.** 
1f20: 69 73 20 65 6e 61 62 6c 65 64 2e 20 20 53 6f 20  is enabled.  So 
1f30: 6f 6e 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74  one would have t
1f40: 6f 20 64 65 66 69 6e 65 20 73 6f 6d 65 20 6e 65  o define some ne
1f50: 77 20 69 6e 74 65 72 66 61 63 65 20 72 6f 75 74  w interface rout
1f60: 69 6e 65 73 0a 2a 2a 20 61 6c 6f 6e 67 20 74 68  ines.** along th
1f70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65  e following line
1f80: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73  s:.**.**       s
1f90: 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f 62 69  qlite3_client_bi
1fa0: 6e 64 5f 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71  nd_*.**       sq
1fb0: 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f 63 6c 65  lite3_client_cle
1fc0: 61 72 5f 62 69 6e 64 69 6e 67 73 0a 2a 2a 20 20  ar_bindings.**  
1fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 69       sqlite3_cli
1fe0: 65 6e 74 5f 63 6f 6c 75 6d 6e 5f 2a 0a 2a 2a 20  ent_column_*.** 
1ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
2000: 69 65 6e 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ient_create_coll
2010: 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 73  ation.**       s
2020: 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f 63 72  qlite3_client_cr
2030: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 0a 2a 2a  eate_function.**
2040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2050: 6c 69 65 6e 74 5f 74 72 61 6e 73 66 65 72 5f 62  lient_transfer_b
2060: 69 6e 64 69 6e 67 73 0a 2a 2a 0a 2a 2a 20 54 68  indings.**.** Th
2070: 65 20 65 78 61 6d 70 6c 65 20 63 6f 64 65 20 69  e example code i
2080: 6e 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 69  n this file is i
2090: 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20  ntended for use 
20a0: 77 69 74 68 20 6d 65 6d 6f 72 79 0a 2a 2a 20 6d  with memory.** m
20b0: 61 6e 61 67 65 6d 65 6e 74 20 74 75 72 6e 65 64  anagement turned
20c0: 20 6f 66 66 2e 20 20 53 6f 20 74 68 65 20 69 6d   off.  So the im
20d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20e0: 74 68 65 73 65 20 61 64 64 69 74 69 6f 6e 61 6c  these additional
20f0: 0a 2a 2a 20 63 6c 69 65 6e 74 20 69 6e 74 65 72  .** client inter
2100: 66 61 63 65 73 20 69 73 20 6c 65 66 74 20 61 73  faces is left as
2110: 20 61 6e 20 65 78 65 72 63 69 73 65 20 74 6f 20   an exercise to 
2120: 74 68 65 20 72 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the reader..**.*
2130: 2a 20 49 74 20 6d 61 79 20 73 65 65 6d 20 73 75  * It may seem su
2140: 72 70 72 69 73 69 6e 67 20 74 6f 20 74 68 65 20  rprising to the 
2150: 72 65 61 64 65 72 20 74 68 61 74 20 74 68 65 20  reader that the 
2160: 6c 69 73 74 20 6f 66 20 73 61 66 65 20 66 75 6e  list of safe fun
2170: 63 74 69 6f 6e 73 0a 2a 2a 20 61 62 6f 76 65 20  ctions.** above 
2180: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
2190: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 73 71 6c   things like sql
21a0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 29 20  ite3_bind_int() 
21b0: 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  or.** sqlite3_co
21c0: 6c 75 6d 6e 5f 69 6e 74 28 29 2e 20 20 42 75 74  lumn_int().  But
21d0: 20 74 68 6f 73 65 20 72 6f 75 74 69 6e 65 73 20   those routines 
21e0: 6d 69 67 68 74 2c 20 69 6e 20 66 61 63 74 2c 20  might, in fact, 
21f0: 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 6f 72 20 64  allocate.** or d
2200: 65 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79  eallocate memory
2210: 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  .  In the case o
2220: 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  f sqlite3_bind_i
2230: 6e 74 28 29 2c 20 69 66 20 74 68 65 0a 2a 2a 20  nt(), if the.** 
2240: 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 70 72  parameter was pr
2250: 65 76 69 6f 75 73 6c 79 20 62 6f 75 6e 64 20 74  eviously bound t
2260: 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  o a string that 
2270: 73 74 72 69 6e 67 20 6d 69 67 68 74 20 6e 65 65  string might nee
2280: 64 0a 2a 2a 20 74 6f 20 62 65 20 64 65 61 6c 6c  d.** to be deall
2290: 6f 63 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  ocated before th
22a0: 65 20 6e 65 77 20 69 6e 74 65 67 65 72 20 76 61  e new integer va
22b0: 6c 75 65 20 69 73 20 69 6e 73 65 72 74 65 64 2e  lue is inserted.
22c0: 20 20 49 6e 0a 2a 2a 20 74 68 65 20 63 61 73 65    In.** the case
22d0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   of sqlite3_colu
22e0: 6d 6e 5f 69 6e 74 28 29 2c 20 74 68 65 20 76 61  mn_int(), the va
22f0: 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  lue of the colum
2300: 6e 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  n might be.** a 
2310: 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 77 68  UTF-16 string wh
2320: 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
2330: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f   be converted to
2340: 20 55 54 46 2d 38 20 74 68 65 6e 20 69 6e 74 6f   UTF-8 then into
2350: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  .** an integer..
2360: 2a 2f 0a 0a 2f 2a 20 49 6e 63 6c 75 64 65 20 74  */../* Include t
2370: 68 69 73 20 74 6f 20 67 65 74 20 74 68 65 20 64  his to get the d
2380: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 53 51 4c  efinition of SQL
2390: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 2c 20  ITE_THREADSAFE, 
23a0: 69 6e 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  in the.** case t
23b0: 68 61 74 20 64 65 66 61 75 6c 74 20 76 61 6c 75  hat default valu
23c0: 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
23d0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
23e0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  Int.h"../*.** On
23f0: 6c 79 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 63  ly compile the c
2400: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
2410: 20 6f 6e 20 55 4e 49 58 20 77 69 74 68 20 61 20   on UNIX with a 
2420: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2430: 45 20 62 75 69 6c 64 0a 2a 2a 20 61 6e 64 20 6f  E build.** and o
2440: 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 49 54  nly if the SQLIT
2450: 45 5f 53 45 52 56 45 52 20 6d 61 63 72 6f 20 69  E_SERVER macro i
2460: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
2470: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2480: 5f 53 45 52 56 45 52 29 20 26 26 20 21 64 65 66  _SERVER) && !def
2490: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24a0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 23  _SHARED_CACHE).#
24b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
24c0: 45 5f 4f 53 5f 55 4e 49 58 29 20 26 26 20 4f 53  E_OS_UNIX) && OS
24d0: 5f 55 4e 49 58 20 26 26 20 53 51 4c 49 54 45 5f  _UNIX && SQLITE_
24e0: 54 48 52 45 41 44 53 41 46 45 0a 0a 2f 2a 0a 2a  THREADSAFE../*.*
24f0: 2a 20 57 65 20 72 65 71 75 69 72 65 20 6f 6e 6c  * We require onl
2500: 79 20 70 74 68 72 65 61 64 73 20 61 6e 64 20 74  y pthreads and t
2510: 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66  he public interf
2520: 61 63 65 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ace of SQLite..*
2530: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72  /.#include <pthr
2540: 65 61 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ead.h>.#include 
2550: 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a 2f 2a 0a  "sqlite3.h"../*.
2560: 2a 2a 20 4d 65 73 73 61 67 65 73 20 61 72 65 20  ** Messages are 
2570: 70 61 73 73 65 64 20 66 72 6f 6d 20 63 6c 69 65  passed from clie
2580: 6e 74 20 74 6f 20 73 65 72 76 65 72 20 61 6e 64  nt to server and
2590: 20 62 61 63 6b 20 61 67 61 69 6e 20 61 73 20 0a   back again as .
25a0: 2a 2a 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  ** instances of 
25b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
25c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
25d0: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 4d 65  def struct SqlMe
25e0: 73 73 61 67 65 20 53 71 6c 4d 65 73 73 61 67 65  ssage SqlMessage
25f0: 3b 0a 73 74 72 75 63 74 20 53 71 6c 4d 65 73 73  ;.struct SqlMess
2600: 61 67 65 20 7b 0a 20 20 69 6e 74 20 6f 70 3b 20  age {.  int op; 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 66       /* Opcode f
2630: 6f 72 20 74 68 65 20 6d 65 73 73 61 67 65 20 2a  or the message *
2640: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 44 62  /.  sqlite3 *pDb
2650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2660: 20 2f 2a 20 54 68 65 20 53 51 4c 69 74 65 20 63   /* The SQLite c
2670: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73  onnection */.  s
2680: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2690: 6d 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  mt;         /* A
26a0: 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 6d   specific statem
26b0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ent */.  int err
26c0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
26d0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
26e0: 6f 64 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a  ode returned */.
26f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
2700: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2710: 2a 20 49 6e 70 75 74 20 66 69 6c 65 6e 61 6d 65  * Input filename
2720: 20 6f 72 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   or SQL statemen
2730: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
2740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2750: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2760: 68 65 20 7a 49 6e 20 70 61 72 61 6d 65 74 65 72  he zIn parameter
2770: 20 66 6f 72 20 70 72 65 70 61 72 65 28 29 20 2a   for prepare() *
2780: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2790: 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  zOut;           
27a0: 20 2f 2a 20 54 61 69 6c 20 6f 66 20 74 68 65 20   /* Tail of the 
27b0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
27c0: 0a 20 20 53 71 6c 4d 65 73 73 61 67 65 20 2a 70  .  SqlMessage *p
27d0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
27e0: 2f 2a 20 4e 65 78 74 20 6d 65 73 73 61 67 65 20  /* Next message 
27f0: 69 6e 20 74 68 65 20 71 75 65 75 65 20 2a 2f 0a  in the queue */.
2800: 20 20 53 71 6c 4d 65 73 73 61 67 65 20 2a 70 50    SqlMessage *pP
2810: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rev;           /
2820: 2a 20 50 72 65 76 69 6f 75 73 20 6d 65 73 73 61  * Previous messa
2830: 67 65 20 69 6e 20 74 68 65 20 71 75 65 75 65 20  ge in the queue 
2840: 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  */.  pthread_mut
2850: 65 78 5f 74 20 63 6c 69 65 6e 74 4d 75 74 65 78  ex_t clientMutex
2860: 3b 20 2f 2a 20 48 6f 6c 64 20 74 68 69 73 20 6d  ; /* Hold this m
2870: 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
2880: 68 65 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  he message */.  
2890: 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 74 20 63  pthread_cond_t c
28a0: 6c 69 65 6e 74 57 61 6b 65 75 70 3b 20 2f 2a 20  lientWakeup; /* 
28b0: 53 69 67 6e 61 6c 20 74 6f 20 77 61 6b 65 20 75  Signal to wake u
28c0: 70 20 74 68 65 20 63 6c 69 65 6e 74 20 2a 2f 0a  p the client */.
28d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 65 67 61 6c 20  };../*.** Legal 
28e0: 76 61 6c 75 65 73 20 66 6f 72 20 53 71 6c 4d 65  values for SqlMe
28f0: 73 73 61 67 65 2e 6f 70 0a 2a 2f 0a 23 64 65 66  ssage.op.*/.#def
2900: 69 6e 65 20 4d 53 47 5f 4f 70 65 6e 20 20 20 20  ine MSG_Open    
2910: 20 20 20 31 20 20 2f 2a 20 73 71 6c 69 74 65 33     1  /* sqlite3
2920: 5f 6f 70 65 6e 28 7a 49 6e 2c 20 26 70 44 62 29  _open(zIn, &pDb)
2930: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 53 47 5f   */.#define MSG_
2940: 50 72 65 70 61 72 65 20 20 20 20 32 20 20 2f 2a  Prepare    2  /*
2950: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2960: 28 70 44 62 2c 20 7a 49 6e 2c 20 6e 42 79 74 65  (pDb, zIn, nByte
2970: 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4f 75 74 29  , &pStmt, &zOut)
2980: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 53 47 5f   */.#define MSG_
2990: 53 74 65 70 20 20 20 20 20 20 20 33 20 20 2f 2a  Step       3  /*
29a0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
29b0: 74 6d 74 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tmt) */.#define 
29c0: 4d 53 47 5f 52 65 73 65 74 20 20 20 20 20 20 34  MSG_Reset      4
29d0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 73    /* sqlite3_res
29e0: 65 74 28 70 53 74 6d 74 29 20 2a 2f 0a 23 64 65  et(pStmt) */.#de
29f0: 66 69 6e 65 20 4d 53 47 5f 46 69 6e 61 6c 69 7a  fine MSG_Finaliz
2a00: 65 20 20 20 35 20 20 2f 2a 20 73 71 6c 69 74 65  e   5  /* sqlite
2a10: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2a20: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 53 47  ) */.#define MSG
2a30: 5f 43 6c 6f 73 65 20 20 20 20 20 20 36 20 20 2f  _Close      6  /
2a40: 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  * sqlite3_close(
2a50: 70 44 62 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  pDb) */.#define 
2a60: 4d 53 47 5f 44 6f 6e 65 20 20 20 20 20 20 20 37  MSG_Done       7
2a70: 20 20 2f 2a 20 53 65 72 76 65 72 20 68 61 73 20    /* Server has 
2a80: 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 74 68  finished with th
2a90: 69 73 20 6d 65 73 73 61 67 65 20 2a 2f 0a 0a 0a  is message */...
2aa0: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
2ab0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2ac0: 65 20 73 65 72 76 65 72 20 69 73 20 73 74 6f 72  e server is stor
2ad0: 65 64 20 69 6e 20 61 20 73 74 61 74 69 63 20 76  ed in a static v
2ae0: 61 72 69 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 64  ariable.** named
2af0: 20 22 67 22 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   "g" as follows:
2b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
2b10: 74 20 53 65 72 76 65 72 53 74 61 74 65 20 7b 0a  t ServerState {.
2b20: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
2b30: 74 20 71 75 65 75 65 4d 75 74 65 78 3b 20 20 20  t queueMutex;   
2b40: 2f 2a 20 48 6f 6c 64 20 74 68 69 73 20 6d 75 74  /* Hold this mut
2b50: 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ex to access the
2b60: 20 6d 73 67 20 71 75 65 75 65 20 2a 2f 0a 20 20   msg queue */.  
2b70: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
2b80: 73 65 72 76 65 72 4d 75 74 65 78 3b 20 20 2f 2a  serverMutex;  /*
2b90: 20 48 65 6c 64 20 62 79 20 74 68 65 20 73 65 72   Held by the ser
2ba0: 76 65 72 20 77 68 69 6c 65 20 69 74 20 69 73 20  ver while it is 
2bb0: 72 75 6e 6e 69 6e 67 20 2a 2f 0a 20 20 70 74 68  running */.  pth
2bc0: 72 65 61 64 5f 63 6f 6e 64 5f 74 20 73 65 72 76  read_cond_t serv
2bd0: 65 72 57 61 6b 65 75 70 3b 20 20 2f 2a 20 53 69  erWakeup;  /* Si
2be0: 67 6e 61 6c 20 74 68 69 73 20 63 6f 6e 64 76 61  gnal this condva
2bf0: 72 20 74 6f 20 77 61 6b 65 20 75 70 20 74 68 65  r to wake up the
2c00: 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 76 6f 6c   server */.  vol
2c10: 61 74 69 6c 65 20 69 6e 74 20 73 65 72 76 65 72  atile int server
2c20: 48 61 6c 74 3b 20 20 20 20 20 20 2f 2a 20 53 65  Halt;      /* Se
2c30: 72 76 65 72 20 68 61 6c 74 73 20 69 74 73 65 6c  rver halts itsel
2c40: 66 20 77 68 65 6e 20 74 72 75 65 20 2a 2f 0a 20  f when true */. 
2c50: 20 53 71 6c 4d 65 73 73 61 67 65 20 2a 70 51 75   SqlMessage *pQu
2c60: 65 75 65 48 65 61 64 3b 20 20 20 20 20 20 20 2f  eueHead;       /
2c70: 2a 20 48 65 61 64 20 6f 66 20 74 68 65 20 6d 65  * Head of the me
2c80: 73 73 61 67 65 20 71 75 65 75 65 20 2a 2f 0a 20  ssage queue */. 
2c90: 20 53 71 6c 4d 65 73 73 61 67 65 20 2a 70 51 75   SqlMessage *pQu
2ca0: 65 75 65 54 61 69 6c 3b 20 20 20 20 20 20 20 2f  eueTail;       /
2cb0: 2a 20 54 61 69 6c 20 6f 66 20 74 68 65 20 6d 65  * Tail of the me
2cc0: 73 73 61 67 65 20 71 75 65 75 65 20 2a 2f 0a 7d  ssage queue */.}
2cd0: 20 67 20 3d 20 7b 0a 20 20 50 54 48 52 45 41 44   g = {.  PTHREAD
2ce0: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
2cf0: 45 52 2c 0a 20 20 50 54 48 52 45 41 44 5f 4d 55  ER,.  PTHREAD_MU
2d00: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c  TEX_INITIALIZER,
2d10: 0a 20 20 50 54 48 52 45 41 44 5f 43 4f 4e 44 5f  .  PTHREAD_COND_
2d20: 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0a 7d 3b 0a  INITIALIZER,.};.
2d30: 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 61 20 6d 65  ./*.** Send a me
2d40: 73 73 61 67 65 20 74 6f 20 74 68 65 20 73 65 72  ssage to the ser
2d50: 76 65 72 2e 20 20 42 6c 6f 63 6b 20 75 6e 74 69  ver.  Block unti
2d60: 6c 20 77 65 20 67 65 74 20 61 20 72 65 70 6c 79  l we get a reply
2d70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
2d80: 78 20 61 6e 64 20 63 6f 6e 64 69 74 69 6f 6e 20  x and condition 
2d90: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
2da0: 6d 65 73 73 61 67 65 20 61 72 65 20 75 6e 69 6e  message are unin
2db0: 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 77 68 65  itialized.** whe
2dc0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2dd0: 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  s called.  This 
2de0: 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61  routine takes ca
2df0: 72 65 20 6f 66 20 0a 2a 2a 20 69 6e 69 74 69 61  re of .** initia
2e00: 6c 69 7a 69 6e 67 20 74 68 65 6d 20 61 6e 64 20  lizing them and 
2e10: 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 6d 20  destroying them 
2e20: 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69  when it has fini
2e30: 73 68 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  shed..*/.static 
2e40: 76 6f 69 64 20 73 65 6e 64 54 6f 53 65 72 76 65  void sendToServe
2e50: 72 28 53 71 6c 4d 65 73 73 61 67 65 20 2a 70 4d  r(SqlMessage *pM
2e60: 73 67 29 7b 0a 20 20 2f 2a 20 49 6e 69 74 69 61  sg){.  /* Initia
2e70: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 61  lize the mutex a
2e80: 6e 64 20 63 6f 6e 64 69 74 69 6f 6e 20 76 61 72  nd condition var
2e90: 69 61 62 6c 65 20 6f 6e 20 74 68 65 20 6d 65 73  iable on the mes
2ea0: 73 61 67 65 0a 20 20 2a 2f 0a 20 20 70 74 68 72  sage.  */.  pthr
2eb0: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26  ead_mutex_init(&
2ec0: 70 4d 73 67 2d 3e 63 6c 69 65 6e 74 4d 75 74 65  pMsg->clientMute
2ed0: 78 2c 20 30 29 3b 0a 20 20 70 74 68 72 65 61 64  x, 0);.  pthread
2ee0: 5f 63 6f 6e 64 5f 69 6e 69 74 28 26 70 4d 73 67  _cond_init(&pMsg
2ef0: 2d 3e 63 6c 69 65 6e 74 57 61 6b 65 75 70 2c 20  ->clientWakeup, 
2f00: 30 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  0);..  /* Add th
2f10: 65 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65  e message to the
2f20: 20 68 65 61 64 20 6f 66 20 74 68 65 20 73 65 72   head of the ser
2f30: 76 65 72 27 73 20 6d 65 73 73 61 67 65 20 71 75  ver's message qu
2f40: 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 74 68 72  eue..  */.  pthr
2f50: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
2f60: 67 2e 71 75 65 75 65 4d 75 74 65 78 29 3b 0a 20  g.queueMutex);. 
2f70: 20 70 4d 73 67 2d 3e 70 4e 65 78 74 20 3d 20 67   pMsg->pNext = g
2f80: 2e 70 51 75 65 75 65 48 65 61 64 3b 0a 20 20 69  .pQueueHead;.  i
2f90: 66 28 20 67 2e 70 51 75 65 75 65 48 65 61 64 3d  f( g.pQueueHead=
2fa0: 3d 30 20 29 7b 0a 20 20 20 20 67 2e 70 51 75 65  =0 ){.    g.pQue
2fb0: 75 65 54 61 69 6c 20 3d 20 70 4d 73 67 3b 0a 20  ueTail = pMsg;. 
2fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e 70 51   }else{.    g.pQ
2fd0: 75 65 75 65 48 65 61 64 2d 3e 70 50 72 65 76 20  ueueHead->pPrev 
2fe0: 3d 20 70 4d 73 67 3b 0a 20 20 7d 0a 20 20 70 4d  = pMsg;.  }.  pM
2ff0: 73 67 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  sg->pPrev = 0;. 
3000: 20 67 2e 70 51 75 65 75 65 48 65 61 64 20 3d 20   g.pQueueHead = 
3010: 70 4d 73 67 3b 0a 20 20 70 74 68 72 65 61 64 5f  pMsg;.  pthread_
3020: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 67 2e  mutex_unlock(&g.
3030: 71 75 65 75 65 4d 75 74 65 78 29 3b 0a 0a 20 20  queueMutex);..  
3040: 2f 2a 20 53 69 67 6e 61 6c 20 74 68 65 20 73 65  /* Signal the se
3050: 72 76 65 72 20 74 68 61 74 20 74 68 65 20 6e 65  rver that the ne
3060: 77 20 6d 65 73 73 61 67 65 20 68 61 73 20 62 65  w message has be
3070: 20 71 75 65 75 65 64 2c 20 74 68 65 6e 0a 20 20   queued, then.  
3080: 2a 2a 20 62 6c 6f 63 6b 20 77 61 69 74 69 6e 67  ** block waiting
3090: 20 66 6f 72 20 74 68 65 20 73 65 72 76 65 72 20   for the server 
30a0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 6d  to process the m
30b0: 65 73 73 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 70  essage..  */.  p
30c0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
30d0: 6b 28 26 70 4d 73 67 2d 3e 63 6c 69 65 6e 74 4d  k(&pMsg->clientM
30e0: 75 74 65 78 29 3b 0a 20 20 70 74 68 72 65 61 64  utex);.  pthread
30f0: 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 26 67 2e  _cond_signal(&g.
3100: 73 65 72 76 65 72 57 61 6b 65 75 70 29 3b 0a 20  serverWakeup);. 
3110: 20 77 68 69 6c 65 28 20 70 4d 73 67 2d 3e 6f 70   while( pMsg->op
3120: 21 3d 4d 53 47 5f 44 6f 6e 65 20 29 7b 0a 20 20  !=MSG_Done ){.  
3130: 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 77    pthread_cond_w
3140: 61 69 74 28 26 70 4d 73 67 2d 3e 63 6c 69 65 6e  ait(&pMsg->clien
3150: 74 57 61 6b 65 75 70 2c 20 26 70 4d 73 67 2d 3e  tWakeup, &pMsg->
3160: 63 6c 69 65 6e 74 4d 75 74 65 78 29 3b 0a 20 20  clientMutex);.  
3170: 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  }.  pthread_mute
3180: 78 5f 75 6e 6c 6f 63 6b 28 26 70 4d 73 67 2d 3e  x_unlock(&pMsg->
3190: 63 6c 69 65 6e 74 4d 75 74 65 78 29 3b 0a 0a 20  clientMutex);.. 
31a0: 20 2f 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20   /* Destroy the 
31b0: 6d 75 74 65 78 20 61 6e 64 20 63 6f 6e 64 69 74  mutex and condit
31c0: 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 6f 66 20  ion variable of 
31d0: 74 68 65 20 6d 65 73 73 61 67 65 2e 0a 20 20 2a  the message..  *
31e0: 2f 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  /.  pthread_mute
31f0: 78 5f 64 65 73 74 72 6f 79 28 26 70 4d 73 67 2d  x_destroy(&pMsg-
3200: 3e 63 6c 69 65 6e 74 4d 75 74 65 78 29 3b 0a 20  >clientMutex);. 
3210: 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 64 65   pthread_cond_de
3220: 73 74 72 6f 79 28 26 70 4d 73 67 2d 3e 63 6c 69  stroy(&pMsg->cli
3230: 65 6e 74 57 61 6b 65 75 70 29 3b 0a 7d 0a 0a 2f  entWakeup);.}../
3240: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3250: 6e 67 20 36 20 72 6f 75 74 69 6e 65 73 20 61 72  ng 6 routines ar
3260: 65 20 63 6c 69 65 6e 74 2d 73 69 64 65 20 69 6d  e client-side im
3270: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
3280: 20 74 68 65 0a 2a 2a 20 63 6f 72 65 20 53 51 4c   the.** core SQL
3290: 69 74 65 20 69 6e 74 65 72 66 61 63 65 73 3a 0a  ite interfaces:.
32a0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 73 71 6c  **.**        sql
32b0: 69 74 65 33 5f 6f 70 65 6e 0a 2a 2a 20 20 20 20  ite3_open.**    
32c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
32d0: 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 71  are.**        sq
32e0: 6c 69 74 65 33 5f 73 74 65 70 0a 2a 2a 20 20 20  lite3_step.**   
32f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3300: 65 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 71 6c  et.**        sql
3310: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 0a 2a 2a  ite3_finalize.**
3320: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3330: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 43 6c 69 65  close.**.** Clie
3340: 6e 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20 74  nts should use t
3350: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 69  he following cli
3360: 65 6e 74 2d 73 69 64 65 20 72 6f 75 74 69 6e 65  ent-side routine
3370: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a 2a  s instead of .**
3380: 20 74 68 65 20 63 6f 72 65 20 72 6f 75 74 69 6e   the core routin
3390: 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  es above..**.** 
33a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
33b0: 6c 69 65 6e 74 5f 6f 70 65 6e 0a 2a 2a 20 20 20  lient_open.**   
33c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 69       sqlite3_cli
33d0: 65 6e 74 5f 70 72 65 70 61 72 65 0a 2a 2a 20 20  ent_prepare.**  
33e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
33f0: 69 65 6e 74 5f 73 74 65 70 0a 2a 2a 20 20 20 20  ient_step.**    
3400: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 69 65      sqlite3_clie
3410: 6e 74 5f 72 65 73 65 74 0a 2a 2a 20 20 20 20 20  nt_reset.**     
3420: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e     sqlite3_clien
3430: 74 5f 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20  t_finalize.**   
3440: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 69       sqlite3_cli
3450: 65 6e 74 5f 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20  ent_close.**.** 
3460: 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 72 6f  Each of these ro
3470: 75 74 69 6e 65 73 20 63 72 65 61 74 65 73 20 61  utines creates a
3480: 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
3490: 20 64 65 73 69 72 65 64 20 6f 70 65 72 61 74 69   desired operati
34a0: 6f 6e 2c 0a 2a 2a 20 73 65 6e 64 73 20 74 68 61  on,.** sends tha
34b0: 74 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65  t message to the
34c0: 20 73 65 72 76 65 72 2c 20 77 61 69 74 73 20 66   server, waits f
34d0: 6f 72 20 74 68 65 20 73 65 72 76 65 72 20 74 6f  or the server to
34e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 74 68 65 6e   process.** then
34f0: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 72 65 74   message and ret
3500: 75 72 6e 20 61 20 72 65 73 70 6f 6e 73 65 2e 0a  urn a response..
3510: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3520: 6c 69 65 6e 74 5f 6f 70 65 6e 28 63 6f 6e 73 74  lient_open(const
3530: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
3540: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 20 2a 2a  Name, sqlite3 **
3550: 70 70 44 62 29 7b 0a 20 20 53 71 6c 4d 65 73 73  ppDb){.  SqlMess
3560: 61 67 65 20 6d 73 67 3b 0a 20 20 6d 73 67 2e 6f  age msg;.  msg.o
3570: 70 20 3d 20 4d 53 47 5f 4f 70 65 6e 3b 0a 20 20  p = MSG_Open;.  
3580: 6d 73 67 2e 7a 49 6e 20 3d 20 7a 44 61 74 61 62  msg.zIn = zDatab
3590: 61 73 65 4e 61 6d 65 3b 0a 20 20 73 65 6e 64 54  aseName;.  sendT
35a0: 6f 53 65 72 76 65 72 28 26 6d 73 67 29 3b 0a 20  oServer(&msg);. 
35b0: 20 2a 70 70 44 62 20 3d 20 6d 73 67 2e 70 44 62   *ppDb = msg.pDb
35c0: 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 67 2e 65  ;.  return msg.e
35d0: 72 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71  rrCode;.}.int sq
35e0: 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f 70 72 65  lite3_client_pre
35f0: 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
3600: 2a 70 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *pDb,.  const ch
3610: 61 72 20 2a 7a 53 71 6c 2c 0a 20 20 69 6e 74 20  ar *zSql,.  int 
3620: 6e 42 79 74 65 2c 0a 20 20 73 71 6c 69 74 65 33  nByte,.  sqlite3
3630: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a  _stmt **ppStmt,.
3640: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
3650: 7a 54 61 69 6c 0a 29 7b 0a 20 20 53 71 6c 4d 65  zTail.){.  SqlMe
3660: 73 73 61 67 65 20 6d 73 67 3b 0a 20 20 6d 73 67  ssage msg;.  msg
3670: 2e 6f 70 20 3d 20 4d 53 47 5f 50 72 65 70 61 72  .op = MSG_Prepar
3680: 65 3b 0a 20 20 6d 73 67 2e 70 44 62 20 3d 20 70  e;.  msg.pDb = p
3690: 44 62 3b 0a 20 20 6d 73 67 2e 7a 49 6e 20 3d 20  Db;.  msg.zIn = 
36a0: 7a 53 71 6c 3b 0a 20 20 6d 73 67 2e 6e 42 79 74  zSql;.  msg.nByt
36b0: 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 73 65 6e  e = nByte;.  sen
36c0: 64 54 6f 53 65 72 76 65 72 28 26 6d 73 67 29 3b  dToServer(&msg);
36d0: 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 6d 73 67  .  *ppStmt = msg
36e0: 2e 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 70 7a  .pStmt;.  if( pz
36f0: 54 61 69 6c 20 29 20 2a 70 7a 54 61 69 6c 20 3d  Tail ) *pzTail =
3700: 20 6d 73 67 2e 7a 4f 75 74 3b 0a 20 20 72 65 74   msg.zOut;.  ret
3710: 75 72 6e 20 6d 73 67 2e 65 72 72 43 6f 64 65 3b  urn msg.errCode;
3720: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  .}.int sqlite3_c
3730: 6c 69 65 6e 74 5f 73 74 65 70 28 73 71 6c 69 74  lient_step(sqlit
3740: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
3750: 0a 20 20 53 71 6c 4d 65 73 73 61 67 65 20 6d 73  .  SqlMessage ms
3760: 67 3b 0a 20 20 6d 73 67 2e 6f 70 20 3d 20 4d 53  g;.  msg.op = MS
3770: 47 5f 53 74 65 70 3b 0a 20 20 6d 73 67 2e 70 53  G_Step;.  msg.pS
3780: 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 73  tmt = pStmt;.  s
3790: 65 6e 64 54 6f 53 65 72 76 65 72 28 26 6d 73 67  endToServer(&msg
37a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 67 2e  );.  return msg.
37b0: 65 72 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73  errCode;.}.int s
37c0: 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f 72 65  qlite3_client_re
37d0: 73 65 74 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  set(sqlite3_stmt
37e0: 20 2a 70 53 74 6d 74 29 7b 0a 20 20 53 71 6c 4d   *pStmt){.  SqlM
37f0: 65 73 73 61 67 65 20 6d 73 67 3b 0a 20 20 6d 73  essage msg;.  ms
3800: 67 2e 6f 70 20 3d 20 4d 53 47 5f 52 65 73 65 74  g.op = MSG_Reset
3810: 3b 0a 20 20 6d 73 67 2e 70 53 74 6d 74 20 3d 20  ;.  msg.pStmt = 
3820: 70 53 74 6d 74 3b 0a 20 20 73 65 6e 64 54 6f 53  pStmt;.  sendToS
3830: 65 72 76 65 72 28 26 6d 73 67 29 3b 0a 20 20 72  erver(&msg);.  r
3840: 65 74 75 72 6e 20 6d 73 67 2e 65 72 72 43 6f 64  eturn msg.errCod
3850: 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
3860: 5f 63 6c 69 65 6e 74 5f 66 69 6e 61 6c 69 7a 65  _client_finalize
3870: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
3880: 53 74 6d 74 29 7b 0a 20 20 53 71 6c 4d 65 73 73  Stmt){.  SqlMess
3890: 61 67 65 20 6d 73 67 3b 0a 20 20 6d 73 67 2e 6f  age msg;.  msg.o
38a0: 70 20 3d 20 4d 53 47 5f 46 69 6e 61 6c 69 7a 65  p = MSG_Finalize
38b0: 3b 0a 20 20 6d 73 67 2e 70 53 74 6d 74 20 3d 20  ;.  msg.pStmt = 
38c0: 70 53 74 6d 74 3b 0a 20 20 73 65 6e 64 54 6f 53  pStmt;.  sendToS
38d0: 65 72 76 65 72 28 26 6d 73 67 29 3b 0a 20 20 72  erver(&msg);.  r
38e0: 65 74 75 72 6e 20 6d 73 67 2e 65 72 72 43 6f 64  eturn msg.errCod
38f0: 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
3900: 5f 63 6c 69 65 6e 74 5f 63 6c 6f 73 65 28 73 71  _client_close(sq
3910: 6c 69 74 65 33 20 2a 70 44 62 29 7b 0a 20 20 53  lite3 *pDb){.  S
3920: 71 6c 4d 65 73 73 61 67 65 20 6d 73 67 3b 0a 20  qlMessage msg;. 
3930: 20 6d 73 67 2e 6f 70 20 3d 20 4d 53 47 5f 43 6c   msg.op = MSG_Cl
3940: 6f 73 65 3b 0a 20 20 6d 73 67 2e 70 44 62 20 3d  ose;.  msg.pDb =
3950: 20 70 44 62 3b 0a 20 20 73 65 6e 64 54 6f 53 65   pDb;.  sendToSe
3960: 72 76 65 72 28 26 6d 73 67 29 3b 0a 20 20 72 65  rver(&msg);.  re
3970: 74 75 72 6e 20 6d 73 67 2e 65 72 72 43 6f 64 65  turn msg.errCode
3980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3990: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
39a0: 74 73 20 74 68 65 20 73 65 72 76 65 72 2e 20 20  ts the server.  
39b0: 54 6f 20 73 74 61 72 74 20 74 68 65 20 73 65 72  To start the ser
39c0: 76 65 72 2c 20 66 69 72 73 74 0a 2a 2a 20 6d 61  ver, first.** ma
39d0: 6b 65 20 73 75 72 65 20 67 2e 73 65 72 76 65 72  ke sure g.server
39e0: 48 61 6c 74 20 69 73 20 66 61 6c 73 65 2c 20 74  Halt is false, t
39f0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
3a00: 20 64 65 74 61 63 68 65 64 20 74 68 72 65 61 64   detached thread
3a10: 0a 2a 2a 20 6f 6e 20 74 68 69 73 20 70 72 6f 63  .** on this proc
3a20: 65 64 75 72 65 2e 20 20 53 65 65 20 74 68 65 20  edure.  See the 
3a30: 73 71 6c 69 74 65 33 5f 73 65 72 76 65 72 5f 73  sqlite3_server_s
3a40: 74 61 72 74 28 29 20 72 6f 75 74 69 6e 65 20 62  tart() routine b
3a50: 65 6c 6f 77 0a 2a 2a 20 66 6f 72 20 61 6e 20 65  elow.** for an e
3a60: 78 61 6d 70 6c 65 2e 20 20 54 68 69 73 20 70 72  xample.  This pr
3a70: 6f 63 65 64 75 72 65 20 6c 6f 6f 70 73 20 75 6e  ocedure loops un
3a80: 74 69 6c 20 67 2e 73 65 72 76 65 72 48 61 6c 74  til g.serverHalt
3a90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 74 72 75 65   becomes.** true
3aa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
3ab0: 65 33 5f 73 65 72 76 65 72 28 76 6f 69 64 20 2a  e3_server(void *
3ac0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 66 28 20  NotUsed){.  if( 
3ad0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 72  pthread_mutex_tr
3ae0: 79 6c 6f 63 6b 28 26 67 2e 73 65 72 76 65 72 4d  ylock(&g.serverM
3af0: 75 74 65 78 29 20 29 7b 0a 20 20 20 20 72 65 74  utex) ){.    ret
3b00: 75 72 6e 20 30 3b 20 20 2f 2a 20 41 6e 6f 74 68  urn 0;  /* Anoth
3b10: 65 72 20 73 65 72 76 65 72 20 69 73 20 61 6c 72  er server is alr
3b20: 65 61 64 79 20 72 75 6e 6e 69 6e 67 20 2a 2f 0a  eady running */.
3b30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e    }.  sqlite3_en
3b40: 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
3b50: 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  e(1);.  while( !
3b60: 67 2e 73 65 72 76 65 72 48 61 6c 74 20 29 7b 0a  g.serverHalt ){.
3b70: 20 20 20 20 53 71 6c 4d 65 73 73 61 67 65 20 2a      SqlMessage *
3b80: 70 4d 73 67 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  pMsg;..    /* Re
3b90: 6d 6f 76 65 20 74 68 65 20 6c 61 73 74 20 6d 65  move the last me
3ba0: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d  ssage from the m
3bb0: 65 73 73 61 67 65 20 71 75 65 75 65 2e 0a 20 20  essage queue..  
3bc0: 20 20 2a 2f 0a 20 20 20 20 70 74 68 72 65 61 64    */.    pthread
3bd0: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 67 2e 71  _mutex_lock(&g.q
3be0: 75 65 75 65 4d 75 74 65 78 29 3b 0a 20 20 20 20  ueueMutex);.    
3bf0: 77 68 69 6c 65 28 20 67 2e 70 51 75 65 75 65 54  while( g.pQueueT
3c00: 61 69 6c 3d 3d 30 20 26 26 20 67 2e 73 65 72 76  ail==0 && g.serv
3c10: 65 72 48 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  erHalt==0 ){.   
3c20: 20 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f     pthread_cond_
3c30: 77 61 69 74 28 26 67 2e 73 65 72 76 65 72 57 61  wait(&g.serverWa
3c40: 6b 65 75 70 2c 20 26 67 2e 71 75 65 75 65 4d 75  keup, &g.queueMu
3c50: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
3c60: 70 4d 73 67 20 3d 20 67 2e 70 51 75 65 75 65 54  pMsg = g.pQueueT
3c70: 61 69 6c 3b 0a 20 20 20 20 69 66 28 20 70 4d 73  ail;.    if( pMs
3c80: 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
3c90: 4d 73 67 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Msg->pPrev ){.  
3ca0: 20 20 20 20 20 20 70 4d 73 67 2d 3e 70 50 72 65        pMsg->pPre
3cb0: 76 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  v->pNext = 0;.  
3cc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3cd0: 20 20 20 67 2e 70 51 75 65 75 65 48 65 61 64 20     g.pQueueHead 
3ce0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
3cf0: 20 20 20 67 2e 70 51 75 65 75 65 54 61 69 6c 20     g.pQueueTail 
3d00: 3d 20 70 4d 73 67 2d 3e 70 50 72 65 76 3b 0a 20  = pMsg->pPrev;. 
3d10: 20 20 20 7d 0a 20 20 20 20 70 74 68 72 65 61 64     }.    pthread
3d20: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 67  _mutex_unlock(&g
3d30: 2e 71 75 65 75 65 4d 75 74 65 78 29 3b 0a 20 20  .queueMutex);.  
3d40: 20 20 69 66 28 20 70 4d 73 67 3d 3d 30 20 29 20    if( pMsg==0 ) 
3d50: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50  break;..    /* P
3d60: 72 6f 63 65 73 73 20 74 68 65 20 6d 65 73 73 61  rocess the messa
3d70: 67 65 20 6a 75 73 74 20 72 65 6d 6f 76 65 64 0a  ge just removed.
3d80: 20 20 20 20 2a 2f 0a 20 20 20 20 70 74 68 72 65      */.    pthre
3d90: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70  ad_mutex_lock(&p
3da0: 4d 73 67 2d 3e 63 6c 69 65 6e 74 4d 75 74 65 78  Msg->clientMutex
3db0: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  );.    switch( p
3dc0: 4d 73 67 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  Msg->op ){.     
3dd0: 20 63 61 73 65 20 4d 53 47 5f 4f 70 65 6e 3a 20   case MSG_Open: 
3de0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 73 67 2d 3e  {.        pMsg->
3df0: 65 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65  errCode = sqlite
3e00: 33 5f 6f 70 65 6e 28 70 4d 73 67 2d 3e 7a 49 6e  3_open(pMsg->zIn
3e10: 2c 20 26 70 4d 73 67 2d 3e 70 44 62 29 3b 0a 20  , &pMsg->pDb);. 
3e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3e40: 20 4d 53 47 5f 50 72 65 70 61 72 65 3a 20 7b 0a   MSG_Prepare: {.
3e50: 20 20 20 20 20 20 20 20 70 4d 73 67 2d 3e 65 72          pMsg->er
3e60: 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  rCode = sqlite3_
3e70: 70 72 65 70 61 72 65 28 70 4d 73 67 2d 3e 70 44  prepare(pMsg->pD
3e80: 62 2c 20 70 4d 73 67 2d 3e 7a 49 6e 2c 20 70 4d  b, pMsg->zIn, pM
3e90: 73 67 2d 3e 6e 42 79 74 65 2c 0a 20 20 20 20 20  sg->nByte,.     
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 20 26 70 4d 73 67 2d 3e 70 53 74 6d 74 2c     &pMsg->pStmt,
3ed0: 20 26 70 4d 73 67 2d 3e 7a 4f 75 74 29 3b 0a 20   &pMsg->zOut);. 
3ee0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3ef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3f00: 20 4d 53 47 5f 53 74 65 70 3a 20 7b 0a 20 20 20   MSG_Step: {.   
3f10: 20 20 20 20 20 70 4d 73 67 2d 3e 65 72 72 43 6f       pMsg->errCo
3f20: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  de = sqlite3_ste
3f30: 70 28 70 4d 73 67 2d 3e 70 53 74 6d 74 29 3b 0a  p(pMsg->pStmt);.
3f40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3f60: 65 20 4d 53 47 5f 52 65 73 65 74 3a 20 7b 0a 20  e MSG_Reset: {. 
3f70: 20 20 20 20 20 20 20 70 4d 73 67 2d 3e 65 72 72         pMsg->err
3f80: 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 72  Code = sqlite3_r
3f90: 65 73 65 74 28 70 4d 73 67 2d 3e 70 53 74 6d 74  eset(pMsg->pStmt
3fa0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3fb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3fc0: 63 61 73 65 20 4d 53 47 5f 46 69 6e 61 6c 69 7a  case MSG_Finaliz
3fd0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4d 73  e: {.        pMs
3fe0: 67 2d 3e 65 72 72 43 6f 64 65 20 3d 20 73 71 6c  g->errCode = sql
3ff0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 4d  ite3_finalize(pM
4000: 73 67 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  sg->pStmt);.    
4010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4020: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4d 53   }.      case MS
4030: 47 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 20 20 20  G_Close: {.     
4040: 20 20 20 70 4d 73 67 2d 3e 65 72 72 43 6f 64 65     pMsg->errCode
4050: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
4060: 28 70 4d 73 67 2d 3e 70 44 62 29 3b 0a 20 20 20  (pMsg->pDb);.   
4070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4080: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
4090: 2a 20 53 69 67 6e 61 6c 20 74 68 65 20 63 6c 69  * Signal the cli
40a0: 65 6e 74 20 74 68 61 74 20 74 68 65 20 6d 65 73  ent that the mes
40b0: 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 70 72  sage has been pr
40c0: 6f 63 65 73 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  ocessed..    */.
40d0: 20 20 20 20 70 4d 73 67 2d 3e 6f 70 20 3d 20 4d      pMsg->op = M
40e0: 53 47 5f 44 6f 6e 65 3b 0a 20 20 20 20 70 74 68  SG_Done;.    pth
40f0: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
4100: 6b 28 26 70 4d 73 67 2d 3e 63 6c 69 65 6e 74 4d  k(&pMsg->clientM
4110: 75 74 65 78 29 3b 0a 20 20 20 20 70 74 68 72 65  utex);.    pthre
4120: 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 26  ad_cond_signal(&
4130: 70 4d 73 67 2d 3e 63 6c 69 65 6e 74 57 61 6b 65  pMsg->clientWake
4140: 75 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  up);.  }.  sqlit
4150: 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
4160: 70 28 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d  p();.  pthread_m
4170: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 67 2e 73  utex_unlock(&g.s
4180: 65 72 76 65 72 4d 75 74 65 78 29 3b 0a 20 20 72  erverMutex);.  r
4190: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
41a0: 2a 20 53 74 61 72 74 20 61 20 73 65 72 76 65 72  * Start a server
41b0: 20 74 68 72 65 61 64 20 69 66 20 6f 6e 65 20 69   thread if one i
41c0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 75  s not already ru
41d0: 6e 6e 69 6e 67 2e 20 20 49 66 20 74 68 65 72 65  nning.  If there
41e0: 0a 2a 2a 20 69 73 20 61 6c 65 61 64 79 20 61 20  .** is aleady a 
41f0: 73 65 72 76 65 72 20 74 68 72 65 61 64 20 72 75  server thread ru
4200: 6e 6e 69 6e 67 2c 20 74 68 65 20 6e 65 77 20 74  nning, the new t
4210: 68 72 65 61 64 20 77 69 6c 6c 20 71 75 69 63 6b  hread will quick
4220: 6c 79 0a 2a 2a 20 64 69 65 20 61 6e 64 20 74 68  ly.** die and th
4230: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 65 66  is routine is ef
4240: 66 65 63 74 69 76 65 6c 79 20 61 20 6e 6f 2d 6f  fectively a no-o
4250: 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  p..*/.void sqlit
4260: 65 33 5f 73 65 72 76 65 72 5f 73 74 61 72 74 28  e3_server_start(
4270: 76 6f 69 64 29 7b 0a 20 20 70 74 68 72 65 61 64  void){.  pthread
4280: 5f 74 20 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  _t x;.  int rc;.
4290: 20 20 67 2e 73 65 72 76 65 72 48 61 6c 74 20 3d    g.serverHalt =
42a0: 20 30 3b 0a 20 20 72 63 20 3d 20 70 74 68 72 65   0;.  rc = pthre
42b0: 61 64 5f 63 72 65 61 74 65 28 26 78 2c 20 30 2c  ad_create(&x, 0,
42c0: 20 73 71 6c 69 74 65 33 5f 73 65 72 76 65 72 2c   sqlite3_server,
42d0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   0);.  if( rc==0
42e0: 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f   ){.    pthread_
42f0: 64 65 74 61 63 68 28 78 29 3b 0a 20 20 7d 0a 7d  detach(x);.  }.}
4300: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 73 65 72  ../*.** If a ser
4310: 76 65 72 20 74 68 72 65 61 64 20 69 73 20 72 75  ver thread is ru
4320: 6e 6e 69 6e 67 2c 20 74 68 65 6e 20 73 74 6f 70  nning, then stop
4330: 20 69 74 2e 20 20 49 66 20 6e 6f 20 73 65 72 76   it.  If no serv
4340: 65 72 20 69 73 0a 2a 2a 20 72 75 6e 6e 69 6e 67  er is.** running
4350: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
4360: 73 20 65 66 66 65 63 74 69 76 65 6c 79 20 61 20  s effectively a 
4370: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  no-op..**.** Thi
4380: 73 20 72 6f 75 74 69 6e 65 20 77 61 69 74 73 20  s routine waits 
4390: 75 6e 74 69 6c 20 74 68 65 20 73 65 72 76 65 72  until the server
43a0: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 73 74   has actually st
43b0: 6f 70 70 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  opped before.** 
43c0: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  returning..*/.vo
43d0: 69 64 20 73 71 6c 69 74 65 33 5f 73 65 72 76 65  id sqlite3_serve
43e0: 72 5f 73 74 6f 70 28 76 6f 69 64 29 7b 0a 20 20  r_stop(void){.  
43f0: 67 2e 73 65 72 76 65 72 48 61 6c 74 20 3d 20 31  g.serverHalt = 1
4400: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64  ;.  pthread_cond
4410: 5f 62 72 6f 61 64 63 61 73 74 28 26 67 2e 73 65  _broadcast(&g.se
4420: 72 76 65 72 57 61 6b 65 75 70 29 3b 0a 20 20 70  rverWakeup);.  p
4430: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
4440: 6b 28 26 67 2e 73 65 72 76 65 72 4d 75 74 65 78  k(&g.serverMutex
4450: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  );.  pthread_mut
4460: 65 78 5f 75 6e 6c 6f 63 6b 28 26 67 2e 73 65 72  ex_unlock(&g.ser
4470: 76 65 72 4d 75 74 65 78 29 3b 0a 7d 0a 0a 23 65  verMutex);.}..#e
4480: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
4490: 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 29 20  SQLITE_OS_UNIX) 
44a0: 26 26 20 4f 53 5f 55 4e 49 58 20 26 26 20 53 51  && OS_UNIX && SQ
44b0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
44c0: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
44d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 52 56  ined(SQLITE_SERV
44e0: 45 52 29 20 2a 2f 0a                             ER) */.