亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? callback.c

?? sqlite 3.3.8 支持加密的版本
?? C
字號:
/*
** 2005 May 23 
**
** The author disclaims copyright to this source code.  In place of
** a legal notice, here is a blessing:
**
**    May you do good and not evil.
**    May you find forgiveness for yourself and forgive others.
**    May you share freely, never taking more than you give.
**
*************************************************************************
**
** This file contains functions used to access the internal hash tables
** of user defined functions and collation sequences.
**
** $Id: callback.c,v 1.19 2006/10/12 21:34:21 rmsimpson Exp $
*/

#include "sqliteInt.h"

/*
** Invoke the 'collation needed' callback to request a collation sequence
** in the database text encoding of name zName, length nName.
** If the collation sequence
*/
static void callCollNeeded(sqlite3 *db, const char *zName, int nName){
  assert( !db->xCollNeeded || !db->xCollNeeded16 );
  if( nName<0 ) nName = strlen(zName);
  if( db->xCollNeeded ){
    char *zExternal = sqliteStrNDup(zName, nName);
    if( !zExternal ) return;
    db->xCollNeeded(db->pCollNeededArg, db, (int)ENC(db), zExternal);
    sqliteFree(zExternal);
  }
#ifndef SQLITE_OMIT_UTF16
  if( db->xCollNeeded16 ){
    char const *zExternal;
    sqlite3_value *pTmp = sqlite3ValueNew();
    sqlite3ValueSetStr(pTmp, nName, zName, SQLITE_UTF8, SQLITE_STATIC);
    zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE);
    if( zExternal ){
      db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal);
    }
    sqlite3ValueFree(pTmp);
  }
#endif
}

/*
** This routine is called if the collation factory fails to deliver a
** collation function in the best encoding but there may be other versions
** of this collation function (for other text encodings) available. Use one
** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if
** possible.
*/
static int synthCollSeq(sqlite3 *db, CollSeq *pColl){
  CollSeq *pColl2;
  char *z = pColl->zName;
  int n = strlen(z);
  int i;
  static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 };
  for(i=0; i<3; i++){
    pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, n, 0);
    if( pColl2->xCmp!=0 ){
      memcpy(pColl, pColl2, sizeof(CollSeq));
      return SQLITE_OK;
    }
  }
  return SQLITE_ERROR;
}

/*
** This function is responsible for invoking the collation factory callback
** or substituting a collation sequence of a different encoding when the
** requested collation sequence is not available in the database native
** encoding.
** 
** If it is not NULL, then pColl must point to the database native encoding 
** collation sequence with name zName, length nName.
**
** The return value is either the collation sequence to be used in database
** db for collation type name zName, length nName, or NULL, if no collation
** sequence can be found.
*/
CollSeq *sqlite3GetCollSeq(
  sqlite3* db, 
  CollSeq *pColl, 
  const char *zName, 
  int nName
){
  CollSeq *p;

  p = pColl;
  if( !p ){
    p = sqlite3FindCollSeq(db, ENC(db), zName, nName, 0);
  }
  if( !p || !p->xCmp ){
    /* No collation sequence of this type for this encoding is registered.
    ** Call the collation factory to see if it can supply us with one.
    */
    callCollNeeded(db, zName, nName);
    p = sqlite3FindCollSeq(db, ENC(db), zName, nName, 0);
  }
  if( p && !p->xCmp && synthCollSeq(db, p) ){
    p = 0;
  }
  assert( !p || p->xCmp );
  return p;
}

/*
** This routine is called on a collation sequence before it is used to
** check that it is defined. An undefined collation sequence exists when
** a database is loaded that contains references to collation sequences
** that have not been defined by sqlite3_create_collation() etc.
**
** If required, this routine calls the 'collation needed' callback to
** request a definition of the collating sequence. If this doesn't work, 
** an equivalent collating sequence that uses a text encoding different
** from the main database is substituted, if one is available.
*/
int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){
  if( pColl ){
    const char *zName = pColl->zName;
    CollSeq *p = sqlite3GetCollSeq(pParse->db, pColl, zName, -1);
    if( !p ){
      if( pParse->nErr==0 ){
        sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
      }
      pParse->nErr++;
      return SQLITE_ERROR;
    }
    assert( p==pColl );
  }
  return SQLITE_OK;
}



