/ Hex Artifact Content
Login

Artifact add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 38 2d 30 39  /*.** 2016-08-09
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 68 6f 77  demonstrates how
0190: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 53 51   to create an SQ
01a0: 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  L function that 
01b0: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
01c0: 68 0a 2a 2a 20 66 6f 72 20 69 6e 74 65 67 65 72  h.** for integer
01d0: 20 76 61 6c 75 65 73 20 28 69 74 20 72 65 74 75   values (it retu
01e0: 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 69 74  rns a copy of it
01f0: 73 20 61 72 67 75 6d 65 6e 74 29 20 62 75 74 20  s argument) but 
0200: 61 6c 73 6f 20 73 61 76 65 73 20 74 68 65 0a 2a  also saves the.*
0210: 2a 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20  * value that is 
0220: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 69  passed through i
0230: 6e 74 6f 20 61 20 43 2d 6c 61 6e 67 75 61 67 65  nto a C-language
0240: 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65 20   variable.  The 
0250: 61 64 64 72 65 73 73 20 6f 66 0a 2a 2a 20 74 68  address of.** th
0260: 65 20 43 2d 6c 61 6e 67 75 61 67 65 20 76 61 72  e C-language var
0270: 69 61 62 6c 65 20 69 73 20 73 75 70 70 6c 69 65  iable is supplie
0280: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
0290: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
02a0: 54 68 69 73 20 61 6c 6c 6f 77 73 2c 20 66 6f 72  This allows, for
02b0: 20 65 78 61 6d 70 6c 65 2c 20 61 20 63 6f 75 6e   example, a coun
02c0: 74 65 72 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  ter to increment
02d0: 65 64 20 61 6e 64 20 74 68 65 20 6f 72 69 67 69  ed and the origi
02e0: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  nal.** value ret
02f0: 72 69 65 76 65 64 2c 20 61 74 6f 6d 69 63 61 6c  rieved, atomical
0300: 6c 79 2c 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ly, using a sing
0310: 6c 65 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a  le statement:.**
0320: 0a 2a 2a 20 20 20 20 55 50 44 41 54 45 20 63 6f  .**    UPDATE co
0330: 75 6e 74 65 72 54 61 62 20 53 45 54 20 63 6e 74  unterTab SET cnt
0340: 3d 72 65 6d 65 6d 62 65 72 28 63 6e 74 2c 24 50  =remember(cnt,$P
0350: 54 52 29 2b 31 20 57 48 45 52 45 20 69 64 3d 24  TR)+1 WHERE id=$
0360: 49 44 0a 2a 2a 0a 2a 2a 20 50 72 65 70 61 72 65  ID.**.** Prepare
0370: 20 74 68 65 20 61 62 6f 76 65 20 73 74 61 74 65   the above state
0380: 6d 65 6e 74 20 6f 6e 63 65 2e 20 20 54 68 65 6e  ment once.  Then
0390: 20 74 6f 20 75 73 65 20 69 74 2c 20 62 69 6e 64   to use it, bind
03a0: 20 74 68 65 20 61 64 64 72 65 73 73 0a 2a 2a 20   the address.** 
03b0: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  of the output va
03c0: 72 69 61 62 6c 65 20 74 6f 20 24 50 54 52 20 75  riable to $PTR u
03d0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 69 6e  sing sqlite3_bin
03e0: 64 5f 70 6f 69 6e 74 65 72 28 29 20 77 69 74 68  d_pointer() with
03f0: 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 79   a.** pointer ty
0400: 70 65 20 6f 66 20 22 63 61 72 72 61 79 22 20 61  pe of "carray" a
0410: 6e 64 20 62 69 6e 64 20 74 68 65 20 69 64 20 6f  nd bind the id o
0420: 66 20 74 68 65 20 63 6f 75 6e 74 65 72 20 74 6f  f the counter to
0430: 20 24 49 44 20 61 6e 64 0a 2a 2a 20 72 75 6e 20   $ID and.** run 
0440: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
0450: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
0460: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
0470: 6e 20 6f 66 20 74 68 65 20 72 65 6d 65 6d 62 65  n of the remembe
0480: 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  r() function use
0490: 73 20 61 20 22 63 61 72 72 61 79 22 0a 2a 2a 20  s a "carray".** 
04a0: 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
04b0: 69 74 20 63 61 6e 20 73 68 61 72 65 20 70 6f 69  it can share poi
04c0: 6e 74 65 72 73 20 77 69 74 68 20 74 68 65 20 63  nters with the c
04d0: 61 72 72 61 79 28 29 20 65 78 74 65 6e 73 69 6f  array() extensio
04e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 63 61 6e  n..**.** One can
04f0: 20 69 6d 61 67 69 6e 65 20 64 6f 69 6e 67 20 73   imagine doing s
0500: 69 6d 69 6c 61 72 20 74 68 69 6e 67 73 20 77 69  imilar things wi
0510: 74 68 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  th floating-poin
0520: 74 20 76 61 6c 75 65 73 20 61 6e 64 0a 2a 2a 20  t values and.** 
0530: 73 74 72 69 6e 67 73 2c 20 62 75 74 20 74 68 69  strings, but thi
0540: 73 20 64 65 6d 6f 6e 73 74 72 61 74 69 6f 6e 20  s demonstration 
0550: 65 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 73  extension will s
0560: 74 69 63 6b 20 74 6f 20 75 73 69 6e 67 20 6a 75  tick to using ju
0570: 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 73 2e 0a  st.** integers..
0580: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0590: 69 74 65 33 65 78 74 2e 68 22 0a 53 51 4c 49 54  ite3ext.h".SQLIT
05a0: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
05b0: 31 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  1.#include <asse
05c0: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  rt.h>../*.**    
05d0: 20 20 72 65 6d 65 6d 62 65 72 28 56 2c 50 54 52    remember(V,PTR
05e0: 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ).**.** Return t
05f0: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
0600: 20 56 2e 20 20 41 6c 73 6f 20 73 61 76 65 20 74   V.  Also save t
0610: 68 65 20 76 61 6c 75 65 20 6f 66 20 56 20 69 6e  he value of V in
0620: 20 61 0a 2a 2a 20 43 2d 6c 61 6e 67 75 61 67 65   a.** C-language
0630: 20 76 61 72 69 61 62 6c 65 20 77 68 6f 73 65 20   variable whose 
0640: 61 64 64 72 65 73 73 20 69 73 20 50 54 52 2e 0a  address is PTR..
0650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
0660: 65 6d 65 6d 62 65 72 46 75 6e 63 28 0a 20 20 73  ememberFunc(.  s
0670: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0680: 70 43 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pCtx,.  int argc
0690: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
06a0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  e **argv.){.  sq
06b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
06c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
06d0: 70 74 72 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ptr;.  assert( a
06e0: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 76 20 3d 20  rgc==2 );.  v = 
06f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
0700: 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t64(argv[0]);.  
0710: 70 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ptr = sqlite3_va
0720: 6c 75 65 5f 70 6f 69 6e 74 65 72 28 61 72 67 76  lue_pointer(argv
0730: 5b 31 5d 2c 20 22 63 61 72 72 61 79 22 29 3b 0a  [1], "carray");.
0740: 20 20 69 66 28 20 70 74 72 20 29 20 2a 70 74 72    if( ptr ) *ptr
0750: 20 3d 20 76 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = v;.  sqlite3_
0760: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
0770: 78 2c 20 76 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  x, v);.}..#ifdef
0780: 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70   _WIN32.__declsp
0790: 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65  ec(dllexport).#e
07a0: 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33  ndif.int sqlite3
07b0: 5f 72 65 6d 65 6d 62 65 72 5f 69 6e 69 74 28 0a  _remember_init(.
07c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
07d0: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
07e0: 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
07f0: 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
0800: 20 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20   *pApi.){.  int 
0810: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0820: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
0830: 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
0840: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
0850: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
0860: 62 2c 20 22 72 65 6d 65 6d 62 65 72 22 2c 20 32  b, "remember", 2
0870: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
0880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 72 65 6d 65 6d 62 65 72 46 75 6e 63 2c 20 30   rememberFunc, 0
08b0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
08c0: 63 3b 0a 7d 0a                                   c;.}.