/ Hex Artifact Content
Login

Artifact 2f99eb2837dfa06a4aacf24af24c6affdf66a84f:


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 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
24c0: 58 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  X && SQLITE_THRE
24d0: 41 44 53 41 46 45 0a 0a 2f 2a 0a 2a 2a 20 57 65  ADSAFE../*.** We
24e0: 20 72 65 71 75 69 72 65 20 6f 6e 6c 79 20 70 74   require only pt
24f0: 68 72 65 61 64 73 20 61 6e 64 20 74 68 65 20 70  hreads and the p
2500: 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20  ublic interface 
2510: 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  of SQLite..*/.#i
2520: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
2530: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  h>.#include "sql
2540: 69 74 65 33 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d  ite3.h"../*.** M
2550: 65 73 73 61 67 65 73 20 61 72 65 20 70 61 73 73  essages are pass
2560: 65 64 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 74  ed from client t
2570: 6f 20 73 65 72 76 65 72 20 61 6e 64 20 62 61 63  o server and bac
2580: 6b 20 61 67 61 69 6e 20 61 73 20 0a 2a 2a 20 69  k again as .** i
2590: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
25a0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
25b0: 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ure..*/.typedef 
25c0: 73 74 72 75 63 74 20 53 71 6c 4d 65 73 73 61 67  struct SqlMessag
25d0: 65 20 53 71 6c 4d 65 73 73 61 67 65 3b 0a 73 74  e SqlMessage;.st
25e0: 72 75 63 74 20 53 71 6c 4d 65 73 73 61 67 65 20  ruct SqlMessage 
25f0: 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  {.  int op;     
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 2f 2a 20 4f 70 63 6f 64 65 20 66 6f 72 20 74   /* Opcode for t
2620: 68 65 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  he message */.  
2630: 73 71 6c 69 74 65 33 20 2a 70 44 62 3b 20 20 20  sqlite3 *pDb;   
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2650: 54 68 65 20 53 51 4c 69 74 65 20 63 6f 6e 6e 65  The SQLite conne
2660: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
2670: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
2680: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 70 65          /* A spe
2690: 63 69 66 69 63 20 73 74 61 74 65 6d 65 6e 74 20  cific statement 
26a0: 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65  */.  int errCode
26b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26c0: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
26d0: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 20 20 63 6f  returned */.  co
26e0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20  nst char *zIn;  
26f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2700: 70 75 74 20 66 69 6c 65 6e 61 6d 65 20 6f 72 20  put filename or 
2710: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
2720: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 7a  /* Size of the z
2750: 49 6e 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  In parameter for
2760: 20 70 72 65 70 61 72 65 28 29 20 2a 2f 0a 20 20   prepare() */.  
2770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74  const char *zOut
2780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2790: 54 61 69 6c 20 6f 66 20 74 68 65 20 53 51 4c 20  Tail of the SQL 
27a0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
27b0: 71 6c 4d 65 73 73 61 67 65 20 2a 70 4e 65 78 74  qlMessage *pNext
27c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
27d0: 65 78 74 20 6d 65 73 73 61 67 65 20 69 6e 20 74  ext message in t
27e0: 68 65 20 71 75 65 75 65 20 2a 2f 0a 20 20 53 71  he queue */.  Sq
27f0: 6c 4d 65 73 73 61 67 65 20 2a 70 50 72 65 76 3b  lMessage *pPrev;
2800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
2810: 65 76 69 6f 75 73 20 6d 65 73 73 61 67 65 20 69  evious message i
2820: 6e 20 74 68 65 20 71 75 65 75 65 20 2a 2f 0a 20  n the queue */. 
2830: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74   pthread_mutex_t
2840: 20 63 6c 69 65 6e 74 4d 75 74 65 78 3b 20 2f 2a   clientMutex; /*
2850: 20 48 6f 6c 64 20 74 68 69 73 20 6d 75 74 65 78   Hold this mutex
2860: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d   to access the m
2870: 65 73 73 61 67 65 20 2a 2f 0a 20 20 70 74 68 72  essage */.  pthr
2880: 65 61 64 5f 63 6f 6e 64 5f 74 20 63 6c 69 65 6e  ead_cond_t clien
2890: 74 57 61 6b 65 75 70 3b 20 2f 2a 20 53 69 67 6e  tWakeup; /* Sign
28a0: 61 6c 20 74 6f 20 77 61 6b 65 20 75 70 20 74 68  al to wake up th
28b0: 65 20 63 6c 69 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  e client */.};..
28c0: 2f 2a 0a 2a 2a 20 4c 65 67 61 6c 20 76 61 6c 75  /*.** Legal valu
28d0: 65 73 20 66 6f 72 20 53 71 6c 4d 65 73 73 61 67  es for SqlMessag
28e0: 65 2e 6f 70 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e.op.*/.#define 
28f0: 4d 53 47 5f 4f 70 65 6e 20 20 20 20 20 20 20 31  MSG_Open       1
2900: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65    /* sqlite3_ope
2910: 6e 28 7a 49 6e 2c 20 26 70 44 62 29 20 2a 2f 0a  n(zIn, &pDb) */.
2920: 23 64 65 66 69 6e 65 20 4d 53 47 5f 50 72 65 70  #define MSG_Prep
2930: 61 72 65 20 20 20 20 32 20 20 2f 2a 20 73 71 6c  are    2  /* sql
2940: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
2950: 2c 20 7a 49 6e 2c 20 6e 42 79 74 65 2c 20 26 70  , zIn, nByte, &p
2960: 53 74 6d 74 2c 20 26 7a 4f 75 74 29 20 2a 2f 0a  Stmt, &zOut) */.
2970: 23 64 65 66 69 6e 65 20 4d 53 47 5f 53 74 65 70  #define MSG_Step
2980: 20 20 20 20 20 20 20 33 20 20 2f 2a 20 73 71 6c         3  /* sql
2990: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
29a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 53 47 5f   */.#define MSG_
29b0: 52 65 73 65 74 20 20 20 20 20 20 34 20 20 2f 2a  Reset      4  /*
29c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
29d0: 53 74 6d 74 29 20 2a 2f 0a 23 64 65 66 69 6e 65  Stmt) */.#define
29e0: 20 4d 53 47 5f 46 69 6e 61 6c 69 7a 65 20 20 20   MSG_Finalize   
29f0: 35 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69  5  /* sqlite3_fi
2a00: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 20 2a 2f  nalize(pStmt) */
2a10: 0a 23 64 65 66 69 6e 65 20 4d 53 47 5f 43 6c 6f  .#define MSG_Clo
2a20: 73 65 20 20 20 20 20 20 36 20 20 2f 2a 20 73 71  se      6  /* sq
2a30: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 29  lite3_close(pDb)
2a40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 53 47 5f   */.#define MSG_
2a50: 44 6f 6e 65 20 20 20 20 20 20 20 37 20 20 2f 2a  Done       7  /*
2a60: 20 53 65 72 76 65 72 20 68 61 73 20 66 69 6e 69   Server has fini
2a70: 73 68 65 64 20 77 69 74 68 20 74 68 69 73 20 6d  shed with this m
2a80: 65 73 73 61 67 65 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  essage */.../*.*
2a90: 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
2aa0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 73 65  ion about the se
2ab0: 72 76 65 72 20 69 73 20 73 74 6f 72 65 64 20 69  rver is stored i
2ac0: 6e 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61  n a static varia
2ad0: 62 6c 65 0a 2a 2a 20 6e 61 6d 65 64 20 22 67 22  ble.** named "g"
2ae0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2f 0a   as follows:.*/.
2af0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 65  static struct Se
2b00: 72 76 65 72 53 74 61 74 65 20 7b 0a 20 20 70 74  rverState {.  pt
2b10: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 71 75  hread_mutex_t qu
2b20: 65 75 65 4d 75 74 65 78 3b 20 20 20 2f 2a 20 48  eueMutex;   /* H
2b30: 6f 6c 64 20 74 68 69 73 20 6d 75 74 65 78 20 74  old this mutex t
2b40: 6f 20 61 63 63 65 73 73 20 74 68 65 20 6d 73 67  o access the msg
2b50: 20 71 75 65 75 65 20 2a 2f 0a 20 20 70 74 68 72   queue */.  pthr
2b60: 65 61 64 5f 6d 75 74 65 78 5f 74 20 73 65 72 76  ead_mutex_t serv
2b70: 65 72 4d 75 74 65 78 3b 20 20 2f 2a 20 48 65 6c  erMutex;  /* Hel
2b80: 64 20 62 79 20 74 68 65 20 73 65 72 76 65 72 20  d by the server 
2b90: 77 68 69 6c 65 20 69 74 20 69 73 20 72 75 6e 6e  while it is runn
2ba0: 69 6e 67 20 2a 2f 0a 20 20 70 74 68 72 65 61 64  ing */.  pthread
2bb0: 5f 63 6f 6e 64 5f 74 20 73 65 72 76 65 72 57 61  _cond_t serverWa
2bc0: 6b 65 75 70 3b 20 20 2f 2a 20 53 69 67 6e 61 6c  keup;  /* Signal
2bd0: 20 74 68 69 73 20 63 6f 6e 64 76 61 72 20 74 6f   this condvar to
2be0: 20 77 61 6b 65 20 75 70 20 74 68 65 20 73 65 72   wake up the ser
2bf0: 76 65 72 20 2a 2f 0a 20 20 76 6f 6c 61 74 69 6c  ver */.  volatil
2c00: 65 20 69 6e 74 20 73 65 72 76 65 72 48 61 6c 74  e int serverHalt
2c10: 3b 20 20 20 20 20 20 2f 2a 20 53 65 72 76 65 72  ;      /* Server
2c20: 20 68 61 6c 74 73 20 69 74 73 65 6c 66 20 77 68   halts itself wh
2c30: 65 6e 20 74 72 75 65 20 2a 2f 0a 20 20 53 71 6c  en true */.  Sql
2c40: 4d 65 73 73 61 67 65 20 2a 70 51 75 65 75 65 48  Message *pQueueH
2c50: 65 61 64 3b 20 20 20 20 20 20 20 2f 2a 20 48 65  ead;       /* He
2c60: 61 64 20 6f 66 20 74 68 65 20 6d 65 73 73 61 67  ad of the messag
2c70: 65 20 71 75 65 75 65 20 2a 2f 0a 20 20 53 71 6c  e queue */.  Sql
2c80: 4d 65 73 73 61 67 65 20 2a 70 51 75 65 75 65 54  Message *pQueueT
2c90: 61 69 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 61  ail;       /* Ta
2ca0: 69 6c 20 6f 66 20 74 68 65 20 6d 65 73 73 61 67  il of the messag
2cb0: 65 20 71 75 65 75 65 20 2a 2f 0a 7d 20 67 20 3d  e queue */.} g =
2cc0: 20 7b 0a 20 20 50 54 48 52 45 41 44 5f 4d 55 54   {.  PTHREAD_MUT
2cd0: 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0a  EX_INITIALIZER,.
2ce0: 20 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f    PTHREAD_MUTEX_
2cf0: 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0a 20 20 50  INITIALIZER,.  P
2d00: 54 48 52 45 41 44 5f 43 4f 4e 44 5f 49 4e 49 54  THREAD_COND_INIT
2d10: 49 41 4c 49 5a 45 52 2c 0a 7d 3b 0a 0a 2f 2a 0a  IALIZER,.};../*.
2d20: 2a 2a 20 53 65 6e 64 20 61 20 6d 65 73 73 61 67  ** Send a messag
2d30: 65 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 2e  e to the server.
2d40: 20 20 42 6c 6f 63 6b 20 75 6e 74 69 6c 20 77 65    Block until we
2d50: 20 67 65 74 20 61 20 72 65 70 6c 79 2e 0a 2a 2a   get a reply..**
2d60: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 61 6e  .** The mutex an
2d70: 64 20 63 6f 6e 64 69 74 69 6f 6e 20 76 61 72 69  d condition vari
2d80: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 65 73 73  able in the mess
2d90: 61 67 65 20 61 72 65 20 75 6e 69 6e 69 74 69 61  age are uninitia
2da0: 6c 69 7a 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  lized.** when th
2db0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2dc0: 6c 6c 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  lled.  This rout
2dd0: 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f  ine takes care o
2de0: 66 20 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 69  f .** initializi
2df0: 6e 67 20 74 68 65 6d 20 61 6e 64 20 64 65 73 74  ng them and dest
2e00: 72 6f 79 69 6e 67 20 74 68 65 6d 20 77 68 65 6e  roying them when
2e10: 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
2e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e30: 20 73 65 6e 64 54 6f 53 65 72 76 65 72 28 53 71   sendToServer(Sq
2e40: 6c 4d 65 73 73 61 67 65 20 2a 70 4d 73 67 29 7b  lMessage *pMsg){
2e50: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2e60: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 63   the mutex and c
2e70: 6f 6e 64 69 74 69 6f 6e 20 76 61 72 69 61 62 6c  ondition variabl
2e80: 65 20 6f 6e 20 74 68 65 20 6d 65 73 73 61 67 65  e on the message
2e90: 0a 20 20 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f  .  */.  pthread_
2ea0: 6d 75 74 65 78 5f 69 6e 69 74 28 26 70 4d 73 67  mutex_init(&pMsg
2eb0: 2d 3e 63 6c 69 65 6e 74 4d 75 74 65 78 2c 20 30  ->clientMutex, 0
2ec0: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 6f 6e  );.  pthread_con
2ed0: 64 5f 69 6e 69 74 28 26 70 4d 73 67 2d 3e 63 6c  d_init(&pMsg->cl
2ee0: 69 65 6e 74 57 61 6b 65 75 70 2c 20 30 29 3b 0a  ientWakeup, 0);.
2ef0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6d 65  .  /* Add the me
2f00: 73 73 61 67 65 20 74 6f 20 74 68 65 20 68 65 61  ssage to the hea
2f10: 64 20 6f 66 20 74 68 65 20 73 65 72 76 65 72 27  d of the server'
2f20: 73 20 6d 65 73 73 61 67 65 20 71 75 65 75 65 2e  s message queue.
2f30: 0a 20 20 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f  .  */.  pthread_
2f40: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 67 2e 71 75  mutex_lock(&g.qu
2f50: 65 75 65 4d 75 74 65 78 29 3b 0a 20 20 70 4d 73  eueMutex);.  pMs
2f60: 67 2d 3e 70 4e 65 78 74 20 3d 20 67 2e 70 51 75  g->pNext = g.pQu
2f70: 65 75 65 48 65 61 64 3b 0a 20 20 69 66 28 20 67  eueHead;.  if( g
2f80: 2e 70 51 75 65 75 65 48 65 61 64 3d 3d 30 20 29  .pQueueHead==0 )
2f90: 7b 0a 20 20 20 20 67 2e 70 51 75 65 75 65 54 61  {.    g.pQueueTa
2fa0: 69 6c 20 3d 20 70 4d 73 67 3b 0a 20 20 7d 65 6c  il = pMsg;.  }el
2fb0: 73 65 7b 0a 20 20 20 20 67 2e 70 51 75 65 75 65  se{.    g.pQueue
2fc0: 48 65 61 64 2d 3e 70 50 72 65 76 20 3d 20 70 4d  Head->pPrev = pM
2fd0: 73 67 3b 0a 20 20 7d 0a 20 20 70 4d 73 67 2d 3e  sg;.  }.  pMsg->
2fe0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 67 2e 70  pPrev = 0;.  g.p
2ff0: 51 75 65 75 65 48 65 61 64 20 3d 20 70 4d 73 67  QueueHead = pMsg
3000: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  ;.  pthread_mute
3010: 78 5f 75 6e 6c 6f 63 6b 28 26 67 2e 71 75 65 75  x_unlock(&g.queu
3020: 65 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  eMutex);..  /* S
3030: 69 67 6e 61 6c 20 74 68 65 20 73 65 72 76 65 72  ignal the server
3040: 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 6d 65   that the new me
3050: 73 73 61 67 65 20 68 61 73 20 62 65 20 71 75 65  ssage has be que
3060: 75 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 62  ued, then.  ** b
3070: 6c 6f 63 6b 20 77 61 69 74 69 6e 67 20 66 6f 72  lock waiting for
3080: 20 74 68 65 20 73 65 72 76 65 72 20 74 6f 20 70   the server to p
3090: 72 6f 63 65 73 73 20 74 68 65 20 6d 65 73 73 61  rocess the messa
30a0: 67 65 2e 0a 20 20 2a 2f 0a 20 20 70 74 68 72 65  ge..  */.  pthre
30b0: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70  ad_mutex_lock(&p
30c0: 4d 73 67 2d 3e 63 6c 69 65 6e 74 4d 75 74 65 78  Msg->clientMutex
30d0: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 6f 6e  );.  pthread_con
30e0: 64 5f 73 69 67 6e 61 6c 28 26 67 2e 73 65 72 76  d_signal(&g.serv
30f0: 65 72 57 61 6b 65 75 70 29 3b 0a 20 20 77 68 69  erWakeup);.  whi
3100: 6c 65 28 20 70 4d 73 67 2d 3e 6f 70 21 3d 4d 53  le( pMsg->op!=MS
3110: 47 5f 44 6f 6e 65 20 29 7b 0a 20 20 20 20 70 74  G_Done ){.    pt
3120: 68 72 65 61 64 5f 63 6f 6e 64 5f 77 61 69 74 28  hread_cond_wait(
3130: 26 70 4d 73 67 2d 3e 63 6c 69 65 6e 74 57 61 6b  &pMsg->clientWak
3140: 65 75 70 2c 20 26 70 4d 73 67 2d 3e 63 6c 69 65  eup, &pMsg->clie
3150: 6e 74 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ntMutex);.  }.  
3160: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
3170: 6c 6f 63 6b 28 26 70 4d 73 67 2d 3e 63 6c 69 65  lock(&pMsg->clie
3180: 6e 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ntMutex);..  /* 
3190: 44 65 73 74 72 6f 79 20 74 68 65 20 6d 75 74 65  Destroy the mute
31a0: 78 20 61 6e 64 20 63 6f 6e 64 69 74 69 6f 6e 20  x and condition 
31b0: 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68 65 20  variable of the 
31c0: 6d 65 73 73 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  message..  */.  
31d0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 64 65  pthread_mutex_de
31e0: 73 74 72 6f 79 28 26 70 4d 73 67 2d 3e 63 6c 69  stroy(&pMsg->cli
31f0: 65 6e 74 4d 75 74 65 78 29 3b 0a 20 20 70 74 68  entMutex);.  pth
3200: 72 65 61 64 5f 63 6f 6e 64 5f 64 65 73 74 72 6f  read_cond_destro
3210: 79 28 26 70 4d 73 67 2d 3e 63 6c 69 65 6e 74 57  y(&pMsg->clientW
3220: 61 6b 65 75 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  akeup);.}../*.**
3230: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 36   The following 6
3240: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 6c   routines are cl
3250: 69 65 6e 74 2d 73 69 64 65 20 69 6d 70 6c 65 6d  ient-side implem
3260: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
3270: 0a 2a 2a 20 63 6f 72 65 20 53 51 4c 69 74 65 20  .** core SQLite 
3280: 69 6e 74 65 72 66 61 63 65 73 3a 0a 2a 2a 0a 2a  interfaces:.**.*
3290: 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
32a0: 5f 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20  _open.**        
32b0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 0a  sqlite3_prepare.
32c0: 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  **        sqlite
32d0: 33 5f 73 74 65 70 0a 2a 2a 20 20 20 20 20 20 20  3_step.**       
32e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 0a 2a   sqlite3_reset.*
32f0: 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
3300: 5f 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 20  _finalize.**    
3310: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
3320: 65 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 73 20  e.**.** Clients 
3330: 73 68 6f 75 6c 64 20 75 73 65 20 74 68 65 20 66  should use the f
3340: 6f 6c 6c 6f 77 69 6e 67 20 63 6c 69 65 6e 74 2d  ollowing client-
3350: 73 69 64 65 20 72 6f 75 74 69 6e 65 73 20 69 6e  side routines in
3360: 73 74 65 61 64 20 6f 66 20 0a 2a 2a 20 74 68 65  stead of .** the
3370: 20 63 6f 72 65 20 72 6f 75 74 69 6e 65 73 20 61   core routines a
3380: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  bove..**.**     
3390: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e     sqlite3_clien
33a0: 74 5f 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 20  t_open.**       
33b0: 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f   sqlite3_client_
33c0: 70 72 65 70 61 72 65 0a 2a 2a 20 20 20 20 20 20  prepare.**      
33d0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74    sqlite3_client
33e0: 5f 73 74 65 70 0a 2a 2a 20 20 20 20 20 20 20 20  _step.**        
33f0: 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f 72  sqlite3_client_r
3400: 65 73 65 74 0a 2a 2a 20 20 20 20 20 20 20 20 73  eset.**        s
3410: 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f 66 69  qlite3_client_fi
3420: 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  nalize.**       
3430: 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e 74 5f   sqlite3_client_
3440: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 45 61 63 68  close.**.** Each
3450: 20 6f 66 20 74 68 65 73 65 20 72 6f 75 74 69 6e   of these routin
3460: 65 73 20 63 72 65 61 74 65 73 20 61 20 6d 65 73  es creates a mes
3470: 73 61 67 65 20 66 6f 72 20 74 68 65 20 64 65 73  sage for the des
3480: 69 72 65 64 20 6f 70 65 72 61 74 69 6f 6e 2c 0a  ired operation,.
3490: 2a 2a 20 73 65 6e 64 73 20 74 68 61 74 20 6d 65  ** sends that me
34a0: 73 73 61 67 65 20 74 6f 20 74 68 65 20 73 65 72  ssage to the ser
34b0: 76 65 72 2c 20 77 61 69 74 73 20 66 6f 72 20 74  ver, waits for t
34c0: 68 65 20 73 65 72 76 65 72 20 74 6f 20 70 72 6f  he server to pro
34d0: 63 65 73 73 0a 2a 2a 20 74 68 65 6e 20 6d 65 73  cess.** then mes
34e0: 73 61 67 65 20 61 6e 64 20 72 65 74 75 72 6e 20  sage and return 
34f0: 61 20 72 65 73 70 6f 6e 73 65 2e 0a 2a 2f 0a 69  a response..*/.i
3500: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e  nt sqlite3_clien
3510: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
3520: 72 20 2a 7a 44 61 74 61 62 61 73 65 4e 61 6d 65  r *zDatabaseName
3530: 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62  , sqlite3 **ppDb
3540: 29 7b 0a 20 20 53 71 6c 4d 65 73 73 61 67 65 20  ){.  SqlMessage 
3550: 6d 73 67 3b 0a 20 20 6d 73 67 2e 6f 70 20 3d 20  msg;.  msg.op = 
3560: 4d 53 47 5f 4f 70 65 6e 3b 0a 20 20 6d 73 67 2e  MSG_Open;.  msg.
3570: 7a 49 6e 20 3d 20 7a 44 61 74 61 62 61 73 65 4e  zIn = zDatabaseN
3580: 61 6d 65 3b 0a 20 20 73 65 6e 64 54 6f 53 65 72  ame;.  sendToSer
3590: 76 65 72 28 26 6d 73 67 29 3b 0a 20 20 2a 70 70  ver(&msg);.  *pp
35a0: 44 62 20 3d 20 6d 73 67 2e 70 44 62 3b 0a 20 20  Db = msg.pDb;.  
35b0: 72 65 74 75 72 6e 20 6d 73 67 2e 65 72 72 43 6f  return msg.errCo
35c0: 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  de;.}.int sqlite
35d0: 33 5f 63 6c 69 65 6e 74 5f 70 72 65 70 61 72 65  3_client_prepare
35e0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 44 62  (.  sqlite3 *pDb
35f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
3600: 7a 53 71 6c 2c 0a 20 20 69 6e 74 20 6e 42 79 74  zSql,.  int nByt
3610: 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  e,.  sqlite3_stm
3620: 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f  t **ppStmt,.  co
3630: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69  nst char **pzTai
3640: 6c 0a 29 7b 0a 20 20 53 71 6c 4d 65 73 73 61 67  l.){.  SqlMessag
3650: 65 20 6d 73 67 3b 0a 20 20 6d 73 67 2e 6f 70 20  e msg;.  msg.op 
3660: 3d 20 4d 53 47 5f 50 72 65 70 61 72 65 3b 0a 20  = MSG_Prepare;. 
3670: 20 6d 73 67 2e 70 44 62 20 3d 20 70 44 62 3b 0a   msg.pDb = pDb;.
3680: 20 20 6d 73 67 2e 7a 49 6e 20 3d 20 7a 53 71 6c    msg.zIn = zSql
3690: 3b 0a 20 20 6d 73 67 2e 6e 42 79 74 65 20 3d 20  ;.  msg.nByte = 
36a0: 6e 42 79 74 65 3b 0a 20 20 73 65 6e 64 54 6f 53  nByte;.  sendToS
36b0: 65 72 76 65 72 28 26 6d 73 67 29 3b 0a 20 20 2a  erver(&msg);.  *
36c0: 70 70 53 74 6d 74 20 3d 20 6d 73 67 2e 70 53 74  ppStmt = msg.pSt
36d0: 6d 74 3b 0a 20 20 69 66 28 20 70 7a 54 61 69 6c  mt;.  if( pzTail
36e0: 20 29 20 2a 70 7a 54 61 69 6c 20 3d 20 6d 73 67   ) *pzTail = msg
36f0: 2e 7a 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20  .zOut;.  return 
3700: 6d 73 67 2e 65 72 72 43 6f 64 65 3b 0a 7d 0a 69  msg.errCode;.}.i
3710: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 69 65 6e  nt sqlite3_clien
3720: 74 5f 73 74 65 70 28 73 71 6c 69 74 65 33 5f 73  t_step(sqlite3_s
3730: 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 53  tmt *pStmt){.  S
3740: 71 6c 4d 65 73 73 61 67 65 20 6d 73 67 3b 0a 20  qlMessage msg;. 
3750: 20 6d 73 67 2e 6f 70 20 3d 20 4d 53 47 5f 53 74   msg.op = MSG_St
3760: 65 70 3b 0a 20 20 6d 73 67 2e 70 53 74 6d 74 20  ep;.  msg.pStmt 
3770: 3d 20 70 53 74 6d 74 3b 0a 20 20 73 65 6e 64 54  = pStmt;.  sendT
3780: 6f 53 65 72 76 65 72 28 26 6d 73 67 29 3b 0a 20  oServer(&msg);. 
3790: 20 72 65 74 75 72 6e 20 6d 73 67 2e 65 72 72 43   return msg.errC
37a0: 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ode;.}.int sqlit
37b0: 65 33 5f 63 6c 69 65 6e 74 5f 72 65 73 65 74 28  e3_client_reset(
37c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
37d0: 74 6d 74 29 7b 0a 20 20 53 71 6c 4d 65 73 73 61  tmt){.  SqlMessa
37e0: 67 65 20 6d 73 67 3b 0a 20 20 6d 73 67 2e 6f 70  ge msg;.  msg.op
37f0: 20 3d 20 4d 53 47 5f 52 65 73 65 74 3b 0a 20 20   = MSG_Reset;.  
3800: 6d 73 67 2e 70 53 74 6d 74 20 3d 20 70 53 74 6d  msg.pStmt = pStm
3810: 74 3b 0a 20 20 73 65 6e 64 54 6f 53 65 72 76 65  t;.  sendToServe
3820: 72 28 26 6d 73 67 29 3b 0a 20 20 72 65 74 75 72  r(&msg);.  retur
3830: 6e 20 6d 73 67 2e 65 72 72 43 6f 64 65 3b 0a 7d  n msg.errCode;.}
3840: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 69  .int sqlite3_cli
3850: 65 6e 74 5f 66 69 6e 61 6c 69 7a 65 28 73 71 6c  ent_finalize(sql
3860: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
3870: 29 7b 0a 20 20 53 71 6c 4d 65 73 73 61 67 65 20  ){.  SqlMessage 
3880: 6d 73 67 3b 0a 20 20 6d 73 67 2e 6f 70 20 3d 20  msg;.  msg.op = 
3890: 4d 53 47 5f 46 69 6e 61 6c 69 7a 65 3b 0a 20 20  MSG_Finalize;.  
38a0: 6d 73 67 2e 70 53 74 6d 74 20 3d 20 70 53 74 6d  msg.pStmt = pStm
38b0: 74 3b 0a 20 20 73 65 6e 64 54 6f 53 65 72 76 65  t;.  sendToServe
38c0: 72 28 26 6d 73 67 29 3b 0a 20 20 72 65 74 75 72  r(&msg);.  retur
38d0: 6e 20 6d 73 67 2e 65 72 72 43 6f 64 65 3b 0a 7d  n msg.errCode;.}
38e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 69  .int sqlite3_cli
38f0: 65 6e 74 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65  ent_close(sqlite
3900: 33 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 4d 65  3 *pDb){.  SqlMe
3910: 73 73 61 67 65 20 6d 73 67 3b 0a 20 20 6d 73 67  ssage msg;.  msg
3920: 2e 6f 70 20 3d 20 4d 53 47 5f 43 6c 6f 73 65 3b  .op = MSG_Close;
3930: 0a 20 20 6d 73 67 2e 70 44 62 20 3d 20 70 44 62  .  msg.pDb = pDb
3940: 3b 0a 20 20 73 65 6e 64 54 6f 53 65 72 76 65 72  ;.  sendToServer
3950: 28 26 6d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e  (&msg);.  return
3960: 20 6d 73 67 2e 65 72 72 43 6f 64 65 3b 0a 7d 0a   msg.errCode;.}.
3970: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3980: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
3990: 68 65 20 73 65 72 76 65 72 2e 20 20 54 6f 20 73  he server.  To s
39a0: 74 61 72 74 20 74 68 65 20 73 65 72 76 65 72 2c  tart the server,
39b0: 20 66 69 72 73 74 0a 2a 2a 20 6d 61 6b 65 20 73   first.** make s
39c0: 75 72 65 20 67 2e 73 65 72 76 65 72 48 61 6c 74  ure g.serverHalt
39d0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
39e0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 64 65 74  create a new det
39f0: 61 63 68 65 64 20 74 68 72 65 61 64 0a 2a 2a 20  ached thread.** 
3a00: 6f 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  on this procedur
3a10: 65 2e 20 20 53 65 65 20 74 68 65 20 73 71 6c 69  e.  See the sqli
3a20: 74 65 33 5f 73 65 72 76 65 72 5f 73 74 61 72 74  te3_server_start
3a30: 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77  () routine below
3a40: 0a 2a 2a 20 66 6f 72 20 61 6e 20 65 78 61 6d 70  .** for an examp
3a50: 6c 65 2e 20 20 54 68 69 73 20 70 72 6f 63 65 64  le.  This proced
3a60: 75 72 65 20 6c 6f 6f 70 73 20 75 6e 74 69 6c 20  ure loops until 
3a70: 67 2e 73 65 72 76 65 72 48 61 6c 74 20 62 65 63  g.serverHalt bec
3a80: 6f 6d 65 73 0a 2a 2a 20 74 72 75 65 2e 0a 2a 2f  omes.** true..*/
3a90: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 73  .void *sqlite3_s
3aa0: 65 72 76 65 72 28 76 6f 69 64 20 2a 4e 6f 74 55  erver(void *NotU
3ab0: 73 65 64 29 7b 0a 20 20 69 66 28 20 70 74 68 72  sed){.  if( pthr
3ac0: 65 61 64 5f 6d 75 74 65 78 5f 74 72 79 6c 6f 63  ead_mutex_tryloc
3ad0: 6b 28 26 67 2e 73 65 72 76 65 72 4d 75 74 65 78  k(&g.serverMutex
3ae0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3af0: 30 3b 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 73  0;  /* Another s
3b00: 65 72 76 65 72 20 69 73 20 61 6c 72 65 61 64 79  erver is already
3b10: 20 72 75 6e 6e 69 6e 67 20 2a 2f 0a 20 20 7d 0a   running */.  }.
3b20: 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
3b30: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 31 29  _shared_cache(1)
3b40: 3b 0a 20 20 77 68 69 6c 65 28 20 21 67 2e 73 65  ;.  while( !g.se
3b50: 72 76 65 72 48 61 6c 74 20 29 7b 0a 20 20 20 20  rverHalt ){.    
3b60: 53 71 6c 4d 65 73 73 61 67 65 20 2a 70 4d 73 67  SqlMessage *pMsg
3b70: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  ;..    /* Remove
3b80: 20 74 68 65 20 6c 61 73 74 20 6d 65 73 73 61 67   the last messag
3b90: 65 20 66 72 6f 6d 20 74 68 65 20 6d 65 73 73 61  e from the messa
3ba0: 67 65 20 71 75 65 75 65 2e 0a 20 20 20 20 2a 2f  ge queue..    */
3bb0: 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74  .    pthread_mut
3bc0: 65 78 5f 6c 6f 63 6b 28 26 67 2e 71 75 65 75 65  ex_lock(&g.queue
3bd0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 77 68 69 6c  Mutex);.    whil
3be0: 65 28 20 67 2e 70 51 75 65 75 65 54 61 69 6c 3d  e( g.pQueueTail=
3bf0: 3d 30 20 26 26 20 67 2e 73 65 72 76 65 72 48 61  =0 && g.serverHa
3c00: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  lt==0 ){.      p
3c10: 74 68 72 65 61 64 5f 63 6f 6e 64 5f 77 61 69 74  thread_cond_wait
3c20: 28 26 67 2e 73 65 72 76 65 72 57 61 6b 65 75 70  (&g.serverWakeup
3c30: 2c 20 26 67 2e 71 75 65 75 65 4d 75 74 65 78 29  , &g.queueMutex)
3c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 73 67  ;.    }.    pMsg
3c50: 20 3d 20 67 2e 70 51 75 65 75 65 54 61 69 6c 3b   = g.pQueueTail;
3c60: 0a 20 20 20 20 69 66 28 20 70 4d 73 67 20 29 7b  .    if( pMsg ){
3c70: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 73 67 2d  .      if( pMsg-
3c80: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
3c90: 20 20 70 4d 73 67 2d 3e 70 50 72 65 76 2d 3e 70    pMsg->pPrev->p
3ca0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
3cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67  }else{.        g
3cc0: 2e 70 51 75 65 75 65 48 65 61 64 20 3d 20 30 3b  .pQueueHead = 0;
3cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
3ce0: 2e 70 51 75 65 75 65 54 61 69 6c 20 3d 20 70 4d  .pQueueTail = pM
3cf0: 73 67 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d  sg->pPrev;.    }
3d00: 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74  .    pthread_mut
3d10: 65 78 5f 75 6e 6c 6f 63 6b 28 26 67 2e 71 75 65  ex_unlock(&g.que
3d20: 75 65 4d 75 74 65 78 29 3b 0a 20 20 20 20 69 66  ueMutex);.    if
3d30: 28 20 70 4d 73 67 3d 3d 30 20 29 20 62 72 65 61  ( pMsg==0 ) brea
3d40: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  k;..    /* Proce
3d50: 73 73 20 74 68 65 20 6d 65 73 73 61 67 65 20 6a  ss the message j
3d60: 75 73 74 20 72 65 6d 6f 76 65 64 0a 20 20 20 20  ust removed.    
3d70: 2a 2f 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d  */.    pthread_m
3d80: 75 74 65 78 5f 6c 6f 63 6b 28 26 70 4d 73 67 2d  utex_lock(&pMsg-
3d90: 3e 63 6c 69 65 6e 74 4d 75 74 65 78 29 3b 0a 20  >clientMutex);. 
3da0: 20 20 20 73 77 69 74 63 68 28 20 70 4d 73 67 2d     switch( pMsg-
3db0: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73  >op ){.      cas
3dc0: 65 20 4d 53 47 5f 4f 70 65 6e 3a 20 7b 0a 20 20  e MSG_Open: {.  
3dd0: 20 20 20 20 20 20 70 4d 73 67 2d 3e 65 72 72 43        pMsg->errC
3de0: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70  ode = sqlite3_op
3df0: 65 6e 28 70 4d 73 67 2d 3e 7a 49 6e 2c 20 26 70  en(pMsg->zIn, &p
3e00: 4d 73 67 2d 3e 70 44 62 29 3b 0a 20 20 20 20 20  Msg->pDb);.     
3e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3e20: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4d 53 47  }.      case MSG
3e30: 5f 50 72 65 70 61 72 65 3a 20 7b 0a 20 20 20 20  _Prepare: {.    
3e40: 20 20 20 20 70 4d 73 67 2d 3e 65 72 72 43 6f 64      pMsg->errCod
3e50: 65 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  e = sqlite3_prep
3e60: 61 72 65 28 70 4d 73 67 2d 3e 70 44 62 2c 20 70  are(pMsg->pDb, p
3e70: 4d 73 67 2d 3e 7a 49 6e 2c 20 70 4d 73 67 2d 3e  Msg->zIn, pMsg->
3e80: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
3eb0: 70 4d 73 67 2d 3e 70 53 74 6d 74 2c 20 26 70 4d  pMsg->pStmt, &pM
3ec0: 73 67 2d 3e 7a 4f 75 74 29 3b 0a 20 20 20 20 20  sg->zOut);.     
3ed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3ee0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4d 53 47  }.      case MSG
3ef0: 5f 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20  _Step: {.       
3f00: 20 70 4d 73 67 2d 3e 65 72 72 43 6f 64 65 20 3d   pMsg->errCode =
3f10: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4d   sqlite3_step(pM
3f20: 73 67 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  sg->pStmt);.    
3f30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3f40: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4d 53   }.      case MS
3f50: 47 5f 52 65 73 65 74 3a 20 7b 0a 20 20 20 20 20  G_Reset: {.     
3f60: 20 20 20 70 4d 73 67 2d 3e 65 72 72 43 6f 64 65     pMsg->errCode
3f70: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
3f80: 28 70 4d 73 67 2d 3e 70 53 74 6d 74 29 3b 0a 20  (pMsg->pStmt);. 
3f90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3fb0: 20 4d 53 47 5f 46 69 6e 61 6c 69 7a 65 3a 20 7b   MSG_Finalize: {
3fc0: 0a 20 20 20 20 20 20 20 20 70 4d 73 67 2d 3e 65  .        pMsg->e
3fd0: 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  rrCode = sqlite3
3fe0: 5f 66 69 6e 61 6c 69 7a 65 28 70 4d 73 67 2d 3e  _finalize(pMsg->
3ff0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
4000: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4010: 20 20 20 20 20 63 61 73 65 20 4d 53 47 5f 43 6c       case MSG_Cl
4020: 6f 73 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  ose: {.        p
4030: 4d 73 67 2d 3e 65 72 72 43 6f 64 65 20 3d 20 73  Msg->errCode = s
4040: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 4d 73  qlite3_close(pMs
4050: 67 2d 3e 70 44 62 29 3b 0a 20 20 20 20 20 20 20  g->pDb);.       
4060: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4070: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 69      }..    /* Si
4080: 67 6e 61 6c 20 74 68 65 20 63 6c 69 65 6e 74 20  gnal the client 
4090: 74 68 61 74 20 74 68 65 20 6d 65 73 73 61 67 65  that the message
40a0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73   has been proces
40b0: 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sed..    */.    
40c0: 70 4d 73 67 2d 3e 6f 70 20 3d 20 4d 53 47 5f 44  pMsg->op = MSG_D
40d0: 6f 6e 65 3b 0a 20 20 20 20 70 74 68 72 65 61 64  one;.    pthread
40e0: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70  _mutex_unlock(&p
40f0: 4d 73 67 2d 3e 63 6c 69 65 6e 74 4d 75 74 65 78  Msg->clientMutex
4100: 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 63  );.    pthread_c
4110: 6f 6e 64 5f 73 69 67 6e 61 6c 28 26 70 4d 73 67  ond_signal(&pMsg
4120: 2d 3e 63 6c 69 65 6e 74 57 61 6b 65 75 70 29 3b  ->clientWakeup);
4130: 0a 20 20 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d  .  }.  pthread_m
4140: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 67 2e 73  utex_unlock(&g.s
4150: 65 72 76 65 72 4d 75 74 65 78 29 3b 0a 20 20 72  erverMutex);.  r
4160: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4170: 2a 20 53 74 61 72 74 20 61 20 73 65 72 76 65 72  * Start a server
4180: 20 74 68 72 65 61 64 20 69 66 20 6f 6e 65 20 69   thread if one i
4190: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 75  s not already ru
41a0: 6e 6e 69 6e 67 2e 20 20 49 66 20 74 68 65 72 65  nning.  If there
41b0: 0a 2a 2a 20 69 73 20 61 6c 65 61 64 79 20 61 20  .** is aleady a 
41c0: 73 65 72 76 65 72 20 74 68 72 65 61 64 20 72 75  server thread ru
41d0: 6e 6e 69 6e 67 2c 20 74 68 65 20 6e 65 77 20 74  nning, the new t
41e0: 68 72 65 61 64 20 77 69 6c 6c 20 71 75 69 63 6b  hread will quick
41f0: 6c 79 0a 2a 2a 20 64 69 65 20 61 6e 64 20 74 68  ly.** die and th
4200: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 65 66  is routine is ef
4210: 66 65 63 74 69 76 65 6c 79 20 61 20 6e 6f 2d 6f  fectively a no-o
4220: 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  p..*/.void sqlit
4230: 65 33 5f 73 65 72 76 65 72 5f 73 74 61 72 74 28  e3_server_start(
4240: 76 6f 69 64 29 7b 0a 20 20 70 74 68 72 65 61 64  void){.  pthread
4250: 5f 74 20 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  _t x;.  int rc;.
4260: 20 20 67 2e 73 65 72 76 65 72 48 61 6c 74 20 3d    g.serverHalt =
4270: 20 30 3b 0a 20 20 72 63 20 3d 20 70 74 68 72 65   0;.  rc = pthre
4280: 61 64 5f 63 72 65 61 74 65 28 26 78 2c 20 30 2c  ad_create(&x, 0,
4290: 20 73 71 6c 69 74 65 33 5f 73 65 72 76 65 72 2c   sqlite3_server,
42a0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   0);.  if( rc==0
42b0: 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f   ){.    pthread_
42c0: 64 65 74 61 63 68 28 78 29 3b 0a 20 20 7d 0a 7d  detach(x);.  }.}
42d0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 73 65 72  ../*.** If a ser
42e0: 76 65 72 20 74 68 72 65 61 64 20 69 73 20 72 75  ver thread is ru
42f0: 6e 6e 69 6e 67 2c 20 74 68 65 6e 20 73 74 6f 70  nning, then stop
4300: 20 69 74 2e 20 20 49 66 20 6e 6f 20 73 65 72 76   it.  If no serv
4310: 65 72 20 69 73 0a 2a 2a 20 72 75 6e 6e 69 6e 67  er is.** running
4320: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
4330: 73 20 65 66 66 65 63 74 69 76 65 6c 79 20 61 20  s effectively a 
4340: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  no-op..**.** Thi
4350: 73 20 72 6f 75 74 69 6e 65 20 77 61 69 74 73 20  s routine waits 
4360: 75 6e 74 69 6c 20 74 68 65 20 73 65 72 76 65 72  until the server
4370: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 73 74   has actually st
4380: 6f 70 70 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  opped before.** 
4390: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  returning..*/.vo
43a0: 69 64 20 73 71 6c 69 74 65 33 5f 73 65 72 76 65  id sqlite3_serve
43b0: 72 5f 73 74 6f 70 28 76 6f 69 64 29 7b 0a 20 20  r_stop(void){.  
43c0: 67 2e 73 65 72 76 65 72 48 61 6c 74 20 3d 20 31  g.serverHalt = 1
43d0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64  ;.  pthread_cond
43e0: 5f 62 72 6f 61 64 63 61 73 74 28 26 67 2e 73 65  _broadcast(&g.se
43f0: 72 76 65 72 57 61 6b 65 75 70 29 3b 0a 20 20 70  rverWakeup);.  p
4400: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
4410: 6b 28 26 67 2e 73 65 72 76 65 72 4d 75 74 65 78  k(&g.serverMutex
4420: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  );.  pthread_mut
4430: 65 78 5f 75 6e 6c 6f 63 6b 28 26 67 2e 73 65 72  ex_unlock(&g.ser
4440: 76 65 72 4d 75 74 65 78 29 3b 0a 7d 0a 0a 23 65  verMutex);.}..#e
4450: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4460: 53 5f 55 4e 49 58 20 26 26 20 53 51 4c 49 54 45  S_UNIX && SQLITE
4470: 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a 23  _THREADSAFE */.#
4480: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
4490: 28 53 51 4c 49 54 45 5f 53 45 52 56 45 52 29 20  (SQLITE_SERVER) 
44a0: 2a 2f 0a                                         */.