/*
** Locate and return an entry from the db.aCollSeq hash table. If the entry
** specified by zName and nName is not found and parameter 'create' is
** true, then create a new entry. Otherwise return NULL.
**
** Each pointer stored in the sqlite3.aCollSeq hash table contains an
** array of three CollSeq structures. The first is the collation sequence
** prefferred for UTF-8, the second UTF-16le, and the third UTF-16be.
**
** Stored immediately after the three collation sequences is a copy of
** the collation sequence name. A pointer to this string is stored in
** each collation sequence structure.
*/
static CollSeq *findCollSeqEntry(
  sqlite3 *db,
  const char *zName,
  int nName,
  int create
){
  CollSeq *pColl;
  if( nName<0 ) nName = strlen(zName);
  pColl = sqlite3HashFind(&db->aCollSeq, zName, nName);

  if( 0==pColl && create ){
    pColl = sqliteMalloc( 3*sizeof(*pColl) + nName + 1 );
    if( pColl ){
      CollSeq *pDel = 0;
      pColl[0].zName = (char*)&pColl[3];
      pColl[0].enc = SQLITE_UTF8;
      pColl[1].zName = (char*)&pColl[3];
      pColl[1].enc = SQLITE_UTF16LE;
      pColl[2].zName = (char*)&pColl[3];
      pColl[2].enc = SQLITE_UTF16BE;
      memcpy(pColl[0].zName, zName, nName);
      pColl[0].zName[nName] = 0;
      pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, nName, pColl);

      /* If a malloc() failure occured in sqlite3HashInsert(), it will 
      ** return the pColl pointer to be deleted (because it wasn't added
      ** to the hash table).
      */
      assert( !pDel || (sqlite3MallocFailed() && pDel==pColl) );
      if( pDel ){
        sqliteFree(pDel);
        pColl = 0;
      }
    }
  }
  return pColl;
}

/*
** Parameter zName points to a UTF-8 encoded string nName bytes long.
** Return the CollSeq* pointer for the collation sequence named zName
** for the encoding 'enc' from the database 'db'.
**
** If the entry specified is not found and 'create' is true, then create a
** new entry.  Otherwise return NULL.
*/
CollSeq *sqlite3FindCollSeq(
  sqlite3 *db,
  u8 enc,
  const char *zName,
  int nName,
  int create
){
  CollSeq *pColl;
  if( zName ){
    pColl = findCollSeqEntry(db, zName, nName, create);
  }else{
    pColl = db->pDfltColl;
  }
  assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 );
  assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE );
  if( pColl ) pColl += enc-1;
  return pColl;
}

