⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 func.c

📁 1.编译色情sqlite源代码为dll;2.运用sqlite3数据库存储二进制数据到数据库
💻 C
📖 第 1 页 / 共 4 页
字号:
    sqlite3_result_zeroblob(context, n);  }}/*** The replace() function.  Three arguments are all strings: call** them A, B, and C. The result is also a string which is derived** from A by replacing every occurance of B with C.  The match** must be exact.  Collating sequences are not used.*/static void replaceFunc(  sqlite3_context *context,  int argc,  sqlite3_value **argv){  const unsigned char *zStr;        /* The input string A */  const unsigned char *zPattern;    /* The pattern string B */  const unsigned char *zRep;        /* The replacement string C */  unsigned char *zOut;              /* The output */  int nStr;                /* Size of zStr */  int nPattern;            /* Size of zPattern */  int nRep;                /* Size of zRep */  i64 nOut;                /* Maximum size of zOut */  int loopLimit;           /* Last zStr[] that might match zPattern[] */  int i, j;                /* Loop counters */  assert( argc==3 );  zStr = sqlite3_value_text(argv[0]);  if( zStr==0 ) return;  nStr = sqlite3_value_bytes(argv[0]);  assert( zStr==sqlite3_value_text(argv[0]) );  /* No encoding change */  zPattern = sqlite3_value_text(argv[1]);  if( zPattern==0 || zPattern[0]==0 ) return;  nPattern = sqlite3_value_bytes(argv[1]);  assert( zPattern==sqlite3_value_text(argv[1]) );  /* No encoding change */  zRep = sqlite3_value_text(argv[2]);  if( zRep==0 ) return;  nRep = sqlite3_value_bytes(argv[2]);  assert( zRep==sqlite3_value_text(argv[2]) );  nOut = nStr + 1;  assert( nOut<SQLITE_MAX_LENGTH );  zOut = contextMalloc(context, (int)nOut);  if( zOut==0 ){    return;  }  loopLimit = nStr - nPattern;    for(i=j=0; i<=loopLimit; i++){    if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){      zOut[j++] = zStr[i];    }else{      u8 *zOld;      nOut += nRep - nPattern;      if( nOut>=SQLITE_MAX_LENGTH ){        sqlite3_result_error_toobig(context);        sqlite3_free(zOut);        return;      }      zOld = zOut;      zOut = sqlite3_realloc(zOut, (int)nOut);      if( zOut==0 ){        sqlite3_result_error_nomem(context);        sqlite3_free(zOld);        return;      }      memcpy(&zOut[j], zRep, nRep);      j += nRep;      i += nPattern-1;    }  }  assert( j+nStr-i+1==nOut );  memcpy(&zOut[j], &zStr[i], nStr-i);  j += nStr - i;  assert( j<=nOut );  zOut[j] = 0;  sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);}/*** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.*/static void trimFunc(  sqlite3_context *context,  int argc,  sqlite3_value **argv){  const unsigned char *zIn;         /* Input string */  const unsigned char *zCharSet;    /* Set of characters to trim */  int nIn;                          /* Number of bytes in input */  int flags;                        /* 1: trimleft  2: trimright  3: trim */  int i;                            /* Loop counter */  unsigned char *aLen;              /* Length of each character in zCharSet */  unsigned char **azChar;           /* Individual characters in zCharSet */  int nChar;                        /* Number of characters in zCharSet */  if( sqlite3_value_type(argv[0])==SQLITE_NULL ){    return;  }  zIn = sqlite3_value_text(argv[0]);  if( zIn==0 ) return;  nIn = sqlite3_value_bytes(argv[0]);  assert( zIn==sqlite3_value_text(argv[0]) );  if( argc==1 ){    static const unsigned char lenOne[] = { 1 };    static const unsigned char *azOne[] = { (u8*)" " };    nChar = 1;    aLen = (u8*)lenOne;    azChar = (unsigned char **)azOne;    zCharSet = 0;  }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){    return;  }else{    const unsigned char *z;    for(z=zCharSet, nChar=0; *z; nChar++){      SQLITE_SKIP_UTF8(z);    }    if( nChar>0 ){      azChar = contextMalloc(context, nChar*(sizeof(char*)+1));      if( azChar==0 ){        return;      }      aLen = (unsigned char*)&azChar[nChar];      for(z=zCharSet, nChar=0; *z; nChar++){        azChar[nChar] = (unsigned char *)z;        SQLITE_SKIP_UTF8(z);        aLen[nChar] = z - azChar[nChar];      }    }  }  if( nChar>0 ){    flags = (int)sqlite3_user_data(context);    if( flags & 1 ){      while( nIn>0 ){        int len;        for(i=0; i<nChar; i++){          len = aLen[i];          if( memcmp(zIn, azChar[i], len)==0 ) break;        }        if( i>=nChar ) break;        zIn += len;        nIn -= len;      }    }    if( flags & 2 ){      while( nIn>0 ){        int len;        for(i=0; i<nChar; i++){          len = aLen[i];          if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;        }        if( i>=nChar ) break;        nIn -= len;      }    }    if( zCharSet ){      sqlite3_free(azChar);    }  }  sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);}#ifdef SQLITE_SOUNDEX/*** Compute the soundex encoding of a word.*/static void soundexFunc(  sqlite3_context *context,  int argc,  sqlite3_value **argv){  char zResult[8];  const u8 *zIn;  int i, j;  static const unsigned char iCode[] = {    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,    1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,    0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,    1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,  };  assert( argc==1 );  zIn = (u8*)sqlite3_value_text(argv[0]);  if( zIn==0 ) zIn = (u8*)"";  for(i=0; zIn[i] && !isalpha(zIn[i]); i++){}  if( zIn[i] ){    u8 prevcode = iCode[zIn[i]&0x7f];    zResult[0] = toupper(zIn[i]);    for(j=1; j<4 && zIn[i]; i++){      int code = iCode[zIn[i]&0x7f];      if( code>0 ){        if( code!=prevcode ){          prevcode = code;          zResult[j++] = code + '0';        }      }else{        prevcode = 0;      }    }    while( j<4 ){      zResult[j++] = '0';    }    zResult[j] = 0;    sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);  }else{    sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);  }}#endif#ifndef SQLITE_OMIT_LOAD_EXTENSION/*** A function that loads a shared-library extension then returns NULL.*/static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){  const char *zFile = (const char *)sqlite3_value_text(argv[0]);  const char *zProc;  sqlite3 *db = sqlite3_user_data(context);  char *zErrMsg = 0;  if( argc==2 ){    zProc = (const char *)sqlite3_value_text(argv[1]);  }else{    zProc = 0;  }  if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){    sqlite3_result_error(context, zErrMsg, -1);    sqlite3_free(zErrMsg);  }}#endif#ifdef SQLITE_TEST/*** This function generates a string of random characters.  Used for** generating test data.*/static void randStr(sqlite3_context *context, int argc, sqlite3_value **argv){  static const unsigned char zSrc[] =      "abcdefghijklmnopqrstuvwxyz"     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"     "0123456789"     ".-!,:*^+=_|?/<> ";  int iMin, iMax, n, r, i;  unsigned char zBuf[1000];  /* It used to be possible to call randstr() with any number of arguments,  ** but now it is registered with SQLite as requiring exactly 2.  */  assert(argc==2);  iMin = sqlite3_value_int(argv[0]);  if( iMin<0 ) iMin = 0;  if( iMin>=sizeof(zBuf) ) iMin = sizeof(zBuf)-1;  iMax = sqlite3_value_int(argv[1]);  if( iMax<iMin ) iMax = iMin;  if( iMax>=sizeof(zBuf) ) iMax = sizeof(zBuf)-1;  n = iMin;  if( iMax>iMin ){    sqlite3Randomness(sizeof(r), &r);    r &= 0x7fffffff;    n += r%(iMax + 1 - iMin);  }  assert( n<sizeof(zBuf) );  sqlite3Randomness(n, zBuf);  for(i=0; i<n; i++){    zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];  }  zBuf[n] = 0;  sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT);}#endif /* SQLITE_TEST */#ifdef SQLITE_TEST/*** The following two SQL functions are used to test returning a text** result with a destructor. Function 'test_destructor' takes one argument** and returns the same argument interpreted as TEXT. A destructor is** passed with the sqlite3_result_text() call.**** SQL function 'test_destructor_count' returns the number of outstanding ** allocations made by 'test_destructor';**** WARNING: Not threadsafe.*/static int test_destructor_count_var = 0;static void destructor(void *p){  char *zVal = (char *)p;  assert(zVal);  zVal--;  sqlite3_free(zVal);  test_destructor_count_var--;}static void test_destructor(  sqlite3_context *pCtx,   int nArg,  sqlite3_value **argv){  char *zVal;  int len;  sqlite3 *db = sqlite3_user_data(pCtx);   test_destructor_count_var++;  assert( nArg==1 );  if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;  len = sqlite3ValueBytes(argv[0], ENC(db));   zVal = contextMalloc(pCtx, len+3);  if( !zVal ){    return;  }  zVal[len+1] = 0;  zVal[len+2] = 0;  zVal++;  memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len);  if( ENC(db)==SQLITE_UTF8 ){    sqlite3_result_text(pCtx, zVal, -1, destructor);#ifndef SQLITE_OMIT_UTF16  }else if( ENC(db)==SQLITE_UTF16LE ){    sqlite3_result_text16le(pCtx, zVal, -1, destructor);  }else{    sqlite3_result_text16be(pCtx, zVal, -1, destructor);#endif /* SQLITE_OMIT_UTF16 */  }}static void test_destructor_count(  sqlite3_context *pCtx,   int nArg,  sqlite3_value **argv){  sqlite3_result_int(pCtx, test_destructor_count_var);}#endif /* SQLITE_TEST */#ifdef SQLITE_TEST/*** Routines for testing the sqlite3_get_auxdata() and sqlite3_set_auxdata()** interface.**** The test_auxdata() SQL function attempts to register each of its arguments** as auxiliary data.  If there are no prior registrations of aux data for** that argument (meaning the argument is not a constant or this is its first** call) then the result for that argument is 0.  If there is a prior** registration, the result for that argument is 1.  The overall result** is the individual argument results separated by spaces.*/static void free_test_auxdata(void *p) {sqlite3_free(p);}static void test_auxdata(  sqlite3_context *pCtx,   int nArg,  sqlite3_value **argv){  int i;  char *zRet = contextMalloc(pCtx, nArg*2);  if( !zRet ) return;  memset(zRet, 0, nArg*2);  for(i=0; i<nArg; i++){    char const *z = (char*)sqlite3_value_text(argv[i]);    if( z ){      char *zAux = sqlite3_get_auxdata(pCtx, i);      if( zAux ){        zRet[i*2] = '1';        assert( strcmp(zAux,z)==0 );      }else {        zRet[i*2] = '0';      }      zAux = contextMalloc(pCtx, strlen(z)+1);      if( zAux ){        strcpy(zAux, z);        sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);      }      zRet[i*2+1] = ' ';    }  }  sqlite3_result_text(pCtx, zRet, 2*nArg-1, free_test_auxdata);}#endif /* SQLITE_TEST */#ifdef SQLITE_TEST/*** A function to test error reporting from user functions. This function** returns a copy of its first argument as an error.*/static void test_error(  sqlite3_context *pCtx,   int nArg,  sqlite3_value **argv){  sqlite3_result_error(pCtx, (char*)sqlite3_value_text(argv[0]), 0);}#endif /* SQLITE_TEST */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -