Fossil

Hex Artifact Content
Login

Artifact 6b4958b9250369d74a0cb0432fa46d4b41797c9a:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 31 30 20 44 2e 20 52 69 63 68  (c) 2010 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63  ** This module c
0260: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 64 65  ontains the code
0270: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
0280: 73 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 20  s the "sqlite3" 
0290: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 0a 2a 2a 20  command-line.** 
02a0: 73 68 65 6c 6c 20 61 67 61 69 6e 73 74 20 74 68  shell against th
02b0: 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74  e repository dat
02c0: 61 62 61 73 65 2e 20 20 54 68 65 20 63 6f 6d 6d  abase.  The comm
02d0: 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 20 69  and-line shell i
02e0: 74 73 65 6c 66 0a 2a 2a 20 69 73 20 61 20 63 6f  tself.** is a co
02f0: 70 79 20 6f 66 20 74 68 65 20 22 73 68 65 6c 6c  py of the "shell
0300: 2e 63 22 20 63 6f 64 65 20 66 72 6f 6d 20 53 51  .c" code from SQ
0310: 4c 69 74 65 2e 20 20 54 68 69 73 20 66 69 6c 65  Lite.  This file
0320: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 67 69 63 0a   contains logic.
0330: 2a 2a 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ** to initialize
0340: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 73 68 65   the code in she
0350: 6c 6c 2e 63 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ll.c..*/.#includ
0360: 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e  e "config.h".#in
0370: 63 6c 75 64 65 20 22 73 71 6c 63 6d 64 2e 68 22  clude "sqlcmd.h"
0380: 0a 23 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e  .#include <zlib.
0390: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  h>../*.** Implem
03a0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
03b0: 22 63 6f 6e 74 65 6e 74 28 58 29 22 20 53 51 4c  "content(X)" SQL
03c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75   function.  Retu
03d0: 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a  rn the complete.
03e0: 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 72  ** content of ar
03f0: 74 69 66 61 63 74 20 69 64 65 6e 74 69 66 69 65  tifact identifie
0400: 64 20 62 79 20 58 20 61 73 20 61 20 62 6c 6f 62  d by X as a blob
0410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0420: 20 73 71 6c 63 6d 64 5f 63 6f 6e 74 65 6e 74 28   sqlcmd_content(
0430: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
0440: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
0450: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
0460: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
0470: 29 7b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20  ){.  int rid;.  
0480: 42 6c 6f 62 20 63 78 3b 0a 20 20 63 6f 6e 73 74  Blob cx;.  const
0490: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
04a0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
04b0: 29 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 28 63 6f  );.  zName = (co
04c0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
04d0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
04e0: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 4e 61  v[0]);.  if( zNa
04f0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
0500: 20 20 67 2e 64 62 20 3d 20 73 71 6c 69 74 65 33    g.db = sqlite3
0510: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
0520: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 67  le(context);.  g
0530: 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20  .repositoryOpen 
0540: 3d 20 31 3b 0a 20 20 72 69 64 20 3d 20 6e 61 6d  = 1;.  rid = nam
0550: 65 5f 74 6f 5f 72 69 64 28 7a 4e 61 6d 65 29 3b  e_to_rid(zName);
0560: 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 20  .  if( rid==0 ) 
0570: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 63 6f  return;.  if( co
0580: 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26  ntent_get(rid, &
0590: 63 78 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  cx) ){.    sqlit
05a0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
05b0: 6f 6e 74 65 78 74 2c 20 62 6c 6f 62 5f 62 75 66  ontext, blob_buf
05c0: 66 65 72 28 26 63 78 29 2c 20 62 6c 6f 62 5f 73  fer(&cx), blob_s
05d0: 69 7a 65 28 26 63 78 29 2c 0a 20 20 20 20 20 20  ize(&cx),.      
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
0600: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
0610: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 78    blob_reset(&cx
0620: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0630: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
0640: 66 20 74 68 65 20 22 63 6f 6d 70 72 65 73 73 28  f the "compress(
0650: 58 29 22 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  X)" SQL function
0660: 2e 20 20 54 68 65 20 69 6e 70 75 74 20 58 20 69  .  The input X i
0670: 73 0a 2a 2a 20 63 6f 6d 70 72 65 73 73 65 64 20  s.** compressed 
0680: 75 73 69 6e 67 20 7a 4c 69 62 20 61 6e 64 20 74  using zLib and t
0690: 68 65 20 6f 75 74 70 75 74 20 69 73 20 72 65 74  he output is ret
06a0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
06b0: 20 76 6f 69 64 20 73 71 6c 63 6d 64 5f 63 6f 6d   void sqlcmd_com
06c0: 70 72 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  press(.  sqlite3
06d0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
06e0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
06f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0700: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
0710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0720: 70 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pIn;.  unsigned 
0730: 63 68 61 72 20 2a 70 4f 75 74 3b 0a 20 20 75 6e  char *pOut;.  un
0740: 73 69 67 6e 65 64 20 69 6e 74 20 6e 49 6e 3b 0a  signed int nIn;.
0750: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
0760: 69 6e 74 20 6e 4f 75 74 3b 0a 0a 20 20 70 49 6e  int nOut;..  pIn
0770: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
0780: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
0790: 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f    nIn = sqlite3_
07a0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
07b0: 5b 30 5d 29 3b 0a 20 20 6e 4f 75 74 20 3d 20 31  [0]);.  nOut = 1
07c0: 33 20 2b 20 6e 49 6e 20 2b 20 28 6e 49 6e 2b 39  3 + nIn + (nIn+9
07d0: 39 39 29 2f 31 30 30 30 3b 0a 20 20 70 4f 75 74  99)/1000;.  pOut
07e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
07f0: 63 28 20 6e 4f 75 74 2b 34 20 29 3b 0a 20 20 70  c( nOut+4 );.  p
0800: 4f 75 74 5b 30 5d 20 3d 20 6e 49 6e 3e 3e 32 34  Out[0] = nIn>>24
0810: 20 26 20 30 78 66 66 3b 0a 20 20 70 4f 75 74 5b   & 0xff;.  pOut[
0820: 31 5d 20 3d 20 6e 49 6e 3e 3e 31 36 20 26 20 30  1] = nIn>>16 & 0
0830: 78 66 66 3b 0a 20 20 70 4f 75 74 5b 32 5d 20 3d  xff;.  pOut[2] =
0840: 20 6e 49 6e 3e 3e 38 20 26 20 30 78 66 66 3b 0a   nIn>>8 & 0xff;.
0850: 20 20 70 4f 75 74 5b 33 5d 20 3d 20 6e 49 6e 20    pOut[3] = nIn 
0860: 26 20 30 78 66 66 3b 0a 20 20 63 6f 6d 70 72 65  & 0xff;.  compre
0870: 73 73 28 26 70 4f 75 74 5b 34 5d 2c 20 26 6e 4f  ss(&pOut[4], &nO
0880: 75 74 2c 20 70 49 6e 2c 20 6e 49 6e 29 3b 0a 20  ut, pIn, nIn);. 
0890: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
08a0: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 4f  blob(context, pO
08b0: 75 74 2c 20 6e 4f 75 74 2b 34 2c 20 73 71 6c 69  ut, nOut+4, sqli
08c0: 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  te3_free);.}../*
08d0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
08e0: 6f 6e 20 6f 66 20 74 68 65 20 22 64 65 63 6f 6d  on of the "decom
08f0: 70 72 65 73 73 28 58 29 22 20 53 51 4c 20 66 75  press(X)" SQL fu
0900: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 61 72 67  nction.  The arg
0910: 75 6d 65 6e 74 20 58 0a 2a 2a 20 69 73 20 61 20  ument X.** is a 
0920: 62 6c 6f 62 20 77 68 69 63 68 20 77 61 73 20 6f  blob which was o
0930: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 63 6f 6d  btained from com
0940: 70 72 65 73 73 28 59 29 2e 20 20 54 68 65 20 6f  press(Y).  The o
0950: 75 74 70 75 74 20 77 69 6c 6c 20 62 65 0a 2a 2a  utput will be.**
0960: 20 74 68 65 20 76 61 6c 75 65 20 59 2e 0a 2a 2f   the value Y..*/
0970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
0980: 63 6d 64 5f 64 65 63 6f 6d 70 72 65 73 73 28 0a  cmd_decompress(.
0990: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
09a0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
09b0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
09c0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
09d0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
09e0: 65 64 20 63 68 61 72 20 2a 70 49 6e 3b 0a 20 20  ed char *pIn;.  
09f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
0a00: 4f 75 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  Out;.  unsigned 
0a10: 69 6e 74 20 6e 49 6e 3b 0a 20 20 75 6e 73 69 67  int nIn;.  unsig
0a20: 6e 65 64 20 6c 6f 6e 67 20 69 6e 74 20 6e 4f 75  ned long int nOu
0a30: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
0a40: 70 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  pIn = sqlite3_va
0a50: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
0a60: 29 3b 0a 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74  );.  nIn = sqlit
0a70: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
0a80: 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 4f 75 74 20  rgv[0]);.  nOut 
0a90: 3d 20 28 70 49 6e 5b 30 5d 3c 3c 32 34 29 20 2b  = (pIn[0]<<24) +
0aa0: 20 28 70 49 6e 5b 31 5d 3c 3c 31 36 29 20 2b 20   (pIn[1]<<16) + 
0ab0: 28 70 49 6e 5b 32 5d 3c 3c 38 29 20 2b 20 70 49  (pIn[2]<<8) + pI
0ac0: 6e 5b 33 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 73  n[3];.  pOut = s
0ad0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
0ae0: 4f 75 74 2b 31 20 29 3b 0a 20 20 72 63 20 3d 20  Out+1 );.  rc = 
0af0: 75 6e 63 6f 6d 70 72 65 73 73 28 70 4f 75 74 2c  uncompress(pOut,
0b00: 20 26 6e 4f 75 74 2c 20 26 70 49 6e 5b 34 5d 2c   &nOut, &pIn[4],
0b10: 20 6e 49 6e 2d 34 29 3b 0a 20 20 69 66 28 20 72   nIn-4);.  if( r
0b20: 63 3d 3d 5a 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  c==Z_OK ){.    s
0b30: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
0b40: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 4f 75 74  ob(context, pOut
0b50: 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f  , nOut, sqlite3_
0b60: 66 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  free);.  }else{.
0b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
0b80: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
0b90: 2c 20 22 69 6e 70 75 74 20 69 73 20 6e 6f 74 20  , "input is not 
0ba0: 7a 6c 69 62 20 63 6f 6d 70 72 65 73 73 65 64 22  zlib compressed"
0bb0: 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , -1);.  }.}../*
0bc0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
0bd0: 22 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e  "automatic exten
0be0: 73 69 6f 6e 22 20 69 6e 69 74 69 61 6c 69 7a 65  sion" initialize
0bf0: 72 20 74 68 61 74 20 72 75 6e 73 20 72 69 67 68  r that runs righ
0c00: 74 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63  t after.** the c
0c10: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
0c20: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
0c30: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2e 20  base is opened. 
0c40: 20 53 65 74 20 75 70 20 74 68 65 0a 2a 2a 20 64   Set up the.** d
0c50: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0c60: 6f 6e 20 74 6f 20 62 65 20 6d 6f 72 65 20 75 73  on to be more us
0c70: 65 66 75 6c 20 74 6f 20 74 68 65 20 68 75 6d 61  eful to the huma
0c80: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  n operator..*/.s
0c90: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 63 6d 64  tatic int sqlcmd
0ca0: 5f 61 75 74 6f 69 6e 69 74 28 0a 20 20 73 71 6c  _autoinit(.  sql
0cb0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
0cc0: 74 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73  t char **pzErrMs
0cd0: 67 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  g,.  const void 
0ce0: 2a 6e 6f 74 55 73 65 64 0a 29 7b 0a 20 20 73 71  *notUsed.){.  sq
0cf0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
0d00: 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 6e 74 65  ction(db, "conte
0d10: 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41  nt", 1, SQLITE_A
0d20: 4e 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  NY, 0,.         
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 73 71 6c 63 6d 64 5f 63 6f 6e 74 65 6e 74 2c   sqlcmd_content,
0d50: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
0d60: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
0d70: 6e 28 64 62 2c 20 22 63 6f 6d 70 72 65 73 73 22  n(db, "compress"
0d80: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
0d90: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
0db0: 6c 63 6d 64 5f 63 6f 6d 70 72 65 73 73 2c 20 30  lcmd_compress, 0
0dc0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
0dd0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
0de0: 64 62 2c 20 22 64 65 63 6f 6d 70 72 65 73 73 22  db, "decompress"
0df0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
0e00: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
0e20: 6c 63 6d 64 5f 64 65 63 6f 6d 70 72 65 73 73 2c  lcmd_decompress,
0e30: 20 30 2c 20 30 29 3b 0a 20 20 72 65 5f 61 64 64   0, 0);.  re_add
0e40: 5f 73 71 6c 5f 66 75 6e 63 28 64 62 29 3b 0a 20  _sql_func(db);. 
0e50: 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65   g.repositoryOpe
0e60: 6e 20 3d 20 31 3b 0a 20 20 67 2e 64 62 20 3d 20  n = 1;.  g.db = 
0e70: 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  db;.  return SQL
0e80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
0e90: 20 43 4f 4d 4d 41 4e 44 3a 20 73 71 6c 69 74 65   COMMAND: sqlite
0ea0: 33 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25  3.**.** Usage: %
0eb0: 66 6f 73 73 69 6c 20 73 71 6c 69 74 65 33 20 3f  fossil sqlite3 ?
0ec0: 44 41 54 41 42 41 53 45 3f 20 3f 4f 50 54 49 4f  DATABASE? ?OPTIO
0ed0: 4e 53 3f 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 74 68  NS?.**.** Run th
0ee0: 65 20 73 74 61 6e 64 61 6c 6f 6e 65 20 73 71 6c  e standalone sql
0ef0: 69 74 65 33 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  ite3 command-lin
0f00: 65 20 73 68 65 6c 6c 20 6f 6e 20 44 41 54 41 42  e shell on DATAB
0f10: 41 53 45 20 77 69 74 68 20 4f 50 54 49 4f 4e 53  ASE with OPTIONS
0f20: 2e 0a 2a 2a 20 49 66 20 44 41 54 41 42 41 53 45  ..** If DATABASE
0f30: 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65   is omitted, the
0f40: 6e 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  n the repository
0f50: 20 74 68 61 74 20 73 65 72 76 65 73 20 74 68 65   that serves the
0f60: 20 77 6f 72 6b 69 6e 67 0a 2a 2a 20 64 69 72 65   working.** dire
0f70: 63 74 6f 72 79 20 69 73 20 6f 70 65 6e 65 64 2e  ctory is opened.
0f80: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
0f90: 20 43 61 72 65 6c 65 73 73 20 75 73 65 20 6f 66   Careless use of
0fa0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61   this command ca
0fb0: 6e 20 63 6f 72 72 75 70 74 20 61 20 46 6f 73 73  n corrupt a Foss
0fc0: 69 6c 20 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2a  il repository.**
0fd0: 20 69 6e 20 77 61 79 73 20 74 68 61 74 20 61 72   in ways that ar
0fe0: 65 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 2e  e unrecoverable.
0ff0: 20 20 42 65 20 73 75 72 65 20 79 6f 75 20 6b 6e    Be sure you kn
1000: 6f 77 20 77 68 61 74 20 79 6f 75 20 61 72 65 20  ow what you are 
1010: 64 6f 69 6e 67 20 62 65 66 6f 72 65 0a 2a 2a 20  doing before.** 
1020: 72 75 6e 6e 69 6e 67 20 61 6e 79 20 53 51 4c 20  running any SQL 
1030: 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 6f  commands that mo
1040: 64 69 66 69 65 73 20 74 68 65 20 72 65 70 6f 73  difies the repos
1050: 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  itory database..
1060: 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 73 71 6c 69  */.void cmd_sqli
1070: 74 65 33 28 76 6f 69 64 29 7b 0a 20 20 65 78 74  te3(void){.  ext
1080: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1090: 73 68 65 6c 6c 28 69 6e 74 2c 20 63 68 61 72 2a  shell(int, char*
10a0: 2a 29 3b 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e  *);.  db_find_an
10b0: 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72  d_open_repositor
10c0: 79 28 4f 50 45 4e 5f 41 4e 59 5f 53 43 48 45 4d  y(OPEN_ANY_SCHEM
10d0: 41 2c 20 30 29 3b 0a 20 20 64 62 5f 63 6c 6f 73  A, 0);.  db_clos
10e0: 65 28 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(1);.  sqlite3_
10f0: 73 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 73 71  shutdown();.  sq
1100: 6c 69 74 65 33 5f 73 68 65 6c 6c 28 67 2e 61 72  lite3_shell(g.ar
1110: 67 63 2d 31 2c 20 67 2e 61 72 67 76 2b 31 29 3b  gc-1, g.argv+1);
1120: 0a 20 20 67 2e 64 62 20 3d 20 30 3b 0a 7d 0a 0a  .  g.db = 0;.}..
1130: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1140: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1150: 74 68 65 20 70 61 74 63 68 65 64 20 73 71 6c 69  the patched sqli
1160: 74 65 33 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  te3 command-line
1170: 20 73 68 65 6c 6c 20 69 6e 20 6f 72 64 65 72 0a   shell in order.
1180: 2a 2a 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ** to load the n
1190: 61 6d 65 20 61 6e 64 20 64 61 74 61 62 61 73 65  ame and database
11a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
11b0: 74 68 65 20 6f 70 65 6e 20 46 6f 73 73 69 6c 20  the open Fossil 
11c0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
11d0: 64 20 66 6f 73 73 69 6c 5f 6f 70 65 6e 28 63 6f  d fossil_open(co
11e0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 52 65 70  nst char **pzRep
11f0: 6f 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  oName){.  sqlite
1200: 33 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e  3_auto_extension
1210: 28 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29  ((void(*)(void))
1220: 73 71 6c 63 6d 64 5f 61 75 74 6f 69 6e 69 74 29  sqlcmd_autoinit)
1230: 3b 0a 20 20 2a 70 7a 52 65 70 6f 4e 61 6d 65 20  ;.  *pzRepoName 
1240: 3d 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e  = g.zRepositoryN
1250: 61 6d 65 3b 0a 7d 0a                             ame;.}.