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

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

?? vtab.c

?? sqlite 3.3.8 支持加密的版本
?? C
?? 第 1 頁 / 共 2 頁
字號:

  pMod = pTab->pMod;
  zModule = pTab->azModuleArg[0];
  if( !pMod ){
    const char *zModule = pTab->azModuleArg[0];
    sqlite3ErrorMsg(pParse, "no such module: %s", zModule);
    rc = SQLITE_ERROR;
  } else {
    char *zErr = 0;
    sqlite3 *db = pParse->db;
    rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr);
    if( rc!=SQLITE_OK ){
      sqlite3ErrorMsg(pParse, "%s", zErr);
    }
    sqliteFree(zErr);
  }

  return rc;
}

/*
** Add the virtual table pVtab to the array sqlite3.aVTrans[].
*/
static int addToVTrans(sqlite3 *db, sqlite3_vtab *pVtab){
  const int ARRAY_INCR = 5;

  /* Grow the sqlite3.aVTrans array if required */
  if( (db->nVTrans%ARRAY_INCR)==0 ){
    sqlite3_vtab **aVTrans;
    int nBytes = sizeof(sqlite3_vtab *) * (db->nVTrans + ARRAY_INCR);
    aVTrans = sqliteRealloc((void *)db->aVTrans, nBytes);
    if( !aVTrans ){
      return SQLITE_NOMEM;
    }
    memset(&aVTrans[db->nVTrans], 0, sizeof(sqlite3_vtab *)*ARRAY_INCR);
    db->aVTrans = aVTrans;
  }

  /* Add pVtab to the end of sqlite3.aVTrans */
  db->aVTrans[db->nVTrans++] = pVtab;
  sqlite3VtabLock(pVtab);
  return SQLITE_OK;
}

/*
** This function is invoked by the vdbe to call the xCreate method
** of the virtual table named zTab in database iDb. 
**
** If an error occurs, *pzErr is set to point an an English language
** description of the error and an SQLITE_XXX error code is returned.
** In this case the caller must call sqliteFree() on *pzErr.
*/
int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){
  int rc = SQLITE_OK;
  Table *pTab;
  Module *pMod;
  const char *zModule;

  pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName);
  assert(pTab && pTab->isVirtual && !pTab->pVtab);
  pMod = pTab->pMod;
  zModule = pTab->azModuleArg[0];

  /* If the module has been registered and includes a Create method, 
  ** invoke it now. If the module has not been registered, return an 
  ** error. Otherwise, do nothing.
  */
  if( !pMod ){
    *pzErr = sqlite3MPrintf("no such module: %s", zModule);
    rc = SQLITE_ERROR;
  }else{
    rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xCreate, pzErr);
  }

  if( rc==SQLITE_OK && pTab->pVtab ){
      rc = addToVTrans(db, pTab->pVtab);
  }

  return rc;
}

/*
** This function is used to set the schema of a virtual table.  It is only
** valid to call this function from within the xCreate() or xConnect() of a
** virtual table module.
*/
int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
  Parse sParse;

  int rc = SQLITE_OK;
  Table *pTab = db->pVTab;
  char *zErr = 0;

  if( !pTab ){
    sqlite3Error(db, SQLITE_MISUSE, 0);
    return SQLITE_MISUSE;
  }
  assert(pTab->isVirtual && pTab->nCol==0 && pTab->aCol==0);

  memset(&sParse, 0, sizeof(Parse));
  sParse.declareVtab = 1;
  sParse.db = db;

  if( 
      SQLITE_OK == sqlite3RunParser(&sParse, zCreateTable, &zErr) && 
      sParse.pNewTable && 
      !sParse.pNewTable->pSelect && 
      !sParse.pNewTable->isVirtual 
  ){
    pTab->aCol = sParse.pNewTable->aCol;
    pTab->nCol = sParse.pNewTable->nCol;
    sParse.pNewTable->nCol = 0;
    sParse.pNewTable->aCol = 0;
  } else {
    sqlite3Error(db, SQLITE_ERROR, zErr);
    sqliteFree(zErr);
    rc = SQLITE_ERROR;
  }
  sParse.declareVtab = 0;

  sqlite3_finalize((sqlite3_stmt*)sParse.pVdbe);
  sqlite3DeleteTable(0, sParse.pNewTable);
  sParse.pNewTable = 0;
  db->pVTab = 0;

  assert( (rc&0xff)==rc );
  return rc;
}

/*
** This function is invoked by the vdbe to call the xDestroy method
** of the virtual table named zTab in database iDb. This occurs
** when a DROP TABLE is mentioned.
**
** This call is a no-op if zTab is not a virtual table.
*/
int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab)
{
  int rc = SQLITE_OK;
  Table *pTab;

  pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName);
  assert(pTab);
  if( pTab->pVtab ){
    int (*xDestroy)(sqlite3_vtab *pVTab) = pTab->pMod->pModule->xDestroy;
    rc = sqlite3SafetyOff(db);
    assert( rc==SQLITE_OK );
    if( xDestroy ){
      rc = xDestroy(pTab->pVtab);
    }
    sqlite3SafetyOn(db);
    if( rc==SQLITE_OK ){
      pTab->pVtab = 0;
    }
  }

  return rc;
}

/*
** This function invokes either the xRollback or xCommit method
** of each of the virtual tables in the sqlite3.aVTrans array. The method
** called is identified by the second argument, "offset", which is
** the offset of the method to call in the sqlite3_module structure.
**
** The array is cleared after invoking the callbacks. 
*/
static void callFinaliser(sqlite3 *db, int offset){
  int i;
  for(i=0; i<db->nVTrans && db->aVTrans[i]; i++){
    sqlite3_vtab *pVtab = db->aVTrans[i];
    int (*x)(sqlite3_vtab *);
    x = *(int (**)(sqlite3_vtab *))((char *)pVtab->pModule + offset);
    if( x ) x(pVtab);
    sqlite3VtabUnlock(pVtab);
  }
  sqliteFree(db->aVTrans);
  db->nVTrans = 0;
  db->aVTrans = 0;
}

/*
** If argument rc2 is not SQLITE_OK, then return it and do nothing. 
** Otherwise, invoke the xSync method of all virtual tables in the 
** sqlite3.aVTrans array. Return the error code for the first error 
** that occurs, or SQLITE_OK if all xSync operations are successful.
*/
int sqlite3VtabSync(sqlite3 *db, int rc2){
  int i;
  int rc = SQLITE_OK;
  int rcsafety;
  sqlite3_vtab **aVTrans = db->aVTrans;
  if( rc2!=SQLITE_OK ) return rc2;

  rc = sqlite3SafetyOff(db);
  db->aVTrans = 0;
  for(i=0; rc==SQLITE_OK && i<db->nVTrans && aVTrans[i]; i++){
    sqlite3_vtab *pVtab = aVTrans[i];
    int (*x)(sqlite3_vtab *);
    x = pVtab->pModule->xSync;
    if( x ){
      rc = x(pVtab);
    }
  }
  db->aVTrans = aVTrans;
  rcsafety = sqlite3SafetyOn(db);

  if( rc==SQLITE_OK ){
    rc = rcsafety;
  }
  return rc;
}

/*
** Invoke the xRollback method of all virtual tables in the 
** sqlite3.aVTrans array. Then clear the array itself.
*/
int sqlite3VtabRollback(sqlite3 *db){
  callFinaliser(db, (int)(&((sqlite3_module *)0)->xRollback));
  return SQLITE_OK;
}

/*
** Invoke the xCommit method of all virtual tables in the 
** sqlite3.aVTrans array. Then clear the array itself.
*/
int sqlite3VtabCommit(sqlite3 *db){
  callFinaliser(db, (int)(&((sqlite3_module *)0)->xCommit));
  return SQLITE_OK;
}

/*
** If the virtual table pVtab supports the transaction interface
** (xBegin/xRollback/xCommit and optionally xSync) and a transaction is
** not currently open, invoke the xBegin method now.
**
** If the xBegin call is successful, place the sqlite3_vtab pointer
** in the sqlite3.aVTrans array.
*/
int sqlite3VtabBegin(sqlite3 *db, sqlite3_vtab *pVtab){
  int rc = SQLITE_OK;
  const sqlite3_module *pModule;

  /* Special case: If db->aVTrans is NULL and db->nVTrans is greater
  ** than zero, then this function is being called from within a
  ** virtual module xSync() callback. It is illegal to write to 
  ** virtual module tables in this case, so return SQLITE_LOCKED.
  */
  if( 0==db->aVTrans && db->nVTrans>0 ){
    return SQLITE_LOCKED;
  }
  if( !pVtab ){
    return SQLITE_OK;
  } 
  pModule = pVtab->pModule;

  if( pModule->xBegin ){
    int i;


    /* If pVtab is already in the aVTrans array, return early */
    for(i=0; (i<db->nVTrans) && 0!=db->aVTrans[i]; i++){
      if( db->aVTrans[i]==pVtab ){
        return SQLITE_OK;
      }
    }

    /* Invoke the xBegin method */
    rc = pModule->xBegin(pVtab);
    if( rc!=SQLITE_OK ){
      return rc;
    }

    rc = addToVTrans(db, pVtab);
  }
  return rc;
}

