SQLite
Hex Artifact Content
Not logged in

Artifact 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 2d 30 34 2d 31 36  /*.** 2017-04-16
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: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 72 75 6e  implements a run
0190: 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20 65  -time loadable e
01a0: 78 74 65 6e 73 69 6f 6e 20 74 6f 20 53 51 4c 69  xtension to SQLi
01b0: 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 67 69 73  te that.** regis
01c0: 74 65 72 73 20 61 20 73 71 6c 69 74 65 33 5f 63  ters a sqlite3_c
01d0: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
01e0: 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65  ) callback to re
01f0: 67 69 73 74 65 72 20 61 20 66 61 6b 65 0a 2a 2a  gister a fake.**
0200: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
0210: 69 6f 6e 20 66 6f 72 20 61 6e 79 20 75 6e 6b 6e  ion for any unkn
0220: 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  own collating se
0230: 71 75 65 6e 63 65 2e 20 20 54 68 65 20 66 61 6b  quence.  The fak
0240: 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  e.** collating f
0250: 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
0260: 6b 65 20 42 49 4e 41 52 59 2e 0a 2a 2a 0a 2a 2a  ke BINARY..**.**
0270: 20 54 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20   This extension 
0280: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 6c  can be used to l
0290: 6f 61 64 20 73 63 68 65 6d 61 73 20 74 68 61 74  oad schemas that
02a0: 20 63 6f 6e 74 61 69 6e 20 6f 6e 65 20 6f 72 20   contain one or 
02b0: 6d 6f 72 65 0a 2a 2a 20 75 6e 6b 6e 6f 77 6e 20  more.** unknown 
02c0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
02d0: 63 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ces..*/.#include
02e0: 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a   "sqlite3ext.h".
02f0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
0300: 5f 49 4e 49 54 31 0a 23 69 6e 63 6c 75 64 65 20  _INIT1.#include 
0310: 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 73 74 61 74  <string.h>..stat
0320: 69 63 20 69 6e 74 20 61 6e 79 43 6f 6c 6c 46 75  ic int anyCollFu
0330: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
0340: 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
0350: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
0360: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
0370: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
0380: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
0390: 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
03a0: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
03b0: 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65  nKey2;.  rc = me
03c0: 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79  mcmp(pKey1, pKey
03d0: 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  2, n);.  if( rc=
03e0: 3d 30 20 29 20 72 63 20 3d 20 6e 4b 65 79 31 20  =0 ) rc = nKey1 
03f0: 2d 20 6e 4b 65 79 32 3b 0a 20 20 72 65 74 75 72  - nKey2;.  retur
0400: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
0410: 76 6f 69 64 20 61 6e 79 43 6f 6c 6c 4e 65 65 64  void anyCollNeed
0420: 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ed(.  void *NotU
0430: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a  sed,.  sqlite3 *
0440: 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  db,.  int eTextR
0450: 65 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ep,.  const char
0460: 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 0a 29 7b 0a 20   *zCollName.){. 
0470: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
0480: 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 43  collation(db, zC
0490: 6f 6c 6c 4e 61 6d 65 2c 20 65 54 65 78 74 52 65  ollName, eTextRe
04a0: 70 2c 20 30 2c 20 61 6e 79 43 6f 6c 6c 46 75 6e  p, 0, anyCollFun
04b0: 63 29 3b 20 0a 7d 0a 0a 23 69 66 64 65 66 20 5f  c); .}..#ifdef _
04c0: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
04d0: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
04e0: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 61  if.int sqlite3_a
04f0: 6e 79 63 6f 6c 6c 73 65 71 5f 69 6e 69 74 28 0a  nycollseq_init(.
0500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
0510: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
0520: 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
0530: 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
0540: 20 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20   *pApi.){.  int 
0550: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0560: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
0570: 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
0580: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
0590: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
05a0: 64 62 2c 20 30 2c 20 61 6e 79 43 6f 6c 6c 4e 65  db, 0, anyCollNe
05b0: 65 64 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  eded);.  return 
05c0: 72 63 3b 0a 7d 0a                                rc;.}.