modernc.org/cc@v1.0.1/v2/testdata/_sqlite/ext/lsm1/lsm_vtab.c (about)

     1  /*
     2  ** 2015-11-16
     3  **
     4  ** The author disclaims copyright to this source code.  In place of
     5  ** a legal notice, here is a blessing:
     6  **
     7  **    May you do good and not evil.
     8  **    May you find forgiveness for yourself and forgive others.
     9  **    May you share freely, never taking more than you give.
    10  **
    11  *************************************************************************
    12  **
    13  ** This file implements a virtual table for SQLite3 around the LSM
    14  ** storage engine from SQLite4.
    15  **
    16  ** USAGE
    17  **
    18  **   CREATE VIRTUAL TABLE demo USING lsm1(filename,key,keytype,value1,...);
    19  **
    20  ** The filename parameter is the name of the LSM database file, which is
    21  ** separate and distinct from the SQLite3 database file.
    22  **
    23  ** The keytype must be one of: UINT, TEXT, BLOB.  All keys must be of that
    24  ** one type.  "UINT" means unsigned integer.  The values may be of any
    25  ** SQLite datatype: BLOB, TEXT, INTEGER, FLOAT, or NULL.
    26  **
    27  ** The virtual table contains read-only hidden columns:
    28  **
    29  **     lsm1_key	      A BLOB which is the raw LSM key.  If the "keytype"
    30  **                    is BLOB or TEXT then this column is exactly the
    31  **                    same as the key.  For the UINT keytype, this column
    32  **                    will be a variable-length integer encoding of the key.
    33  **
    34  **     lsm1_value     A BLOB which is the raw LSM value.  All of the value
    35  **                    columns are packed into this BLOB using the encoding
    36  **                    described below.
    37  **
    38  ** Attempts to write values into the lsm1_key and lsm1_value columns are
    39  ** silently ignored.
    40  **
    41  ** EXAMPLE
    42  **
    43  ** The virtual table declared this way:
    44  **
    45  **    CREATE VIRTUAL TABLE demo2 USING lsm1('x.lsm',id,UINT,a,b,c,d);
    46  **
    47  ** Results in a new virtual table named "demo2" that acts as if it has
    48  ** the following schema:
    49  **
    50  **    CREATE TABLE demo2(
    51  **      id UINT PRIMARY KEY ON CONFLICT REPLACE,
    52  **      a ANY,
    53  **      b ANY,
    54  **      c ANY,
    55  **      d ANY,
    56  **      lsm1_key BLOB HIDDEN,
    57  **      lsm1_value BLOB HIDDEN
    58  **    ) WITHOUT ROWID;
    59  **
    60  ** 
    61  **
    62  ** INTERNALS
    63  **
    64  ** The key encoding for BLOB and TEXT is just a copy of the blob or text.
    65  ** UTF-8 is used for text.  The key encoding for UINT is the variable-length
    66  ** integer format at https://sqlite.org/src4/doc/trunk/www/varint.wiki.
    67  **
    68  ** The values are encoded as a single blob (since that is what lsm stores as
    69  ** its content).  There is a "type integer" followed by "content" for each
    70  ** value, alternating back and forth.  The content might be empty.
    71  **
    72  **    TYPE1  CONTENT1  TYPE2  CONTENT2  TYPE3  CONTENT3 ....
    73  **
    74  ** Each "type integer" is encoded as a variable-length integer in the
    75  ** format of the link above.  Let the type integer be T.  The actual
    76  ** datatype is an integer 0-5 equal to T%6.  Values 1 through 5 correspond
    77  ** to SQLITE_INTEGER through SQLITE_NULL.  The size of the content in bytes
    78  ** is T/6.  Type value 0 means that the value is an integer whose actual
    79  ** values is T/6 and there is no content.  The type-value-0 integer format
    80  ** only works for integers in the range of 0 through 40.
    81  **
    82  ** There is no content for NULL or type-0 integers.  For BLOB and TEXT
    83  ** values, the content is the blob data or the UTF-8 text data.  For
    84  ** non-negative integers X, the content is a variable-length integer X*2.
    85  ** For negative integers Y, the content is varaible-length integer (1-Y)*2+1.
    86  ** For FLOAT values, the content is the IEEE754 floating point value in
    87  ** native byte-order.  This means that FLOAT values will be corrupted when
    88  ** database file is moved between big-endian and little-endian machines.
    89  */
    90  #include "sqlite3ext.h"
    91  SQLITE_EXTENSION_INIT1
    92  #include "lsm.h"
    93  #include <assert.h>
    94  #include <string.h>
    95  
    96  /* Forward declaration of subclasses of virtual table objects */
    97  typedef struct lsm1_vtab lsm1_vtab;
    98  typedef struct lsm1_cursor lsm1_cursor;
    99  typedef struct lsm1_vblob lsm1_vblob;
   100  
   101  /* Primitive types */
   102  typedef unsigned char u8;
   103  typedef unsigned int u32;
   104  typedef sqlite3_uint64 u64;
   105  
   106  /* An open connection to an LSM table */
   107  struct lsm1_vtab {
   108    sqlite3_vtab base;          /* Base class - must be first */
   109    lsm_db *pDb;                /* Open connection to the LSM table */
   110    u8 keyType;                 /* SQLITE_BLOB, _TEXT, or _INTEGER */
   111    u32 nVal;                   /* Number of value columns */
   112  };
   113  
   114  
   115  /* lsm1_cursor is a subclass of sqlite3_vtab_cursor which will
   116  ** serve as the underlying representation of a cursor that scans
   117  ** over rows of the result
   118  */
   119  struct lsm1_cursor {
   120    sqlite3_vtab_cursor base;  /* Base class - must be first */
   121    lsm_cursor *pLsmCur;       /* The LSM cursor */
   122    u8 isDesc;                 /* 0: scan forward.  1: scan reverse */
   123    u8 atEof;                  /* True if the scan is complete */
   124    u8 bUnique;                /* True if no more than one row of output */
   125    u8 *zData;                 /* Content of the current row */
   126    u32 nData;                 /* Number of bytes in the current row */
   127    u8 *aeType;                /* Types for all column values */
   128    u32 *aiOfst;               /* Offsets to the various fields */
   129    u32 *aiLen;                /* Length of each field */
   130    u8 *pKey2;                 /* Loop termination key, or NULL */
   131    u32 nKey2;                 /* Length of the loop termination key */
   132  };
   133  
   134  /* An extensible buffer object.
   135  **
   136  ** Content can be appended.  Space to hold new content is automatically
   137  ** allocated.
   138  */
   139  struct lsm1_vblob {
   140    u8 *a;             /* Space to hold content, from sqlite3_malloc64() */
   141    u64 n;             /* Bytes of space used */
   142    u64 nAlloc;        /* Bytes of space allocated */
   143    u8 errNoMem;       /* True if a memory allocation error has been seen */
   144  };
   145  
   146  #if defined(__GNUC__)
   147  #  define LSM1_NOINLINE  __attribute__((noinline))
   148  #elif defined(_MSC_VER) && _MSC_VER>=1310
   149  #  define LSM1_NOINLINE  __declspec(noinline)
   150  #else
   151  #  define LSM1_NOINLINE
   152  #endif
   153  
   154  
   155  /* Increase the available space in the vblob object so that it can hold
   156  ** at least N more bytes.  Return the number of errors.
   157  */
   158  static int lsm1VblobEnlarge(lsm1_vblob *p, u32 N){
   159    if( p->n+N>p->nAlloc ){
   160      if( p->errNoMem ) return 1;
   161      p->nAlloc += N + (p->nAlloc ? p->nAlloc : N);
   162      p->a = sqlite3_realloc64(p->a, p->nAlloc);
   163      if( p->a==0 ){
   164        p->n = 0;
   165        p->nAlloc = 0;
   166        p->errNoMem = 1;
   167        return 1;
   168      }
   169      p->nAlloc = sqlite3_msize(p->a);
   170    }
   171    return 0;
   172  }
   173  
   174  /* Append N bytes to a vblob after first enlarging it */
   175  static LSM1_NOINLINE void lsm1VblobEnlargeAndAppend(
   176    lsm1_vblob *p,
   177    const u8 *pData,
   178    u32 N
   179  ){
   180    if( p->n+N>p->nAlloc && lsm1VblobEnlarge(p, N) ) return;
   181    memcpy(p->a+p->n, pData, N);
   182    p->n += N;
   183  }
   184  
   185  /* Append N bytes to a vblob */
   186  static void lsm1VblobAppend(lsm1_vblob *p, const u8 *pData, u32 N){
   187    sqlite3_int64 n = p->n;
   188    if( n+N>p->nAlloc ){
   189      lsm1VblobEnlargeAndAppend(p, pData, N);
   190    }else{
   191      p->n += N;
   192      memcpy(p->a+n, pData, N);
   193    }
   194  }
   195  
   196  /* append text to a vblob */
   197  static void lsm1VblobAppendText(lsm1_vblob *p, const char *z){
   198    lsm1VblobAppend(p, (u8*)z, (u32)strlen(z));
   199  }
   200  
   201  /* Dequote the string */
   202  static void lsm1Dequote(char *z){
   203    int j;
   204    char cQuote = z[0];
   205    size_t i, n;
   206  
   207    if( cQuote!='\'' && cQuote!='"' ) return;
   208    n = strlen(z);
   209    if( n<2 || z[n-1]!=z[0] ) return;
   210    for(i=1, j=0; i<n-1; i++){
   211      if( z[i]==cQuote && z[i+1]==cQuote ) i++;
   212      z[j++] = z[i];
   213    }
   214    z[j] = 0;
   215  }
   216  
   217  
   218  /*
   219  ** The lsm1Connect() method is invoked to create a new
   220  ** lsm1_vtab that describes the virtual table.
   221  */
   222  static int lsm1Connect(
   223    sqlite3 *db,
   224    void *pAux,
   225    int argc, const char *const*argv,
   226    sqlite3_vtab **ppVtab,
   227    char **pzErr
   228  ){
   229    lsm1_vtab *pNew;
   230    int rc;
   231    char *zFilename;
   232    u8 keyType = 0;
   233    int i;
   234    lsm1_vblob sql;
   235    static const char *azTypes[] = { "UINT",         "TEXT",     "BLOB" };
   236    static const u8 aeTypes[] =    { SQLITE_INTEGER, SQLITE_TEXT, SQLITE_BLOB };
   237    static const char *azArgName[] = {"filename", "key", "key type", "value1" };
   238  
   239    for(i=0; i<sizeof(azArgName)/sizeof(azArgName[0]); i++){
   240      if( argc<i+4 || argv[i+3]==0 || argv[i+3][0]==0 ){
   241        *pzErr = sqlite3_mprintf("%s (%r) argument missing",
   242                                 azArgName[i], i+1);
   243        return SQLITE_ERROR;
   244      }
   245    }
   246    for(i=0; i<sizeof(azTypes)/sizeof(azTypes[0]); i++){
   247      if( sqlite3_stricmp(azTypes[i],argv[5])==0 ){
   248        keyType = aeTypes[i];
   249        break;
   250      }
   251    }
   252    if( keyType==0 ){
   253      *pzErr = sqlite3_mprintf("key type should be INT, TEXT, or BLOB");
   254      return SQLITE_ERROR;
   255    }
   256    *ppVtab = sqlite3_malloc( sizeof(*pNew) );
   257    pNew = (lsm1_vtab*)*ppVtab;
   258    if( pNew==0 ){
   259      return SQLITE_NOMEM;
   260    }
   261    memset(pNew, 0, sizeof(*pNew));
   262    pNew->keyType = keyType;
   263    rc = lsm_new(0, &pNew->pDb);
   264    if( rc ){
   265      *pzErr = sqlite3_mprintf("lsm_new failed with error code %d",  rc);
   266      rc = SQLITE_ERROR;
   267      goto connect_failed;
   268    }
   269    zFilename = sqlite3_mprintf("%s", argv[3]);
   270    lsm1Dequote(zFilename);
   271    rc = lsm_open(pNew->pDb, zFilename);
   272    sqlite3_free(zFilename);
   273    if( rc ){
   274      *pzErr = sqlite3_mprintf("lsm_open failed with %d", rc);
   275      rc = SQLITE_ERROR;
   276      goto connect_failed;
   277    }
   278  
   279    memset(&sql, 0, sizeof(sql));
   280    lsm1VblobAppendText(&sql, "CREATE TABLE x(");
   281    lsm1VblobAppendText(&sql, argv[4]);
   282    lsm1VblobAppendText(&sql, " ");
   283    lsm1VblobAppendText(&sql, argv[5]);
   284    lsm1VblobAppendText(&sql, " PRIMARY KEY");
   285    for(i=6; i<argc; i++){
   286      lsm1VblobAppendText(&sql, ", ");
   287      lsm1VblobAppendText(&sql, argv[i]);
   288      pNew->nVal++;
   289    }
   290    lsm1VblobAppendText(&sql, 
   291        ", lsm1_command HIDDEN"
   292        ", lsm1_key HIDDEN"
   293        ", lsm1_value HIDDEN) WITHOUT ROWID");
   294    lsm1VblobAppend(&sql, (u8*)"", 1);
   295    if( sql.errNoMem ){
   296      rc = SQLITE_NOMEM;
   297      goto connect_failed;
   298    }
   299    rc = sqlite3_declare_vtab(db, (const char*)sql.a);
   300    sqlite3_free(sql.a);
   301  
   302  connect_failed:
   303    if( rc!=SQLITE_OK ){
   304      if( pNew ){
   305        if( pNew->pDb ) lsm_close(pNew->pDb);
   306        sqlite3_free(pNew);
   307      }
   308      *ppVtab = 0;
   309    }
   310    return rc;
   311  }
   312  
   313  /*
   314  ** This method is the destructor for lsm1_cursor objects.
   315  */
   316  static int lsm1Disconnect(sqlite3_vtab *pVtab){
   317    lsm1_vtab *p = (lsm1_vtab*)pVtab;
   318    lsm_close(p->pDb);
   319    sqlite3_free(p);
   320    return SQLITE_OK;
   321  }
   322  
   323  /*
   324  ** Constructor for a new lsm1_cursor object.
   325  */
   326  static int lsm1Open(sqlite3_vtab *pVtab, sqlite3_vtab_cursor **ppCursor){
   327    lsm1_vtab *p = (lsm1_vtab*)pVtab;
   328    lsm1_cursor *pCur;
   329    int rc;
   330    pCur = sqlite3_malloc64( sizeof(*pCur)
   331                   + p->nVal*(sizeof(pCur->aiOfst)+sizeof(pCur->aiLen)+1) );
   332    if( pCur==0 ) return SQLITE_NOMEM;
   333    memset(pCur, 0, sizeof(*pCur));
   334    pCur->aiOfst = (u32*)&pCur[1];
   335    pCur->aiLen = &pCur->aiOfst[p->nVal];
   336    pCur->aeType = (u8*)&pCur->aiLen[p->nVal];
   337    *ppCursor = &pCur->base;
   338    rc = lsm_csr_open(p->pDb, &pCur->pLsmCur);
   339    if( rc==LSM_OK ){
   340      rc = SQLITE_OK;
   341    }else{
   342      sqlite3_free(pCur);
   343      *ppCursor = 0;
   344      rc = SQLITE_ERROR;
   345    }
   346    return rc;
   347  }
   348  
   349  /*
   350  ** Destructor for a lsm1_cursor.
   351  */
   352  static int lsm1Close(sqlite3_vtab_cursor *cur){
   353    lsm1_cursor *pCur = (lsm1_cursor*)cur;
   354    sqlite3_free(pCur->pKey2);
   355    lsm_csr_close(pCur->pLsmCur);
   356    sqlite3_free(pCur);
   357    return SQLITE_OK;
   358  }
   359  
   360  
   361  /*
   362  ** Advance a lsm1_cursor to its next row of output.
   363  */
   364  static int lsm1Next(sqlite3_vtab_cursor *cur){
   365    lsm1_cursor *pCur = (lsm1_cursor*)cur;
   366    int rc = LSM_OK;
   367    if( pCur->bUnique ){
   368      pCur->atEof = 1;
   369    }else{
   370      if( pCur->isDesc ){
   371        rc = lsm_csr_prev(pCur->pLsmCur);
   372      }else{
   373        rc = lsm_csr_next(pCur->pLsmCur);
   374      }
   375      if( rc==LSM_OK && lsm_csr_valid(pCur->pLsmCur)==0 ){
   376        pCur->atEof = 1;
   377      }
   378      if( pCur->pKey2 && pCur->atEof==0 ){
   379        const u8 *pVal;
   380        u32 nVal;
   381        assert( pCur->isDesc==0 );
   382        rc = lsm_csr_key(pCur->pLsmCur, (const void**)&pVal, (int*)&nVal);
   383        if( rc==LSM_OK ){
   384          u32 len = pCur->nKey2;
   385          int c;
   386          if( len>nVal ) len = nVal;
   387          c = memcmp(pVal, pCur->pKey2, len);
   388          if( c==0 ) c = nVal - pCur->nKey2;
   389          if( c>0 ) pCur->atEof = 1;
   390        }
   391      }
   392      pCur->zData = 0;
   393    }
   394    return rc==LSM_OK ? SQLITE_OK : SQLITE_ERROR;
   395  }
   396  
   397  /*
   398  ** Return TRUE if the cursor has been moved off of the last
   399  ** row of output.
   400  */
   401  static int lsm1Eof(sqlite3_vtab_cursor *cur){
   402    lsm1_cursor *pCur = (lsm1_cursor*)cur;
   403    return pCur->atEof;
   404  }
   405  
   406  /*
   407  ** Rowids are not supported by the underlying virtual table.  So always
   408  ** return 0 for the rowid.
   409  */
   410  static int lsm1Rowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
   411    *pRowid = 0;
   412    return SQLITE_OK;
   413  }
   414  
   415  /*
   416  ** Type prefixes on LSM keys
   417  */
   418  #define LSM1_TYPE_NEGATIVE   0
   419  #define LSM1_TYPE_POSITIVE   1
   420  #define LSM1_TYPE_TEXT       2
   421  #define LSM1_TYPE_BLOB       3
   422  
   423  /*
   424  ** Write a 32-bit unsigned integer as 4 big-endian bytes.
   425  */
   426  static void varintWrite32(unsigned char *z, unsigned int y){
   427    z[0] = (unsigned char)(y>>24);
   428    z[1] = (unsigned char)(y>>16);
   429    z[2] = (unsigned char)(y>>8);
   430    z[3] = (unsigned char)(y);
   431  }
   432  
   433  /*
   434  ** Write a varint into z[].  The buffer z[] must be at least 9 characters
   435  ** long to accommodate the largest possible varint.  Return the number of
   436  ** bytes of z[] used.
   437  */
   438  static int lsm1PutVarint64(unsigned char *z, sqlite3_uint64 x){
   439    unsigned int w, y;
   440    if( x<=240 ){
   441      z[0] = (unsigned char)x;
   442      return 1;
   443    }
   444    if( x<=2287 ){
   445      y = (unsigned int)(x - 240);
   446      z[0] = (unsigned char)(y/256 + 241);
   447      z[1] = (unsigned char)(y%256);
   448      return 2;
   449    }
   450    if( x<=67823 ){
   451      y = (unsigned int)(x - 2288);
   452      z[0] = 249;
   453      z[1] = (unsigned char)(y/256);
   454      z[2] = (unsigned char)(y%256);
   455      return 3;
   456    }
   457    y = (unsigned int)x;
   458    w = (unsigned int)(x>>32);
   459    if( w==0 ){
   460      if( y<=16777215 ){
   461        z[0] = 250;
   462        z[1] = (unsigned char)(y>>16);
   463        z[2] = (unsigned char)(y>>8);
   464        z[3] = (unsigned char)(y);
   465        return 4;
   466      }
   467      z[0] = 251;
   468      varintWrite32(z+1, y);
   469      return 5;
   470    }
   471    if( w<=255 ){
   472      z[0] = 252;
   473      z[1] = (unsigned char)w;
   474      varintWrite32(z+2, y);
   475      return 6;
   476    }
   477    if( w<=65535 ){
   478      z[0] = 253;
   479      z[1] = (unsigned char)(w>>8);
   480      z[2] = (unsigned char)w;
   481      varintWrite32(z+3, y);
   482      return 7;
   483    }
   484    if( w<=16777215 ){
   485      z[0] = 254;
   486      z[1] = (unsigned char)(w>>16);
   487      z[2] = (unsigned char)(w>>8);
   488      z[3] = (unsigned char)w;
   489      varintWrite32(z+4, y);
   490      return 8;
   491    }
   492    z[0] = 255;
   493    varintWrite32(z+1, w);
   494    varintWrite32(z+5, y);
   495    return 9;
   496  }
   497  
   498  /* Append non-negative integer x as a variable-length integer.
   499  */
   500  static void lsm1VblobAppendVarint(lsm1_vblob *p, sqlite3_uint64 x){
   501    sqlite3_int64 n = p->n;
   502    if( n+9>p->nAlloc && lsm1VblobEnlarge(p, 9) ) return;
   503    p->n += lsm1PutVarint64(p->a+p->n, x);
   504  }
   505  
   506  /*
   507  ** Decode the varint in the first n bytes z[].  Write the integer value
   508  ** into *pResult and return the number of bytes in the varint.
   509  **
   510  ** If the decode fails because there are not enough bytes in z[] then
   511  ** return 0;
   512  */
   513  static int lsm1GetVarint64(
   514    const unsigned char *z,
   515    int n,
   516    sqlite3_uint64 *pResult
   517  ){
   518    unsigned int x;
   519    if( n<1 ) return 0;
   520    if( z[0]<=240 ){
   521      *pResult = z[0];
   522      return 1;
   523    }
   524    if( z[0]<=248 ){
   525      if( n<2 ) return 0;
   526      *pResult = (z[0]-241)*256 + z[1] + 240;
   527      return 2;
   528    }
   529    if( n<z[0]-246 ) return 0;
   530    if( z[0]==249 ){
   531      *pResult = 2288 + 256*z[1] + z[2];
   532      return 3;
   533    }
   534    if( z[0]==250 ){
   535      *pResult = (z[1]<<16) + (z[2]<<8) + z[3];
   536      return 4;
   537    }
   538    x = (z[1]<<24) + (z[2]<<16) + (z[3]<<8) + z[4];
   539    if( z[0]==251 ){
   540      *pResult = x;
   541      return 5;
   542    }
   543    if( z[0]==252 ){
   544      *pResult = (((sqlite3_uint64)x)<<8) + z[5];
   545      return 6;
   546    }
   547    if( z[0]==253 ){
   548      *pResult = (((sqlite3_uint64)x)<<16) + (z[5]<<8) + z[6];
   549      return 7;
   550    }
   551    if( z[0]==254 ){
   552      *pResult = (((sqlite3_uint64)x)<<24) + (z[5]<<16) + (z[6]<<8) + z[7];
   553      return 8;
   554    }
   555    *pResult = (((sqlite3_uint64)x)<<32) +
   556                 (0xffffffff & ((z[5]<<24) + (z[6]<<16) + (z[7]<<8) + z[8]));
   557    return 9;
   558  }
   559  
   560  /* Encoded a signed integer as a varint.  Numbers close to zero uses fewer
   561  ** bytes than numbers far away from zero.  However, the result is not in
   562  ** lexicographical order.
   563  **
   564  ** Encoding:  Non-negative integer X is encoding as an unsigned
   565  ** varint X*2.  Negative integer Y is encoding as an unsigned
   566  ** varint (1-Y)*2 + 1.
   567  */
   568  static int lsm1PutSignedVarint64(u8 *z, sqlite3_int64 v){
   569    sqlite3_uint64 u;
   570    if( v>=0 ){
   571      u = (sqlite3_uint64)v;
   572      return lsm1PutVarint64(z, u*2);
   573    }else{
   574      u = (sqlite3_uint64)(-1-v);
   575      return lsm1PutVarint64(z, u*2+1);
   576    }
   577  }
   578  
   579  /* Decoded a signed varint. */
   580  static int lsm1GetSignedVarint64(
   581    const unsigned char *z,
   582    int n,
   583    sqlite3_int64 *pResult
   584  ){
   585    sqlite3_uint64 u = 0;
   586    n = lsm1GetVarint64(z, n, &u);
   587    if( u&1 ){
   588      *pResult = -1 - (sqlite3_int64)(u>>1);
   589    }else{
   590      *pResult = (sqlite3_int64)(u>>1);
   591    }
   592    return n;
   593  }
   594  
   595  
   596  /*
   597  ** Read the value part of the key-value pair and decode it into columns.
   598  */
   599  static int lsm1DecodeValues(lsm1_cursor *pCur){
   600    lsm1_vtab *pTab = (lsm1_vtab*)(pCur->base.pVtab);
   601    int i, n;
   602    int rc;
   603    u8 eType;
   604    sqlite3_uint64 v;
   605  
   606    if( pCur->zData ) return 1;
   607    rc = lsm_csr_value(pCur->pLsmCur, (const void**)&pCur->zData,
   608                       (int*)&pCur->nData);
   609    if( rc ) return 0;
   610    for(i=n=0; i<pTab->nVal; i++){
   611      v = 0;
   612      n += lsm1GetVarint64(pCur->zData+n, pCur->nData-n, &v);
   613      pCur->aeType[i] = eType = (u8)(v%6);
   614      if( eType==0 ){
   615        pCur->aiOfst[i] = (u32)(v/6);
   616        pCur->aiLen[i] = 0;
   617      }else{ 
   618        pCur->aiOfst[i] = n;
   619        n += (pCur->aiLen[i] = (u32)(v/6));
   620      }
   621      if( n>pCur->nData ) break;
   622    }
   623    if( i<pTab->nVal ){
   624      pCur->zData = 0;
   625      return 0;
   626    }
   627    return 1;
   628  }
   629  
   630  /*
   631  ** Return values of columns for the row at which the lsm1_cursor
   632  ** is currently pointing.
   633  */
   634  static int lsm1Column(
   635    sqlite3_vtab_cursor *cur,   /* The cursor */
   636    sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
   637    int i                       /* Which column to return */
   638  ){
   639    lsm1_cursor *pCur = (lsm1_cursor*)cur;
   640    lsm1_vtab *pTab = (lsm1_vtab*)(cur->pVtab);
   641    if( i==0 ){
   642      /* The key column */
   643      const void *pVal;
   644      int nVal;
   645      if( lsm_csr_key(pCur->pLsmCur, &pVal, &nVal)==LSM_OK ){
   646        if( pTab->keyType==SQLITE_BLOB ){
   647          sqlite3_result_blob(ctx, pVal, nVal, SQLITE_TRANSIENT);
   648        }else if( pTab->keyType==SQLITE_TEXT ){
   649          sqlite3_result_text(ctx,(const char*)pVal, nVal, SQLITE_TRANSIENT);
   650        }else{
   651          const unsigned char *z = (const unsigned char*)pVal;
   652          sqlite3_uint64 v1;
   653          lsm1GetVarint64(z, nVal, &v1);
   654          sqlite3_result_int64(ctx, (sqlite3_int64)v1);
   655        }
   656      }
   657    }else if( i>pTab->nVal ){
   658      if( i==pTab->nVal+2 ){  /* lsm1_key */
   659        const void *pVal;
   660        int nVal;
   661        if( lsm_csr_key(pCur->pLsmCur, &pVal, &nVal)==LSM_OK ){
   662          sqlite3_result_blob(ctx, pVal, nVal, SQLITE_TRANSIENT);
   663        }
   664      }else if( i==pTab->nVal+3 ){  /* lsm1_value */
   665        const void *pVal;
   666        int nVal;
   667        if( lsm_csr_value(pCur->pLsmCur, &pVal, &nVal)==LSM_OK ){
   668          sqlite3_result_blob(ctx, pVal, nVal, SQLITE_TRANSIENT);
   669        }
   670      }
   671    }else if( lsm1DecodeValues(pCur) ){
   672      /* The i-th value column (where leftmost is 1) */
   673      const u8 *zData;
   674      u32 nData;
   675      i--;
   676      zData = pCur->zData + pCur->aiOfst[i];
   677      nData = pCur->aiLen[i];
   678      switch( pCur->aeType[i] ){
   679        case 0: {  /* in-line integer */
   680          sqlite3_result_int(ctx, pCur->aiOfst[i]);
   681          break;
   682        }
   683        case SQLITE_INTEGER: {
   684          sqlite3_int64 v;
   685          lsm1GetSignedVarint64(zData, nData, &v);
   686          sqlite3_result_int64(ctx, v);
   687          break;
   688        }
   689        case SQLITE_FLOAT: {
   690          double v;
   691          if( nData==sizeof(v) ){
   692            memcpy(&v, zData, sizeof(v));
   693            sqlite3_result_double(ctx, v);
   694          }
   695          break;
   696        }
   697        case SQLITE_TEXT: {
   698          sqlite3_result_text(ctx, (const char*)zData, nData, SQLITE_TRANSIENT);
   699          break;
   700        }
   701        case SQLITE_BLOB: {
   702          sqlite3_result_blob(ctx, zData, nData, SQLITE_TRANSIENT);
   703          break;
   704        }
   705        default: {
   706           /* A NULL.  Do nothing */
   707        }
   708      }
   709    }
   710    return SQLITE_OK;
   711  }
   712  
   713  /* Parameter "pValue" contains an SQL value that is to be used as
   714  ** a key in an LSM table.  The type of the key is determined by
   715  ** "keyType".  Extract the raw bytes used for the key in LSM1.
   716  */
   717  static void lsm1KeyFromValue(
   718    int keyType,                 /* The key type */
   719    sqlite3_value *pValue,       /* The key value */
   720    u8 *pBuf,                    /* Storage space for a generated key */
   721    const u8 **ppKey,            /* OUT: the bytes of the key */
   722    int *pnKey                   /* OUT: size of the key */
   723  ){
   724    if( keyType==SQLITE_BLOB ){
   725      *ppKey = (const u8*)sqlite3_value_blob(pValue);
   726      *pnKey = sqlite3_value_bytes(pValue);
   727    }else if( keyType==SQLITE_TEXT ){
   728      *ppKey = (const u8*)sqlite3_value_text(pValue);
   729      *pnKey = sqlite3_value_bytes(pValue);
   730    }else{
   731      sqlite3_int64 v = sqlite3_value_int64(pValue);
   732      if( v<0 ) v = 0;
   733      *pnKey = lsm1PutVarint64(pBuf, v);
   734      *ppKey = pBuf;
   735    }
   736  }
   737  
   738  /* Move to the first row to return.
   739  */
   740  static int lsm1Filter(
   741    sqlite3_vtab_cursor *pVtabCursor, 
   742    int idxNum, const char *idxStr,
   743    int argc, sqlite3_value **argv
   744  ){
   745    lsm1_cursor *pCur = (lsm1_cursor *)pVtabCursor;
   746    lsm1_vtab *pTab = (lsm1_vtab*)(pCur->base.pVtab);
   747    int rc = LSM_OK;
   748    int seekType = -1;
   749    const u8 *pVal = 0;
   750    int nVal;
   751    u8 keyType = pTab->keyType;
   752    u8 aKey1[16];
   753  
   754    pCur->atEof = 1;
   755    sqlite3_free(pCur->pKey2);
   756    pCur->pKey2 = 0;
   757    if( idxNum<99 ){
   758      lsm1KeyFromValue(keyType, argv[0], aKey1, &pVal, &nVal);
   759    }
   760    switch( idxNum ){
   761      case 0: {   /* key==argv[0] */
   762        assert( argc==1 );
   763        seekType = LSM_SEEK_EQ;
   764        pCur->isDesc = 0;
   765        pCur->bUnique = 1;
   766        break;
   767      }
   768      case 1: {  /* key>=argv[0] AND key<=argv[1] */
   769        u8 aKey[12];
   770        seekType = LSM_SEEK_GE;
   771        pCur->isDesc = 0;
   772        pCur->bUnique = 0;
   773        if( keyType==SQLITE_INTEGER ){
   774          sqlite3_int64 v = sqlite3_value_int64(argv[1]);
   775          if( v<0 ) v = 0;
   776          pCur->nKey2 = lsm1PutVarint64(aKey, (sqlite3_uint64)v);
   777          pCur->pKey2 = sqlite3_malloc( pCur->nKey2 );
   778          if( pCur->pKey2==0 ) return SQLITE_NOMEM;
   779          memcpy(pCur->pKey2, aKey, pCur->nKey2);
   780        }else{
   781          pCur->nKey2 = sqlite3_value_bytes(argv[1]);
   782          pCur->pKey2 = sqlite3_malloc( pCur->nKey2 );
   783          if( pCur->pKey2==0 ) return SQLITE_NOMEM;
   784          if( keyType==SQLITE_BLOB ){
   785            memcpy(pCur->pKey2, sqlite3_value_blob(argv[1]), pCur->nKey2);
   786          }else{
   787            memcpy(pCur->pKey2, sqlite3_value_text(argv[1]), pCur->nKey2);
   788          }
   789        }
   790        break;
   791      }
   792      case 2: {  /* key>=argv[0] */
   793        seekType = LSM_SEEK_GE;
   794        pCur->isDesc = 0;
   795        pCur->bUnique = 0;
   796        break;
   797      }
   798      case 3: {  /* key<=argv[0] */
   799        seekType = LSM_SEEK_LE;
   800        pCur->isDesc = 1;
   801        pCur->bUnique = 0;
   802        break;
   803      }
   804      default: { /* full table scan */
   805        pCur->isDesc = 0;
   806        pCur->bUnique = 0;
   807        break;
   808      }
   809    }
   810    if( pVal ){
   811      rc = lsm_csr_seek(pCur->pLsmCur, pVal, nVal, seekType);
   812    }else{
   813      rc = lsm_csr_first(pCur->pLsmCur);
   814    }
   815    if( rc==LSM_OK && lsm_csr_valid(pCur->pLsmCur)!=0 ){
   816      pCur->atEof = 0;
   817    }
   818    return rc==LSM_OK ? SQLITE_OK : SQLITE_ERROR;
   819  }
   820  
   821  /*
   822  ** Only comparisons against the key are allowed.  The idxNum defines
   823  ** which comparisons are available:
   824  **
   825  **     0        key==?1
   826  **     1        key>=?1 AND key<=?2
   827  **     2        key>?1 or key>=?1
   828  **     3        key<?1 or key<=?1
   829  **    99        Full table scan only
   830  */
   831  static int lsm1BestIndex(
   832    sqlite3_vtab *tab,
   833    sqlite3_index_info *pIdxInfo
   834  ){
   835    int i;                 /* Loop over constraints */
   836    int idxNum = 99;       /* The query plan */
   837    int nArg = 0;          /* Number of arguments to xFilter */
   838    int argIdx = -1;       /* Index of the key== constraint, or -1 if none */
   839    int iIdx2 = -1;        /* The index of the second key */
   840    int omit1 = 0;
   841    int omit2 = 0;
   842  
   843    const struct sqlite3_index_constraint *pConstraint;
   844    pConstraint = pIdxInfo->aConstraint;
   845    for(i=0; i<pIdxInfo->nConstraint && idxNum<16; i++, pConstraint++){
   846      if( pConstraint->usable==0 ) continue;
   847      if( pConstraint->iColumn!=0 ) continue;
   848      switch( pConstraint->op ){
   849        case SQLITE_INDEX_CONSTRAINT_EQ: {
   850          if( idxNum>0 ){
   851            argIdx = i;
   852            iIdx2 = -1;
   853            idxNum = 0;
   854            omit1 = 1;
   855          }
   856          break;
   857        }
   858        case SQLITE_INDEX_CONSTRAINT_GE:
   859        case SQLITE_INDEX_CONSTRAINT_GT: {
   860          if( idxNum==99 ){
   861            argIdx = i;
   862            idxNum = 2;
   863            omit1 = pConstraint->op==SQLITE_INDEX_CONSTRAINT_GE;
   864          }else if( idxNum==3 ){
   865            iIdx2 = idxNum;
   866            omit2 = omit1;
   867            argIdx = i;
   868            idxNum = 1;
   869            omit1 = pConstraint->op==SQLITE_INDEX_CONSTRAINT_GE;
   870          }
   871          break;
   872        }
   873        case SQLITE_INDEX_CONSTRAINT_LE:
   874        case SQLITE_INDEX_CONSTRAINT_LT: {
   875          if( idxNum==99 ){
   876            argIdx = i;
   877            idxNum = 3;
   878            omit1 = pConstraint->op==SQLITE_INDEX_CONSTRAINT_LE;
   879          }else if( idxNum==2 ){
   880            iIdx2 = i;
   881            idxNum = 1;
   882            omit1 = pConstraint->op==SQLITE_INDEX_CONSTRAINT_LE;
   883          }
   884          break;
   885        }
   886      }
   887    }
   888    if( argIdx>=0 ){
   889      pIdxInfo->aConstraintUsage[argIdx].argvIndex = ++nArg;
   890      pIdxInfo->aConstraintUsage[argIdx].omit = omit1;
   891    }
   892    if( iIdx2>=0 ){
   893      pIdxInfo->aConstraintUsage[iIdx2].argvIndex = ++nArg;
   894      pIdxInfo->aConstraintUsage[iIdx2].omit = omit2;
   895    }
   896    if( idxNum==0 ){
   897      pIdxInfo->estimatedCost = (double)1;
   898      pIdxInfo->estimatedRows = 1;
   899      pIdxInfo->orderByConsumed = 1;
   900    }else if( idxNum==1 ){
   901      pIdxInfo->estimatedCost = (double)100;
   902      pIdxInfo->estimatedRows = 100;
   903    }else if( idxNum<99 ){
   904      pIdxInfo->estimatedCost = (double)5000;
   905      pIdxInfo->estimatedRows = 5000;
   906    }else{
   907      /* Full table scan */
   908      pIdxInfo->estimatedCost = (double)2147483647;
   909      pIdxInfo->estimatedRows = 2147483647;
   910    }
   911    pIdxInfo->idxNum = idxNum;
   912    return SQLITE_OK;
   913  }
   914  
   915  /*
   916  ** The xUpdate method is normally used for INSERT, REPLACE, UPDATE, and
   917  ** DELETE.  But this virtual table only supports INSERT and REPLACE.
   918  ** DELETE is accomplished by inserting a record with a value of NULL.
   919  ** UPDATE is achieved by using REPLACE.
   920  */
   921  int lsm1Update(
   922    sqlite3_vtab *pVTab,
   923    int argc,
   924    sqlite3_value **argv,
   925    sqlite_int64 *pRowid
   926  ){
   927    lsm1_vtab *p = (lsm1_vtab*)pVTab;
   928    int nKey, nKey2;
   929    int i;
   930    int rc = LSM_OK;
   931    const u8 *pKey, *pKey2;
   932    unsigned char aKey[16];
   933    unsigned char pSpace[16];
   934    lsm1_vblob val;
   935  
   936    if( argc==1 ){
   937      /* DELETE the record whose key is argv[0] */
   938      lsm1KeyFromValue(p->keyType, argv[0], aKey, &pKey, &nKey);
   939      lsm_delete(p->pDb, pKey, nKey);
   940      return SQLITE_OK;
   941    }
   942  
   943    if( sqlite3_value_type(argv[0])!=SQLITE_NULL ){
   944      /* An UPDATE */
   945      lsm1KeyFromValue(p->keyType, argv[0], aKey, &pKey, &nKey);
   946      lsm1KeyFromValue(p->keyType, argv[1], pSpace, &pKey2, &nKey2);
   947      if( nKey!=nKey2 || memcmp(pKey, pKey2, nKey)!=0 ){
   948        /* The UPDATE changes the PRIMARY KEY value.  DELETE the old key */
   949        lsm_delete(p->pDb, pKey, nKey);
   950      }
   951      /* Fall through into the INSERT case to complete the UPDATE */
   952    }
   953  
   954    /* "INSERT INTO tab(lsm1_command) VALUES('....')" is used to implement
   955    ** special commands.
   956    */
   957    if( sqlite3_value_type(argv[3+p->nVal])!=SQLITE_NULL ){
   958      return SQLITE_OK;
   959    }
   960    lsm1KeyFromValue(p->keyType, argv[2], aKey, &pKey, &nKey);
   961    memset(&val, 0, sizeof(val));
   962    for(i=0; i<p->nVal; i++){
   963      sqlite3_value *pArg = argv[3+i];
   964      u8 eType = sqlite3_value_type(pArg);
   965      switch( eType ){
   966        case SQLITE_NULL: {
   967          lsm1VblobAppendVarint(&val, SQLITE_NULL);
   968          break;
   969        }
   970        case SQLITE_INTEGER: {
   971          sqlite3_int64 v = sqlite3_value_int64(pArg);
   972          if( v>=0 && v<=240/6 ){
   973            lsm1VblobAppendVarint(&val, v*6);
   974          }else{
   975            int n = lsm1PutSignedVarint64(pSpace, v);
   976            lsm1VblobAppendVarint(&val, SQLITE_INTEGER + n*6);
   977            lsm1VblobAppend(&val, pSpace, n);
   978          }
   979          break;
   980        }
   981        case SQLITE_FLOAT: {
   982          double r = sqlite3_value_double(pArg);
   983          lsm1VblobAppendVarint(&val, SQLITE_FLOAT + 8*6);
   984          lsm1VblobAppend(&val, (u8*)&r, sizeof(r));
   985          break;
   986        }
   987        case SQLITE_BLOB: {
   988          int n = sqlite3_value_bytes(pArg);
   989          lsm1VblobAppendVarint(&val, n*6 + SQLITE_BLOB);
   990          lsm1VblobAppend(&val, sqlite3_value_blob(pArg), n);
   991          break;
   992        }
   993        case SQLITE_TEXT: {
   994          int n = sqlite3_value_bytes(pArg);
   995          lsm1VblobAppendVarint(&val, n*6 + SQLITE_TEXT);
   996          lsm1VblobAppend(&val, sqlite3_value_text(pArg), n);
   997          break;
   998        }
   999      }
  1000    }
  1001    if( val.errNoMem ){
  1002      return SQLITE_NOMEM;
  1003    }
  1004    rc = lsm_insert(p->pDb, pKey, nKey, val.a, val.n);
  1005    sqlite3_free(val.a);
  1006    return rc==LSM_OK ? SQLITE_OK : SQLITE_ERROR;
  1007  }      
  1008  
  1009  /* Begin a transaction
  1010  */
  1011  static int lsm1Begin(sqlite3_vtab *pVtab){
  1012    lsm1_vtab *p = (lsm1_vtab*)pVtab;
  1013    int rc = lsm_begin(p->pDb, 1);
  1014    return rc==LSM_OK ? SQLITE_OK : SQLITE_ERROR;
  1015  }
  1016  
  1017  /* Phase 1 of a transaction commit.
  1018  */
  1019  static int lsm1Sync(sqlite3_vtab *pVtab){
  1020    return SQLITE_OK;
  1021  }
  1022  
  1023  /* Commit a transaction
  1024  */
  1025  static int lsm1Commit(sqlite3_vtab *pVtab){
  1026    lsm1_vtab *p = (lsm1_vtab*)pVtab;
  1027    int rc = lsm_commit(p->pDb, 0);
  1028    return rc==LSM_OK ? SQLITE_OK : SQLITE_ERROR;
  1029  }
  1030  
  1031  /* Rollback a transaction
  1032  */
  1033  static int lsm1Rollback(sqlite3_vtab *pVtab){
  1034    lsm1_vtab *p = (lsm1_vtab*)pVtab;
  1035    int rc = lsm_rollback(p->pDb, 0);
  1036    return rc==LSM_OK ? SQLITE_OK : SQLITE_ERROR;
  1037  }
  1038  
  1039  /*
  1040  ** This following structure defines all the methods for the 
  1041  ** generate_lsm1 virtual table.
  1042  */
  1043  static sqlite3_module lsm1Module = {
  1044    0,                       /* iVersion */
  1045    lsm1Connect,             /* xCreate */
  1046    lsm1Connect,             /* xConnect */
  1047    lsm1BestIndex,           /* xBestIndex */
  1048    lsm1Disconnect,          /* xDisconnect */
  1049    lsm1Disconnect,          /* xDestroy */
  1050    lsm1Open,                /* xOpen - open a cursor */
  1051    lsm1Close,               /* xClose - close a cursor */
  1052    lsm1Filter,              /* xFilter - configure scan constraints */
  1053    lsm1Next,                /* xNext - advance a cursor */
  1054    lsm1Eof,                 /* xEof - check for end of scan */
  1055    lsm1Column,              /* xColumn - read data */
  1056    lsm1Rowid,               /* xRowid - read data */
  1057    lsm1Update,              /* xUpdate */
  1058    lsm1Begin,               /* xBegin */
  1059    lsm1Sync,                /* xSync */
  1060    lsm1Commit,              /* xCommit */
  1061    lsm1Rollback,            /* xRollback */
  1062    0,                       /* xFindMethod */
  1063    0,                       /* xRename */
  1064  };
  1065  
  1066  
  1067  #ifdef _WIN32
  1068  __declspec(dllexport)
  1069  #endif
  1070  int sqlite3_lsm_init(
  1071    sqlite3 *db, 
  1072    char **pzErrMsg, 
  1073    const sqlite3_api_routines *pApi
  1074  ){
  1075    int rc = SQLITE_OK;
  1076    SQLITE_EXTENSION_INIT2(pApi);
  1077    rc = sqlite3_create_module(db, "lsm1", &lsm1Module, 0);
  1078    return rc;
  1079  }