/*
** Locate a user function given a name, a number of arguments and a flag
** indicating whether the function prefers UTF-16 over UTF-8.  Return a
** pointer to the FuncDef structure that defines that function, or return
** NULL if the function does not exist.
**
** If the createFlag argument is true, then a new (blank) FuncDef
** structure is created and liked into the "db" structure if a
** no matching function previously existed.  When createFlag is true
** and the nArg parameter is -1, then only a function that accepts
** any number of arguments will be returned.
**
** If createFlag is false and nArg is -1, then the first valid
** function found is returned.  A function is valid if either xFunc
** or xStep is non-zero.
**
** If createFlag is false, then a function with the required name and
** number of arguments may be returned even if the eTextRep flag does not
** match that requested.
*/
FuncDef *sqlite3FindFunction(
  sqlite3 *db,       /* An open database */
  const char *zName, /* Name of the function.  Not null-terminated */
  int nName,         /* Number of characters in the name */
  int nArg,          /* Number of arguments.  -1 means any number */
  u8 enc,            /* Preferred text encoding */
  int createFlag     /* Create new entry if true and does not otherwise exist */
){
  FuncDef *p;         /* Iterator variable */
  FuncDef *pFirst;    /* First function with this name */
  FuncDef *pBest = 0; /* Best match found so far */
  int bestmatch = 0;  


  assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE );
  if( nArg<-1 ) nArg = -1;

  pFirst = (FuncDef*)sqlite3HashFind(&db->aFunc, zName, nName);
  for(p=pFirst; p; p=p->pNext){
    /* During the search for the best function definition, bestmatch is set
    ** as follows to indicate the quality of the match with the definition
    ** pointed to by pBest:
    **
    ** 0: pBest is NULL. No match has been found.
    ** 1: A variable arguments function that prefers UTF-8 when a UTF-16
    **    encoding is requested, or vice versa.
    ** 2: A variable arguments function that uses UTF-16BE when UTF-16LE is
    **    requested, or vice versa.
    ** 3: A variable arguments function using the same text encoding.
    ** 4: A function with the exact number of arguments requested that
    **    prefers UTF-8 when a UTF-16 encoding is requested, or vice versa.
    ** 5: A function with the exact number of arguments requested that
    **    prefers UTF-16LE when UTF-16BE is requested, or vice versa.
    ** 6: An exact match.
    **
    ** A larger value of 'matchqual' indicates a more desirable match.
    */
    if( p->nArg==-1 || p->nArg==nArg || nArg==-1 ){
      int match = 1;          /* Quality of this match */
      if( p->nArg==nArg || nArg==-1 ){
        match = 4;
      }
      if( enc==p->iPrefEnc ){
        match += 2;
      }
      else if( (enc==SQLITE_UTF16LE && p->iPrefEnc==SQLITE_UTF16BE) ||
               (enc==SQLITE_UTF16BE && p->iPrefEnc==SQLITE_UTF16LE) ){
        match += 1;
      }

      if( match>bestmatch ){
        pBest = p;
        bestmatch = match;
      }
    }
  }

  /* If the createFlag parameter is true, and the seach did not reveal an
  ** exact match for the name, number of arguments and encoding, then add a
  ** new entry to the hash table and return it.
  */
  if( createFlag && bestmatch<6 && 
      (pBest = sqliteMalloc(sizeof(*pBest)+nName))!=0 ){
    pBest->nArg = nArg;
    pBest->pNext = pFirst;
    pBest->iPrefEnc = enc;
    memcpy(pBest->zName, zName, nName);
    pBest->zName[nName] = 0;
    if( pBest==sqlite3HashInsert(&db->aFunc,pBest->zName,nName,(void*)pBest) ){
      sqliteFree(pBest);
      return 0;
    }
  }

  if( pBest && (pBest->xStep || pBest->xFunc || createFlag) ){
    return pBest;
  }
  return 0;
}

/*
** Free all resources held by the schema structure. The void* argument points
** at a Schema struct. This function does not call sqliteFree() on the 
** pointer itself, it just cleans up subsiduary resources (i.e. the contents
** of the schema hash tables).
*/
void sqlite3SchemaFree(void *p){
  Hash temp1;
  Hash temp2;
  HashElem *pElem;
  Schema *pSchema = (Schema *)p;

  temp1 = pSchema->tblHash;
  temp2 = pSchema->trigHash;
  sqlite3HashInit(&pSchema->trigHash, SQLITE_HASH_STRING, 0);
  sqlite3HashClear(&pSchema->aFKey);
  sqlite3HashClear(&pSchema->idxHash);
  for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
    sqlite3DeleteTrigger((Trigger*)sqliteHashData(pElem));
  }
  sqlite3HashClear(&temp2);
  sqlite3HashInit(&pSchema->tblHash, SQLITE_HASH_STRING, 0);
  for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
    Table *pTab = sqliteHashData(pElem);
    sqlite3DeleteTable(0, pTab);
  }
  sqlite3HashClear(&temp1);
  pSchema->pSeqTab = 0;
  pSchema->flags &= ~DB_SchemaLoaded;
}

