/ Hex Artifact Content
Login

Artifact 3246613b20857e58f7419e4e26dbe9161677aff0:


0000: 0a 23 69 66 6e 64 65 66 20 5f 5f 53 51 4c 49 54  .#ifndef __SQLIT
0010: 45 53 45 53 53 49 4f 4e 5f 48 5f 0a 23 64 65 66  ESESSION_H_.#def
0020: 69 6e 65 20 5f 5f 53 51 4c 49 54 45 53 45 53 53  ine __SQLITESESS
0030: 49 4f 4e 5f 48 5f 20 31 0a 0a 2f 2a 0a 2a 2a 20  ION_H_ 1../*.** 
0040: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 63 61 6e  Make sure we can
0050: 20 63 61 6c 6c 20 74 68 69 73 20 73 74 75 66 66   call this stuff
0060: 20 66 72 6f 6d 20 43 2b 2b 2e 0a 2a 2f 0a 23 69   from C++..*/.#i
0070: 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73  fdef __cplusplus
0080: 0a 65 78 74 65 72 6e 20 22 43 22 20 7b 0a 23 65  .extern "C" {.#e
0090: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
00a0: 73 71 6c 69 74 65 33 2e 68 22 0a 0a 74 79 70 65  sqlite3.h"..type
00b0: 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74  def struct sqlit
00c0: 65 33 5f 73 65 73 73 69 6f 6e 20 73 71 6c 69 74  e3_session sqlit
00d0: 65 33 5f 73 65 73 73 69 6f 6e 3b 0a 74 79 70 65  e3_session;.type
00e0: 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74  def struct sqlit
00f0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
0100: 72 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  r sqlite3_change
0110: 73 65 74 5f 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a  set_iter;../*.**
0120: 20 43 72 65 61 74 65 20 61 20 73 65 73 73 69 6f   Create a sessio
0130: 6e 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 73  n object. This s
0140: 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 77 69  ession object wi
0150: 6c 6c 20 72 65 63 6f 72 64 20 63 68 61 6e 67 65  ll record change
0160: 73 20 74 6f 0a 2a 2a 20 64 61 74 61 62 61 73 65  s to.** database
0170: 20 7a 44 62 20 61 74 74 61 63 68 65 64 20 74 6f   zDb attached to
0180: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
0190: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
01a0: 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 0a 20 20  ssion_create(.  
01b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
01c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01d0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
01e0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
01f0: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
0200: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
0210: 6f 66 20 64 62 20 28 65 2e 67 2e 20 22 6d 61 69  of db (e.g. "mai
0220: 6e 22 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n") */.  sqlite3
0230: 5f 73 65 73 73 69 6f 6e 20 2a 2a 70 70 53 65 73  _session **ppSes
0240: 73 69 6f 6e 20 20 20 20 20 2f 2a 20 4f 55 54 3a  sion     /* OUT:
0250: 20 4e 65 77 20 73 65 73 73 69 6f 6e 20 6f 62 6a   New session obj
0260: 65 63 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ect */.);../*.**
0270: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
0280: 6c 65 20 74 68 65 20 72 65 63 6f 72 64 69 6e 67  le the recording
0290: 20 6f 66 20 63 68 61 6e 67 65 73 20 62 79 20 61   of changes by a
02a0: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 2e   session object.
02b0: 20 57 68 65 6e 0a 2a 2a 20 65 6e 61 62 6c 65 64   When.** enabled
02c0: 2c 20 61 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65  , a session obje
02d0: 63 74 20 72 65 63 6f 72 64 73 20 63 68 61 6e 67  ct records chang
02e0: 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  es made to the d
02f0: 61 74 61 62 61 73 65 2e 20 57 68 65 6e 0a 2a 2a  atabase. When.**
0300: 20 64 69 73 61 62 6c 65 64 20 2d 20 69 74 20 64   disabled - it d
0310: 6f 65 73 20 6e 6f 74 2e 20 41 20 6e 65 77 6c 79  oes not. A newly
0320: 20 63 72 65 61 74 65 64 20 73 65 73 73 69 6f 6e   created session
0330: 20 6f 62 6a 65 63 74 20 69 73 20 65 6e 61 62 6c   object is enabl
0340: 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 73 73 69 6e  ed..**.** Passin
0350: 67 20 7a 65 72 6f 20 74 6f 20 74 68 69 73 20 66  g zero to this f
0360: 75 6e 63 74 69 6f 6e 20 64 69 73 61 62 6c 65 73  unction disables
0370: 20 74 68 65 20 73 65 73 73 69 6f 6e 2e 20 50 61   the session. Pa
0380: 73 73 69 6e 67 20 61 20 76 61 6c 75 65 0a 2a 2a  ssing a value.**
0390: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
03a0: 72 6f 20 65 6e 61 62 6c 65 73 20 69 74 2e 20 50  ro enables it. P
03b0: 61 73 73 69 6e 67 20 61 20 76 61 6c 75 65 20 6c  assing a value l
03c0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 20 69 73  ess than zero is
03d0: 20 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2c 20 61 6e   a .** no-op, an
03e0: 64 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  d may be used to
03f0: 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65   query the curre
0400: 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
0410: 73 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  session..**.** T
0420: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
0430: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 66 69  indicates the fi
0440: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
0450: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 3a   session object:
0460: 20 30 20 69 66 20 0a 2a 2a 20 74 68 65 20 73 65   0 if .** the se
0470: 73 73 69 6f 6e 20 69 73 20 64 69 73 61 62 6c 65  ssion is disable
0480: 64 2c 20 6f 72 20 31 20 69 66 20 69 74 20 69 73  d, or 1 if it is
0490: 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 69 6e 74   enabled..*/.int
04a0: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
04b0: 65 6e 61 62 6c 65 28 73 71 6c 69 74 65 33 5f 73  enable(sqlite3_s
04c0: 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
04d0: 2c 20 69 6e 74 20 62 45 6e 61 62 6c 65 29 3b 0a  , int bEnable);.
04e0: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 61 20  ./*.** Attach a 
04f0: 74 61 62 6c 65 20 74 6f 20 61 20 73 65 73 73 69  table to a sessi
0500: 6f 6e 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65  on. All subseque
0510: 6e 74 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  nt changes made 
0520: 74 6f 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  to the table.** 
0530: 77 68 69 6c 65 20 74 68 65 20 73 65 73 73 69 6f  while the sessio
0540: 6e 20 6f 62 6a 65 63 74 20 69 73 20 65 6e 61 62  n object is enab
0550: 6c 65 64 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  led will be reco
0560: 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  rded..**.** Only
0570: 20 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 76   tables that hav
0580: 65 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  e a PRIMARY KEY 
0590: 64 65 66 69 6e 65 64 20 6d 61 79 20 62 65 20 61  defined may be a
05a0: 74 74 61 63 68 65 64 2e 20 49 74 20 64 6f 65 73  ttached. It does
05b0: 0a 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 20 69  .** not matter i
05c0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
05d0: 59 20 69 73 20 61 6e 20 22 49 4e 54 45 47 45 52  Y is an "INTEGER
05e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 22 20 28 72   PRIMARY KEY" (r
05f0: 6f 77 69 64 20 61 6c 69 61 73 29 0a 2a 2a 20 6f  owid alias).** o
0600: 72 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  r not..*/.int sq
0610: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74  lite3session_att
0620: 61 63 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 73  ach(.  sqlite3_s
0630: 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
0640: 2c 20 20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ,      /* Sessio
0650: 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  n object */.  co
0660: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 20  nst char *zTab  
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0680: 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29   Table name */.)
0690: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  ;../*.** Obtain 
06a0: 61 20 63 68 61 6e 67 65 73 65 74 20 6f 62 6a 65  a changeset obje
06b0: 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c  ct containing al
06c0: 6c 20 63 68 61 6e 67 65 73 20 72 65 63 6f 72 64  l changes record
06d0: 65 64 20 62 79 20 74 68 65 20 0a 2a 2a 20 73 65  ed by the .** se
06e0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70 61 73  ssion object pas
06f0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
0700: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
0710: 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
0720: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
0730: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
0740: 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 62  ually free the b
0750: 75 66 66 65 72 20 0a 2a 2a 20 75 73 69 6e 67 20  uffer .** using 
0760: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
0770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 73 65  */.int sqlite3se
0780: 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28  ssion_changeset(
0790: 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73 69  .  sqlite3_sessi
07a0: 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 2c 20 20 20  on *pSession,   
07b0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 6f 62     /* Session ob
07c0: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
07d0: 6e 43 68 61 6e 67 65 73 65 74 2c 20 20 20 20 20  nChangeset,     
07e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
07f0: 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  : Size of buffer
0800: 20 61 74 20 2a 70 70 43 68 61 6e 67 65 73 65 74   at *ppChangeset
0810: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 43   */.  void **ppC
0820: 68 61 6e 67 65 73 65 74 20 20 20 20 20 20 20 20  hangeset        
0830: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 75        /* OUT: Bu
0840: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
0850: 63 68 61 6e 67 65 73 65 74 20 2a 2f 0a 29 3b 0a  changeset */.);.
0860: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
0870: 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 70  session object p
0880: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
0890: 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
08a0: 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28  3session_create(
08b0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
08c0: 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65  e3session_delete
08d0: 28 73 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e  (sqlite3_session
08e0: 20 2a 70 53 65 73 73 69 6f 6e 29 3b 0a 0a 0a 2f   *pSession);.../
08f0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 69  *.** Create an i
0900: 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20  terator used to 
0910: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
0920: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
0930: 61 20 63 68 61 6e 67 65 73 65 74 2e 0a 2a 2f 0a  a changeset..*/.
0940: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
0950: 65 73 65 74 5f 73 74 61 72 74 28 0a 20 20 73 71  eset_start(.  sq
0960: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
0970: 69 74 65 72 20 2a 2a 70 70 49 74 65 72 2c 0a 20  iter **ppIter,. 
0980: 20 69 6e 74 20 6e 43 68 61 6e 67 65 73 65 74 2c   int nChangeset,
0990: 20 0a 20 20 76 6f 69 64 20 2a 70 43 68 61 6e 67   .  void *pChang
09a0: 65 73 65 74 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41  eset.);../*.** A
09b0: 64 76 61 6e 63 65 20 61 6e 20 69 74 65 72 61 74  dvance an iterat
09c0: 6f 72 20 63 72 65 61 74 65 64 20 62 79 20 73 71  or created by sq
09d0: 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f 73  lite3changeset_s
09e0: 74 61 72 74 28 29 20 74 6f 20 74 68 65 20 6e 65  tart() to the ne
09f0: 78 74 0a 2a 2a 20 63 68 61 6e 67 65 20 69 6e 20  xt.** change in 
0a00: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54  the changeset. T
0a10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
0a20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
0a30: 4f 57 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 0a  OW, SQLITE_DONE.
0a40: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52  ** or SQLITE_COR
0a50: 52 55 50 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  RUPT..**.** This
0a60: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 6f   function may no
0a70: 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 69  t be called on i
0a80: 74 65 72 61 74 6f 72 73 20 70 61 73 73 65 64 20  terators passed 
0a90: 74 6f 20 61 20 63 6f 6e 66 6c 69 63 74 20 68 61  to a conflict ha
0aa0: 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ndler.** callbac
0ab0: 6b 20 62 79 20 63 68 61 6e 67 65 73 65 74 5f 61  k by changeset_a
0ac0: 70 70 6c 79 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  pply()..*/.int s
0ad0: 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74 5f  qlite3changeset_
0ae0: 6e 65 78 74 28 73 71 6c 69 74 65 33 5f 63 68 61  next(sqlite3_cha
0af0: 6e 67 65 73 65 74 5f 69 74 65 72 20 2a 70 49 74  ngeset_iter *pIt
0b00: 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  er);../*.** The 
0b10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
0b20: 66 75 6e 63 74 69 6f 6e 73 20 65 78 74 72 61 63  functions extrac
0b30: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  t information on
0b40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
0b50: 6e 67 65 0a 2a 2a 20 66 72 6f 6d 20 61 20 63 68  nge.** from a ch
0b60: 61 6e 67 65 73 65 74 20 69 74 65 72 61 74 6f 72  angeset iterator
0b70: 2e 20 54 68 65 79 20 6d 61 79 20 6f 6e 6c 79 20  . They may only 
0b80: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
0b90: 63 68 61 6e 67 65 73 65 74 5f 6e 65 78 74 28 29  changeset_next()
0ba0: 0a 2a 2a 20 68 61 73 20 72 65 74 75 72 6e 65 64  .** has returned
0bb0: 20 53 51 4c 49 54 45 5f 52 4f 57 2e 0a 2a 2f 0a   SQLITE_ROW..*/.
0bc0: 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67  int sqlite3chang
0bd0: 65 73 65 74 5f 6f 70 28 0a 20 20 73 71 6c 69 74  eset_op(.  sqlit
0be0: 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65  e3_changeset_ite
0bf0: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 2f  r *pIter,      /
0c00: 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  * Iterator objec
0c10: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
0c20: 72 20 2a 2a 70 7a 54 61 62 2c 20 20 20 20 20 20  r **pzTab,      
0c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
0c40: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 61  T: Pointer to ta
0c50: 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  ble name */.  in
0c60: 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  t *pnCol,       
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
0c90: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
0ca0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  able */.  int *p
0cb0: 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0cd0: 20 4f 55 54 3a 20 53 51 4c 49 54 45 5f 49 4e 53   OUT: SQLITE_INS
0ce0: 45 52 54 2c 20 44 45 4c 45 54 45 20 6f 72 20 55  ERT, DELETE or U
0cf0: 50 44 41 54 45 20 2a 2f 0a 29 3b 0a 0a 69 6e 74  PDATE */.);..int
0d00: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
0d10: 74 5f 6f 6c 64 28 0a 20 20 73 71 6c 69 74 65 33  t_old(.  sqlite3
0d20: 5f 63 68 61 6e 67 65 73 65 74 5f 69 74 65 72 20  _changeset_iter 
0d30: 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 69 56  *pIter,.  int iV
0d40: 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
0d50: 6c 75 65 20 2a 2a 70 70 56 61 6c 75 65 20 20 20  lue **ppValue   
0d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
0d70: 3a 20 4f 6c 64 20 76 61 6c 75 65 20 28 6f 72 20  : Old value (or 
0d80: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 29 20 2a 2f  NULL pointer) */
0d90: 0a 29 3b 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .);..int sqlite3
0da0: 63 68 61 6e 67 65 73 65 74 5f 6e 65 77 28 0a 20  changeset_new(. 
0db0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
0dc0: 65 74 5f 69 74 65 72 20 2a 70 49 74 65 72 2c 0a  et_iter *pIter,.
0dd0: 20 20 69 6e 74 20 69 56 61 6c 2c 0a 20 20 73 71    int iVal,.  sq
0de0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
0df0: 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 20 20  Value           
0e00: 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61    /* OUT: New va
0e10: 6c 75 65 20 28 6f 72 20 4e 55 4c 4c 20 70 6f 69  lue (or NULL poi
0e20: 6e 74 65 72 29 20 2a 2f 0a 29 3b 0a 2f 2a 0a 2a  nter) */.);./*.*
0e30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
0e40: 69 73 20 6f 6e 6c 79 20 75 73 61 62 6c 65 20 77  is only usable w
0e50: 69 74 68 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  ith sqlite3_chan
0e60: 67 65 73 65 74 5f 69 74 65 72 20 6f 62 6a 65 63  geset_iter objec
0e70: 74 73 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ts passed.** to 
0e80: 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 20 63 61  the xConflict ca
0e90: 6c 6c 62 61 63 6b 20 62 79 20 73 71 6c 69 74 65  llback by sqlite
0ea0: 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c 79  3changeset_apply
0eb0: 28 29 2e 20 49 74 20 63 61 6e 6e 6f 74 20 62 65  (). It cannot be
0ec0: 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 69 74   used.** with it
0ed0: 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20  erators created 
0ee0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 63 68 61  using sqlite3cha
0ef0: 6e 67 65 73 65 74 5f 73 74 61 72 74 28 29 2e 0a  ngeset_start()..
0f00: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 75 73 65 64  **.** It is used
0f10: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 22   to access the "
0f20: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 22  conflicting row"
0f30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 76 61   information ava
0f40: 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 0a 2a 2a  ilable to the.**
0f50: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 65   conflict handle
0f60: 72 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  r if the second 
0f70: 61 72 67 75 6d 65 6e 74 20 69 73 20 65 69 74 68  argument is eith
0f80: 65 72 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45  er SQLITE_CHANGE
0f90: 53 45 54 5f 44 41 54 41 0a 2a 2a 20 6f 72 20 53  SET_DATA.** or S
0fa0: 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54 5f  QLITE_CHANGESET_
0fb0: 43 4f 4e 46 4c 49 43 54 2e 0a 2a 2f 0a 69 6e 74  CONFLICT..*/.int
0fc0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
0fd0: 74 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73 71  t_conflict(.  sq
0fe0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f  lite3_changeset_
0ff0: 69 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69  iter *pIter,.  i
1000: 6e 74 20 69 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt iVal,.  sqlit
1010: 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c  e3_value **ppVal
1020: 75 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  ue         /* OU
1030: 54 3a 20 56 61 6c 75 65 20 66 72 6f 6d 20 63 6f  T: Value from co
1040: 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 2a 2f  nflicting row */
1050: 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61  .);.../*.** Fina
1060: 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lize an iterator
1070: 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20   allocated with 
1080: 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65 74  sqlite3changeset
1090: 5f 73 74 61 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  _start()..**.** 
10a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
10b0: 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  y not be called 
10c0: 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 70 61 73  on iterators pas
10d0: 73 65 64 20 74 6f 20 61 20 63 6f 6e 66 6c 69 63  sed to a conflic
10e0: 74 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c  t handler.** cal
10f0: 6c 62 61 63 6b 20 62 79 20 63 68 61 6e 67 65 73  lback by changes
1100: 65 74 5f 61 70 70 6c 79 28 29 2e 0a 2a 2f 0a 69  et_apply()..*/.i
1110: 6e 74 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  nt sqlite3change
1120: 73 65 74 5f 66 69 6e 61 6c 69 7a 65 28 73 71 6c  set_finalize(sql
1130: 69 74 65 33 5f 63 68 61 6e 67 65 73 65 74 5f 69  ite3_changeset_i
1140: 74 65 72 20 2a 70 49 74 65 72 29 3b 0a 0a 2f 2a  ter *pIter);../*
1150: 0a 2a 2a 20 49 6e 76 65 72 74 20 61 20 63 68 61  .** Invert a cha
1160: 6e 67 65 73 65 74 20 6f 62 6a 65 63 74 2e 0a 2a  ngeset object..*
1170: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 63 68 61  /.int sqlite3cha
1180: 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28 0a 20  ngeset_invert(. 
1190: 20 69 6e 74 20 6e 49 6e 2c 20 76 6f 69 64 20 2a   int nIn, void *
11a0: 70 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pIn,            
11b0: 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 6e 67 65   /* Input change
11c0: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  set */.  int *pn
11d0: 4f 75 74 2c 20 76 6f 69 64 20 2a 2a 70 70 4f 75  Out, void **ppOu
11e0: 74 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  t        /* OUT:
11f0: 20 49 6e 76 65 72 73 65 20 6f 66 20 69 6e 70 75   Inverse of inpu
1200: 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.);../*.** A
1210: 70 70 6c 79 20 61 20 63 68 61 6e 67 65 73 65 74  pply a changeset
1220: 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 2e 0a   to a database..
1230: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 73 61 66 65  **.** It is safe
1240: 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 20   to execute SQL 
1250: 73 74 61 74 65 6d 65 6e 74 73 2c 20 69 6e 63 6c  statements, incl
1260: 75 64 69 6e 67 20 74 68 6f 73 65 20 74 68 61 74  uding those that
1270: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a   write to the.**
1280: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
1290: 63 61 6c 6c 62 61 63 6b 20 72 65 6c 61 74 65 64  callback related
12a0: 20 74 6f 2c 20 66 72 6f 6d 20 77 69 74 68 69 6e   to, from within
12b0: 20 74 68 65 20 78 43 6f 6e 66 6c 69 63 74 20 63   the xConflict c
12c0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  allback..** This
12d0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
12e0: 66 75 72 74 68 65 72 20 63 75 73 74 6f 6d 69 7a  further customiz
12f0: 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  e the applicatio
1300: 6e 73 20 63 6f 6e 66 6c 69 63 74 0a 2a 2a 20 72  ns conflict.** r
1310: 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65  esolution strate
1320: 67 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  gy..*/.int sqlit
1330: 65 33 63 68 61 6e 67 65 73 65 74 5f 61 70 70 6c  e3changeset_appl
1340: 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  y(.  sqlite3 *db
1350: 2c 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 73  ,.  int nChanges
1360: 65 74 2c 0a 20 20 76 6f 69 64 20 2a 70 43 68 61  et,.  void *pCha
1370: 6e 67 65 73 65 74 2c 0a 20 20 69 6e 74 28 2a 78  ngeset,.  int(*x
1380: 43 6f 6e 66 6c 69 63 74 29 28 0a 20 20 20 20 76  Conflict)(.    v
1390: 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b0: 43 6f 70 79 20 6f 66 20 66 69 66 74 68 20 61 72  Copy of fifth ar
13c0: 67 20 74 6f 20 5f 61 70 70 6c 79 28 29 20 2a 2f  g to _apply() */
13d0: 0a 20 20 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69  .    int eConfli
13e0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
13f0: 20 20 20 2f 2a 20 44 41 54 41 2c 20 4d 49 53 53     /* DATA, MISS
1400: 49 4e 47 2c 20 43 4f 4e 46 4c 49 43 54 2c 20 43  ING, CONFLICT, C
1410: 4f 4e 53 54 52 41 49 4e 54 20 2a 2f 0a 20 20 20  ONSTRAINT */.   
1420: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
1430: 65 74 5f 69 74 65 72 20 2a 70 20 20 20 20 20 2f  et_iter *p     /
1440: 2a 20 48 61 6e 64 6c 65 20 64 65 73 63 72 69 62  * Handle describ
1450: 69 6e 67 20 63 68 61 6e 67 65 20 61 6e 64 20 63  ing change and c
1460: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 29 2c 0a  onflict */.  ),.
1470: 20 20 76 6f 69 64 20 2a 70 43 74 78 0a 29 3b 0a    void *pCtx.);.
1480: 0a 2f 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65  ./* Values passe
1490: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
14a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 20 63 6f  argument to a co
14b0: 6e 66 6c 69 63 74 2d 68 61 6e 64 6c 65 72 20 2a  nflict-handler *
14c0: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
14d0: 5f 43 48 41 4e 47 45 53 45 54 5f 44 41 54 41 20  _CHANGESET_DATA 
14e0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
14f0: 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45 54  SQLITE_CHANGESET
1500: 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 32 0a 23 64  _NOTFOUND   2.#d
1510: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41  efine SQLITE_CHA
1520: 4e 47 45 53 45 54 5f 43 4f 4e 46 4c 49 43 54 20  NGESET_CONFLICT 
1530: 20 20 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 49    3.#define SQLI
1540: 54 45 5f 43 48 41 4e 47 45 53 45 54 5f 43 4f 4e  TE_CHANGESET_CON
1550: 53 54 52 41 49 4e 54 20 34 0a 0a 2f 2a 20 56 61  STRAINT 4../* Va
1560: 6c 69 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65  lid return value
1570: 73 20 66 72 6f 6d 20 61 20 63 6f 6e 66 6c 69 63  s from a conflic
1580: 74 2d 68 61 6e 64 6c 65 72 20 2a 2f 0a 23 64 65  t-handler */.#de
1590: 66 69 6e 65 20 53 51 4c 49 54 45 5f 43 48 41 4e  fine SQLITE_CHAN
15a0: 47 45 53 45 54 5f 4f 4d 49 54 20 20 20 20 20 20  GESET_OMIT      
15b0: 20 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54   0.#define SQLIT
15c0: 45 5f 43 48 41 4e 47 45 53 45 54 5f 52 45 50 4c  E_CHANGESET_REPL
15d0: 41 43 45 20 20 20 20 31 0a 23 64 65 66 69 6e 65  ACE    1.#define
15e0: 20 53 51 4c 49 54 45 5f 43 48 41 4e 47 45 53 45   SQLITE_CHANGESE
15f0: 54 5f 41 42 4f 52 54 20 20 20 20 20 20 32 0a 0a  T_ABORT      2..
1600: 23 65 6e 64 69 66 0a 0a                          #endif..