/*
** The first parameter (pDef) is a function implementation.  The
** second parameter (pExpr) is the first argument to this function.
** If pExpr is a column in a virtual table, then let the virtual
** table implementation have an opportunity to overload the function.
**
** This routine is used to allow virtual table implementations to
** overload MATCH, LIKE, GLOB, and REGEXP operators.
**
** Return either the pDef argument (indicating no change) or a 
** new FuncDef structure that is marked as ephemeral using the
** SQLITE_FUNC_EPHEM flag.
*/
FuncDef *sqlite3VtabOverloadFunction(
  FuncDef *pDef,  /* Function to possibly overload */
  int nArg,       /* Number of arguments to the function */
  Expr *pExpr     /* First argument to the function */
){
  Table *pTab;
  sqlite3_vtab *pVtab;
  sqlite3_module *pMod;
  void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
  void *pArg;
  FuncDef *pNew;
  int rc;
  char *zLowerName;
  unsigned char *z;


  /* Check to see the left operand is a column in a virtual table */
  if( pExpr==0 ) return pDef;
  if( pExpr->op!=TK_COLUMN ) return pDef;
  pTab = pExpr->pTab;
  if( pTab==0 ) return pDef;
  if( !pTab->isVirtual ) return pDef;
  pVtab = pTab->pVtab;
  assert( pVtab!=0 );
  assert( pVtab->pModule!=0 );
  pMod = (sqlite3_module *)pVtab->pModule;
  if( pMod->xFindFunction==0 ) return pDef;
 
  /* Call the xFuncFunction method on the virtual table implementation
  ** to see if the implementation wants to overload this function 
  */
  zLowerName = sqlite3StrDup(pDef->zName);
  for(z=(unsigned char*)zLowerName; *z; z++){
    *z = sqlite3UpperToLower[*z];
  }
  rc = pMod->xFindFunction(pVtab, nArg, zLowerName, &xFunc, &pArg);
  sqliteFree(zLowerName);
  if( rc==0 ){
    return pDef;
  }

  /* Create a new ephemeral function definition for the overloaded
  ** function */
  pNew = sqliteMalloc( sizeof(*pNew) + strlen(pDef->zName) );
  if( pNew==0 ){
    return pDef;
  }
  *pNew = *pDef;
  strcpy(pNew->zName, pDef->zName);
  pNew->xFunc = xFunc;
  pNew->pUserData = pArg;
  pNew->flags |= SQLITE_FUNC_EPHEM;
  return pNew;
}

