/ Hex Artifact Content
Login

Artifact 57d5bc45cd5492208e451f697404be88f8612527d64c9d42f96b325b64983d74:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 31 32 2d 31 37  /*.** 2017-12-17
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a 2a 2a 0a 2a 2a 20 55 74 69 6c 69  ****.**.** Utili
0180: 74 79 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c  ty functions sql
0190: 61 72 5f 63 6f 6d 70 72 65 73 73 28 29 20 61 6e  ar_compress() an
01a0: 64 20 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65  d sqlar_uncompre
01b0: 73 73 28 29 2e 20 55 73 65 66 75 6c 0a 2a 2a 20  ss(). Useful.** 
01c0: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 77 69 74 68  for working with
01d0: 20 73 71 6c 61 72 20 61 72 63 68 69 76 65 73 20   sqlar archives 
01e0: 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20  and used by the 
01f0: 73 68 65 6c 6c 20 74 6f 6f 6c 27 73 20 62 75 69  shell tool's bui
0200: 6c 74 2d 69 6e 0a 2a 2a 20 73 71 6c 61 72 20 73  lt-in.** sqlar s
0210: 75 70 70 6f 72 74 2e 0a 2a 2f 0a 23 69 6e 63 6c  upport..*/.#incl
0220: 75 64 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e  ude "sqlite3ext.
0230: 68 22 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  h".SQLITE_EXTENS
0240: 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75  ION_INIT1.#inclu
0250: 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 0a 2f 2a 0a  de <zlib.h>../*.
0260: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
0270: 6e 20 6f 66 20 74 68 65 20 22 73 71 6c 61 72 5f  n of the "sqlar_
0280: 63 6f 6d 70 72 65 73 73 28 58 29 22 20 53 51 4c  compress(X)" SQL
0290: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
02a0: 20 49 66 20 74 68 65 20 74 79 70 65 20 6f 66 20   If the type of 
02b0: 58 20 69 73 20 53 51 4c 49 54 45 5f 42 4c 4f 42  X is SQLITE_BLOB
02c0: 2c 20 61 6e 64 20 63 6f 6d 70 72 65 73 73 69 6e  , and compressin
02d0: 67 20 74 68 61 74 20 62 6c 6f 62 20 75 73 69 6e  g that blob usin
02e0: 67 0a 2a 2a 20 7a 6c 69 62 20 75 74 69 6c 69 74  g.** zlib utilit
02f0: 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 72  y function compr
0300: 65 73 73 28 29 20 79 69 65 6c 64 73 20 61 20 73  ess() yields a s
0310: 6d 61 6c 6c 65 72 20 62 6c 6f 62 2c 20 72 65 74  maller blob, ret
0320: 75 72 6e 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 72  urn the.** compr
0330: 65 73 73 65 64 20 62 6c 6f 62 2e 20 4f 74 68 65  essed blob. Othe
0340: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 20  rwise, return a 
0350: 63 6f 70 79 20 6f 66 20 58 2e 0a 2a 2a 0a 2a 2a  copy of X..**.**
0360: 20 53 51 4c 61 72 20 75 73 65 73 20 74 68 65 20   SQLar uses the 
0370: 22 7a 6c 69 62 20 66 6f 72 6d 61 74 22 20 66 6f  "zlib format" fo
0380: 72 20 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e  r compressed con
0390: 74 65 6e 74 2e 20 20 54 68 65 20 7a 6c 69 62 20  tent.  The zlib 
03a0: 66 6f 72 6d 61 74 0a 2a 2a 20 63 6f 6e 74 61 69  format.** contai
03b0: 6e 73 20 61 20 74 77 6f 2d 62 79 74 65 20 69 64  ns a two-byte id
03c0: 65 6e 74 69 66 69 63 61 74 69 6f 6e 20 68 65 61  entification hea
03d0: 64 65 72 20 61 6e 64 20 61 20 66 6f 75 72 2d 62  der and a four-b
03e0: 79 74 65 20 63 68 65 63 6b 73 75 6d 20 61 74 0a  yte checksum at.
03f0: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  ** the end.  Thi
0400: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
0410: 72 6f 6d 20 5a 49 50 20 77 68 69 63 68 20 75 73  rom ZIP which us
0420: 65 73 20 74 68 65 20 72 61 77 20 64 65 66 6c 61  es the raw defla
0430: 74 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  te format..**.**
0440: 20 46 75 74 75 72 65 20 65 6e 68 61 6e 63 65 6d   Future enhancem
0450: 65 6e 74 73 20 74 6f 20 53 51 4c 61 72 20 6d 69  ents to SQLar mi
0460: 67 68 74 20 61 64 64 20 73 75 70 70 6f 72 74 20  ght add support 
0470: 66 6f 72 20 6e 65 77 20 63 6f 6d 70 72 65 73 73  for new compress
0480: 69 6f 6e 20 66 6f 72 6d 61 74 73 2e 0a 2a 2a 20  ion formats..** 
0490: 49 66 20 73 6f 2c 20 74 68 6f 73 65 20 6e 65 77  If so, those new
04a0: 20 66 6f 72 6d 61 74 73 20 77 69 6c 6c 20 62 65   formats will be
04b0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
04c0: 6c 74 65 72 6e 61 74 69 76 65 20 68 65 61 64 65  lternative heade
04d0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 63 6f 6d  rs in the.** com
04e0: 70 72 65 73 73 65 64 20 64 61 74 61 2e 0a 2a 2f  pressed data..*/
04f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
0500: 61 72 43 6f 6d 70 72 65 73 73 46 75 6e 63 28 0a  arCompressFunc(.
0510: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0520: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
0530: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
0540: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
0550: 7b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  {.  assert( argc
0560: 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
0570: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
0580: 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  argv[0])==SQLITE
0590: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 63 6f 6e  _BLOB ){.    con
05a0: 73 74 20 42 79 74 65 66 20 2a 70 44 61 74 61 20  st Bytef *pData 
05b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
05c0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
05d0: 20 20 20 75 4c 6f 6e 67 20 6e 44 61 74 61 20 3d     uLong nData =
05e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
05f0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
0600: 20 20 20 75 4c 6f 6e 67 66 20 6e 4f 75 74 20 3d     uLongf nOut =
0610: 20 63 6f 6d 70 72 65 73 73 42 6f 75 6e 64 28 6e   compressBound(n
0620: 44 61 74 61 29 3b 0a 20 20 20 20 42 79 74 65 66  Data);.    Bytef
0630: 20 2a 70 4f 75 74 3b 0a 0a 20 20 20 20 70 4f 75   *pOut;..    pOu
0640: 74 20 3d 20 28 42 79 74 65 66 2a 29 73 71 6c 69  t = (Bytef*)sqli
0650: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 29  te3_malloc(nOut)
0660: 3b 0a 20 20 20 20 69 66 28 20 70 4f 75 74 3d 3d  ;.    if( pOut==
0670: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
0680: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
0690: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
06a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
06b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
06c0: 66 28 20 5a 5f 4f 4b 21 3d 63 6f 6d 70 72 65 73  f( Z_OK!=compres
06d0: 73 28 70 4f 75 74 2c 20 26 6e 4f 75 74 2c 20 70  s(pOut, &nOut, p
06e0: 44 61 74 61 2c 20 6e 44 61 74 61 29 20 29 7b 0a  Data, nData) ){.
06f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
0700: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
0710: 74 65 78 74 2c 20 22 65 72 72 6f 72 20 69 6e 20  text, "error in 
0720: 63 6f 6d 70 72 65 73 73 28 29 22 2c 20 2d 31 29  compress()", -1)
0730: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0740: 28 20 6e 4f 75 74 3c 6e 44 61 74 61 20 29 7b 0a  ( nOut<nData ){.
0750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
0760: 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74  result_blob(cont
0770: 65 78 74 2c 20 70 4f 75 74 2c 20 6e 4f 75 74 2c  ext, pOut, nOut,
0780: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
0790: 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  T);.      }else{
07a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
07b0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f  _result_value(co
07c0: 6e 74 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b  ntext, argv[0]);
07d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
07e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 75 74  qlite3_free(pOut
07f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
0800: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
0810: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
0820: 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  xt, argv[0]);.  
0830: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  }.}../*.** Imple
0840: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0850: 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65   "sqlar_uncompre
0860: 73 73 28 58 2c 53 5a 29 22 20 53 51 4c 20 66 75  ss(X,SZ)" SQL fu
0870: 6e 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 50 61 72  nction.**.** Par
0880: 61 6d 65 74 65 72 20 53 5a 20 69 73 20 69 6e 74  ameter SZ is int
0890: 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 69  erpreted as an i
08a0: 6e 74 65 67 65 72 2e 20 49 66 20 69 74 20 69 73  nteger. If it is
08b0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a   less than or.**
08c0: 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
08d0: 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
08e0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70  on returns a cop
08f0: 79 20 6f 66 20 58 2e 20 4f 72 2c 20 69 66 0a 2a  y of X. Or, if.*
0900: 2a 20 53 5a 20 69 73 20 65 71 75 61 6c 20 74 6f  * SZ is equal to
0910: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 58 20 77   the size of X w
0920: 68 65 6e 20 69 6e 74 65 72 70 72 65 74 65 64 20  hen interpreted 
0930: 61 73 20 61 20 62 6c 6f 62 2c 20 61 6c 73 6f 0a  as a blob, also.
0940: 2a 2a 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79  ** return a copy
0950: 20 6f 66 20 58 2e 20 4f 74 68 65 72 77 69 73 65   of X. Otherwise
0960: 2c 20 64 65 63 6f 6d 70 72 65 73 73 20 62 6c 6f  , decompress blo
0970: 62 20 58 20 75 73 69 6e 67 20 7a 6c 69 62 0a 2a  b X using zlib.*
0980: 2a 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  * utility functi
0990: 6f 6e 20 75 6e 63 6f 6d 70 72 65 73 73 28 29 20  on uncompress() 
09a0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
09b0: 65 73 75 6c 74 73 20 28 61 6e 6f 74 68 65 72 0a  esults (another.
09c0: 2a 2a 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 73 74 61  ** blob)..*/.sta
09d0: 74 69 63 20 76 6f 69 64 20 73 71 6c 61 72 55 6e  tic void sqlarUn
09e0: 63 6f 6d 70 72 65 73 73 46 75 6e 63 28 0a 20 20  compressFunc(.  
09f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
0a00: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
0a10: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
0a20: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
0a30: 20 20 75 4c 6f 6e 67 20 6e 44 61 74 61 3b 0a 20    uLong nData;. 
0a40: 20 75 4c 6f 6e 67 66 20 73 7a 3b 0a 0a 20 20 61   uLongf sz;..  a
0a50: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29  ssert( argc==2 )
0a60: 3b 0a 20 20 73 7a 20 3d 20 73 71 6c 69 74 65 33  ;.  sz = sqlite3
0a70: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
0a80: 31 5d 29 3b 0a 0a 20 20 69 66 28 20 73 7a 3c 3d  1]);..  if( sz<=
0a90: 30 20 7c 7c 20 73 7a 3d 3d 28 6e 44 61 74 61 20  0 || sz==(nData 
0aa0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
0ab0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 29 20  bytes(argv[0])) 
0ac0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
0ad0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
0ae0: 65 78 74 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20  ext, argv[0]);. 
0af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
0b00: 74 20 42 79 74 65 66 20 2a 70 44 61 74 61 3d 20  t Bytef *pData= 
0b10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
0b20: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ob(argv[0]);.   
0b30: 20 42 79 74 65 66 20 2a 70 4f 75 74 20 3d 20 73   Bytef *pOut = s
0b40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a  qlite3_malloc(sz
0b50: 29 3b 0a 20 20 20 20 69 66 28 20 5a 5f 4f 4b 21  );.    if( Z_OK!
0b60: 3d 75 6e 63 6f 6d 70 72 65 73 73 28 70 4f 75 74  =uncompress(pOut
0b70: 2c 20 26 73 7a 2c 20 70 44 61 74 61 2c 20 6e 44  , &sz, pData, nD
0b80: 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ata) ){.      sq
0b90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
0ba0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 72 72  or(context, "err
0bb0: 6f 72 20 69 6e 20 75 6e 63 6f 6d 70 72 65 73 73  or in uncompress
0bc0: 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65  ()", -1);.    }e
0bd0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
0be0: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
0bf0: 6f 6e 74 65 78 74 2c 20 70 4f 75 74 2c 20 73 7a  ontext, pOut, sz
0c00: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
0c10: 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  NT);.    }.    s
0c20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 75 74  qlite3_free(pOut
0c30: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 64 65  );.  }.}...#ifde
0c40: 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73  f _WIN32.__decls
0c50: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23  pec(dllexport).#
0c60: 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65  endif.int sqlite
0c70: 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 0a 20 20  3_sqlar_init(.  
0c80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
0c90: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c  char **pzErrMsg,
0ca0: 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65   .  const sqlite
0cb0: 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a  3_api_routines *
0cc0: 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pApi.){.  int rc
0cd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
0ce0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
0cf0: 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20  _INIT2(pApi);.  
0d00: 28 76 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20  (void)pzErrMsg; 
0d10: 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d   /* Unused param
0d20: 65 74 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  eter */.  rc = s
0d30: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
0d40: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 71 6c 61  nction(db, "sqla
0d50: 72 5f 63 6f 6d 70 72 65 73 73 22 2c 20 31 2c 20  r_compress", 1, 
0d60: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0d90: 71 6c 61 72 43 6f 6d 70 72 65 73 73 46 75 6e 63  qlarCompressFunc
0da0: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
0db0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
0dc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
0dd0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
0de0: 28 64 62 2c 20 22 73 71 6c 61 72 5f 75 6e 63 6f  (db, "sqlar_unco
0df0: 6d 70 72 65 73 73 22 2c 20 32 2c 20 53 51 4c 49  mpress", 2, SQLI
0e00: 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
0e30: 61 72 55 6e 63 6f 6d 70 72 65 73 73 46 75 6e 63  arUncompressFunc
0e40: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
0e50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.