/*
** Find and return the schema associated with a BTree.  Create
** a new one if necessary.
*/
Schema *sqlite3SchemaGet(Btree *pBt){
  Schema * p;
  if( pBt ){
    p = (Schema *)sqlite3BtreeSchema(pBt,sizeof(Schema),sqlite3SchemaFree);
  }else{
    p = (Schema *)sqliteMalloc(sizeof(Schema));
  }
  if( p && 0==p->file_format ){
    sqlite3HashInit(&p->tblHash, SQLITE_HASH_STRING, 0);
    sqlite3HashInit(&p->idxHash, SQLITE_HASH_STRING, 0);
    sqlite3HashInit(&p->trigHash, SQLITE_HASH_STRING, 0);
    sqlite3HashInit(&p->aFKey, SQLITE_HASH_STRING, 1);
    p->enc = SQLITE_UTF8;
  }
  return p;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一级不卡视频| 亚洲一区二区在线免费看| 亚洲欧洲美洲综合色网| 亚洲成av人片一区二区三区| 经典三级在线一区| 欧洲视频一区二区| 国产拍揄自揄精品视频麻豆| 日韩成人免费电影| 色美美综合视频| 国产精品进线69影院| 精油按摩中文字幕久久| 欧美久久久久中文字幕| 中文久久乱码一区二区| 九色综合国产一区二区三区| 欧美精品1区2区| 亚洲图片有声小说| 91同城在线观看| 国产精品无遮挡| 国产精品一区二区不卡| 欧美一卡二卡在线观看| 亚洲国产人成综合网站| 色就色 综合激情| 亚洲欧美日韩久久精品| av中文字幕不卡| 国产精品免费av| 国内精品视频666| 日韩欧美中文一区二区| 午夜电影网一区| 在线成人午夜影院| 午夜a成v人精品| 91精品国产综合久久香蕉的特点| 亚洲综合小说图片| 91久久精品一区二区三| 亚洲免费av在线| 日本道色综合久久| 亚洲一区二区三区四区五区中文 | www成人在线观看| 视频在线观看一区二区三区| 欧美视频三区在线播放| 亚洲成a人片在线不卡一二三区| 色琪琪一区二区三区亚洲区| 一区二区三区精品在线观看| 欧洲色大大久久| 秋霞国产午夜精品免费视频| 日韩手机在线导航| 国产九九视频一区二区三区| 久久看人人爽人人| 成人短视频下载| 樱桃国产成人精品视频| 555夜色666亚洲国产免| 久久国产精品第一页| 久久亚洲综合av| 99麻豆久久久国产精品免费 | 欧日韩精品视频| 免费成人你懂的| 久久久久99精品国产片| www.日韩精品| 日韩精品五月天| 国产清纯白嫩初高生在线观看91| 99久久99久久综合| 亚洲高清免费视频| 精品国产凹凸成av人导航| 成人动漫精品一区二区| 亚洲影院久久精品| 精品国产3级a| 色噜噜狠狠成人中文综合| 久久国产夜色精品鲁鲁99| 国产精品久久久久一区| 欧美日韩一区高清| 国产二区国产一区在线观看| 亚洲一区二区精品久久av| 精品国精品国产| 欧美最新大片在线看| 精品一区二区三区免费播放| 国产精品久久久久久久久免费桃花 | 成人午夜大片免费观看| 亚洲电影中文字幕在线观看| 久久日一线二线三线suv| 在线精品视频免费播放| 国产自产v一区二区三区c| 亚洲精品视频免费观看| 国产亚洲一区二区三区四区 | 欧美精品v日韩精品v韩国精品v| 风间由美性色一区二区三区| 亚洲国产成人tv| 日本一区二区三区高清不卡| 91精品国产福利在线观看| 色综合天天狠狠| 国产在线精品不卡| 日韩精品电影在线| 亚洲午夜免费电影| 国产精品美日韩| 日本一区二区综合亚洲| 精品盗摄一区二区三区| 91精品国产综合久久福利软件| 91在线观看成人| 国产a级毛片一区| 激情都市一区二区| 午夜伊人狠狠久久| 午夜精品一区二区三区三上悠亚| 国产三级一区二区三区| 日韩精品自拍偷拍| 欧美一级欧美一级在线播放| 欧美日韩精品一区二区天天拍小说| 91丨porny丨首页| 成人动漫视频在线| 不卡的电影网站| 99热精品一区二区| av男人天堂一区| 成人中文字幕合集| 国产不卡高清在线观看视频| 国产精品一二三在| 极品销魂美女一区二区三区| 久久精品国产**网站演员| 蜜臀久久99精品久久久画质超高清 | 欧美一区二区国产| 777欧美精品| 宅男噜噜噜66一区二区66| 6080国产精品一区二区| 欧美一区二区三区公司| 欧美高清视频一二三区 | 成人av在线播放网站| 国产成人亚洲综合a∨婷婷| 国产精品夜夜爽| 福利一区在线观看| 成人手机在线视频| 91免费观看视频在线| 欧美性视频一区二区三区| 欧美日韩美女一区二区| 日韩欧美一区中文| 精品99999| 国产精品网站在线| 亚洲伊人伊色伊影伊综合网| 日韩黄色片在线观看| 麻豆精品一区二区av白丝在线| 国产一区二区视频在线| 大白屁股一区二区视频| 色av成人天堂桃色av| 69堂成人精品免费视频| 国产色产综合产在线视频| 一区二区三区四区视频精品免费| 天堂va蜜桃一区二区三区漫画版| 免费成人你懂的| 99riav久久精品riav| 欧美精品丝袜中出| 国产日韩精品一区| 亚洲在线免费播放| 国产在线国偷精品产拍免费yy| 国产aⅴ精品一区二区三区色成熟| 97成人超碰视| 精品久久久久久久久久久久久久久| 久久女同精品一区二区| 亚洲午夜久久久久| 国产成人在线网站| 欧美群妇大交群的观看方式| 欧美韩日一区二区三区四区| 五月婷婷激情综合| 风间由美中文字幕在线看视频国产欧美 | 国产a视频精品免费观看| 欧美中文字幕一区二区三区 | 国产午夜精品在线观看| 一区二区三区免费| 韩国在线一区二区| 欧洲在线/亚洲| 国产日本欧洲亚洲| 日韩av午夜在线观看| 91小视频免费观看| 久久久精品蜜桃| 全国精品久久少妇| 欧美色国产精品| 国产精品福利电影一区二区三区四区| 日本欧美在线观看| 欧洲国内综合视频| 亚洲视频一区在线观看| 国产在线播放一区三区四| 91精品国产综合久久久蜜臀图片| 国产精品久久三区| 国产大陆精品国产| 精品乱码亚洲一区二区不卡| 首页国产欧美久久| 在线观看免费一区| 亚洲精品视频在线看| 成人深夜在线观看| 欧美经典一区二区| 国产呦萝稀缺另类资源| 日韩一卡二卡三卡| 日韩vs国产vs欧美| 91麻豆精品国产综合久久久久久 | 欧美精品一二三四| 亚洲国产你懂的| 在线看日本不卡| 亚洲精品va在线观看| 91视频国产观看| 18欧美乱大交hd1984| 99热在这里有精品免费| 自拍偷拍欧美精品| 97超碰欧美中文字幕| 有码一区二区三区| 欧美色国产精品| 日日夜夜精品视频免费|