#endif /* SQLITE_OMIT_VIRTUALTABLE */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级理论性理论a| 欧美伊人精品成人久久综合97 | 成人性生交大片| 精品久久久久香蕉网| 日韩成人免费在线| 欧美电视剧在线观看完整版| 日本成人在线不卡视频| 91精品国产麻豆| 国产黄色精品视频| 亚洲一区二区四区蜜桃| 欧美一二三区在线| 国产成人在线视频播放| 亚洲免费大片在线观看| 欧美色综合久久| 国产精品一级在线| 亚洲一级二级三级| 中文字幕高清不卡| 日韩一区二区三区视频在线| 国产高清久久久| 日韩专区一卡二卡| 一区精品在线播放| 精品国产一区二区三区忘忧草| 99这里只有久久精品视频| 免费人成网站在线观看欧美高清| 国产精品久久久久久妇女6080| 欧美色成人综合| 色呦呦一区二区三区| 国产曰批免费观看久久久| 日韩中文字幕区一区有砖一区 | 亚洲综合激情网| 欧美va天堂va视频va在线| 91国产免费观看| 国产91富婆露脸刺激对白| 久久国产精品99精品国产| 日韩在线卡一卡二| 午夜精品久久久久久久| 亚洲夂夂婷婷色拍ww47| 亚洲视频精选在线| 亚洲色图欧洲色图| 亚洲免费av高清| 亚洲一二三四久久| 亚洲黄色av一区| 一区二区三区毛片| 亚洲午夜电影网| 青青草伊人久久| 国产精品99久久久久久久vr| 国产高清无密码一区二区三区| 久久91精品国产91久久小草| 韩国女主播一区| 不卡的av网站| 欧美日韩成人在线| 精品国产一区二区三区久久影院 | 精品一区二区三区在线观看| 国产高清精品久久久久| 精品视频一区二区三区免费| 99精品欧美一区二区蜜桃免费| 成人精品一区二区三区四区| 国产精品99久久久| www.色综合.com| 99久久国产综合精品麻豆| 91麻豆精品91久久久久同性| 久久综合久色欧美综合狠狠| 亚洲图片自拍偷拍| eeuss鲁片一区二区三区| 欧美精品 国产精品| 中文字幕亚洲电影| 国产精品1区2区| 色一情一乱一乱一91av| 欧美精品一区视频| 婷婷综合久久一区二区三区| 亚洲精品一区二区在线观看| 免费精品视频在线| 欧美岛国在线观看| 天天影视色香欲综合网老头| 99视频一区二区| 国产亚洲午夜高清国产拍精品| 亚洲高清视频的网址| 在线亚洲精品福利网址导航| 自拍偷拍亚洲综合| 在线视频国产一区| 亚洲靠逼com| 欧美日韩一区二区三区不卡| 伊人夜夜躁av伊人久久| 日本黄色一区二区| 亚洲一区二区三区激情| 欧美日韩成人高清| 亚洲日本va午夜在线电影| 99在线视频精品| 亚洲精品第1页| 6080yy午夜一二三区久久| 久久精品久久99精品久久| 国产欧美精品一区二区三区四区 | 99国产精品久久久久久久久久| 欧美大度的电影原声| 久久精品国产亚洲5555| 欧美一区二区黄色| 国产69精品久久99不卡| 樱桃国产成人精品视频| 777a∨成人精品桃花网| 国产精品自在在线| 亚洲一区在线观看视频| 精品国产乱码久久久久久蜜臀| 国产91在线观看| 国产91丝袜在线观看| 日日夜夜一区二区| 中文字幕综合网| 欧美大片一区二区| 91老师片黄在线观看| 国产九色精品成人porny| 亚洲电影一级黄| 国产精品人妖ts系列视频| 日韩欧美国产精品一区| 欧美美女直播网站| 91免费在线看| 国产一区二区视频在线播放| 亚洲欧洲日韩av| 欧美一级理论性理论a| 不卡一区二区在线| 午夜精品福利视频网站| 欧美日韩国产另类一区| 不卡的av网站| 狠狠色丁香久久婷婷综合_中 | 亚洲成va人在线观看| 久久久久久久久久看片| 在线视频观看一区| 成人av在线网站| 日本一不卡视频| 亚洲一二三区在线观看| 2023国产精品| 91精品国产色综合久久ai换脸| 99久久精品国产一区| 久久电影国产免费久久电影| 亚洲精品福利视频网站| 中文字幕在线不卡国产视频| 精品久久久久久久久久久久久久久 | 欧美一级二级在线观看| 欧美日韩一区二区欧美激情 | 成人免费观看视频| 国产精品一区二区在线播放| 亚洲成人动漫在线观看| 爽好久久久欧美精品| 亚洲一线二线三线视频| 亚洲国产一区二区在线播放| 亚洲精品写真福利| 视频一区二区国产| 奇米精品一区二区三区在线观看 | 91激情五月电影| 欧美在线观看视频一区二区| 欧洲一区二区三区在线| 欧美挠脚心视频网站| 欧美精选一区二区| 国产精品嫩草影院com| 一区二区免费视频| 免费一级欧美片在线观看| 高清免费成人av| 欧美日韩一区二区欧美激情 | 91国偷自产一区二区三区成为亚洲经典| 精品一区二区久久| 欧美亚洲国产一区在线观看网站| 欧美日韩久久久一区| 日韩视频一区在线观看| 最好看的中文字幕久久| 蜜臀av一级做a爰片久久| 成人18视频在线播放| av一区二区三区在线| 久久人人97超碰com| 亚洲成av人片www| 国产成人无遮挡在线视频| 欧美色综合影院| 日韩一区在线看| 秋霞影院一区二区| 欧美一区二区三区男人的天堂| 中文在线资源观看网站视频免费不卡 | 欧美一级视频精品观看| 亚洲国产精品久久不卡毛片| 狠狠狠色丁香婷婷综合久久五月| 91老司机福利 在线| 中文字幕一区视频| 国产一区二区三区精品视频| 色婷婷av一区二区三区软件| 久久久国产午夜精品| 捆绑变态av一区二区三区| 欧美一区二区视频在线观看2022 | 最新国产成人在线观看| 91丨porny丨户外露出| 最新成人av在线| 欧美亚洲国产bt| 亚洲欧美激情小说另类| 欧美性一级生活| 日韩国产精品久久久久久亚洲| 欧美精选一区二区| 国产一区二区免费视频| 国产蜜臀97一区二区三区| 成人av电影在线观看| 亚洲国产日韩精品| 国产精品理论在线观看| kk眼镜猥琐国模调教系列一区二区| 国产精品美女久久久久aⅴ | 日本久久电影网| 久88久久88久久久|