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

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

?? vtab.c

?? sqlite 3.3.8 支持加密的版本
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
** 2006 June 10
**
** 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 code used to help implement virtual tables.
**
** $Id: vtab.c,v 1.2 2006/10/12 21:34:22 rmsimpson Exp $
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
#include "sqliteInt.h"

/*
** External API function used to create a new virtual-table module.
*/
int sqlite3_create_module(
  sqlite3 *db,                    /* Database in which module is registered */
  const char *zName,              /* Name assigned to this module */
  const sqlite3_module *pModule,  /* The definition of the module */
  void *pAux                      /* Context pointer for xCreate/xConnect */
){
  int nName = strlen(zName);
  Module *pMod = (Module *)sqliteMallocRaw(sizeof(Module) + nName + 1);
  if( pMod ){
    char *zCopy = (char *)(&pMod[1]);
    strcpy(zCopy, zName);
    pMod->zName = zCopy;
    pMod->pModule = pModule;
    pMod->pAux = pAux;
    pMod = (Module *)sqlite3HashInsert(&db->aModule, zCopy, nName, (void*)pMod);
    sqliteFree(pMod);
    sqlite3ResetInternalSchema(db, 0);
  }
  return sqlite3ApiExit(db, SQLITE_OK);
}

/*
** Lock the virtual table so that it cannot be disconnected.
** Locks nest.  Every lock should have a corresponding unlock.
** If an unlock is omitted, resources leaks will occur.  
**
** If a disconnect is attempted while a virtual table is locked,
** the disconnect is deferred until all locks have been removed.
*/
void sqlite3VtabLock(sqlite3_vtab *pVtab){
  pVtab->nRef++;
}

/*
** Unlock a virtual table.  When the last lock is removed,
** disconnect the virtual table.
*/
void sqlite3VtabUnlock(sqlite3_vtab *pVtab){
  pVtab->nRef--;
  if( pVtab->nRef==0 ){
    pVtab->pModule->xDisconnect(pVtab);
  }
}

/*
** Clear any and all virtual-table information from the Table record.
** This routine is called, for example, just before deleting the Table
** record.
*/
void sqlite3VtabClear(Table *p){
  sqlite3_vtab *pVtab = p->pVtab;
  if( pVtab ){
    assert( p->pMod && p->pMod->pModule );
    sqlite3VtabUnlock(pVtab);
    p->pVtab = 0;
  }
  if( p->azModuleArg ){
    int i;
    for(i=0; i<p->nModuleArg; i++){
      sqliteFree(p->azModuleArg[i]);
    }
    sqliteFree(p->azModuleArg);
  }
}

/*
** Add a new module argument to pTable->azModuleArg[].
** The string is not copied - the pointer is stored.  The
** string will be freed automatically when the table is
** deleted.
*/
static void addModuleArgument(Table *pTable, char *zArg){
  int i = pTable->nModuleArg++;
  int nBytes = sizeof(char *)*(1+pTable->nModuleArg);
  char **azModuleArg;
  azModuleArg = sqliteRealloc(pTable->azModuleArg, nBytes);
  if( azModuleArg==0 ){
    int j;
    for(j=0; j<i; j++){
      sqliteFree(pTable->azModuleArg[j]);
    }
    sqliteFree(zArg);
    sqliteFree(pTable->azModuleArg);
    pTable->nModuleArg = 0;
  }else{
    azModuleArg[i] = zArg;
    azModuleArg[i+1] = 0;
  }
  pTable->azModuleArg = azModuleArg;
}

/*
** The parser calls this routine when it first sees a CREATE VIRTUAL TABLE
** statement.  The module name has been parsed, but the optional list
** of parameters that follow the module name are still pending.
*/
void sqlite3VtabBeginParse(
  Parse *pParse,        /* Parsing context */
  Token *pName1,        /* Name of new table, or database name */
  Token *pName2,        /* Name of new table or NULL */
  Token *pModuleName    /* Name of the module for the virtual table */
){
  int iDb;              /* The database the table is being created in */
  Table *pTable;        /* The new virtual table */

  sqlite3StartTable(pParse, pName1, pName2, 0, 0, 1, 0);
  pTable = pParse->pNewTable;
  if( pTable==0 || pParse->nErr ) return;
  assert( 0==pTable->pIndex );

  iDb = sqlite3SchemaToIndex(pParse->db, pTable->pSchema);
  assert( iDb>=0 );

  pTable->isVirtual = 1;
  pTable->nModuleArg = 0;
  addModuleArgument(pTable, sqlite3NameFromToken(pModuleName));
  addModuleArgument(pTable, sqlite3StrDup(pParse->db->aDb[iDb].zName));
  addModuleArgument(pTable, sqlite3StrDup(pTable->zName));
  pParse->sNameToken.n = pModuleName->z + pModuleName->n - pName1->z;

#ifndef SQLITE_OMIT_AUTHORIZATION
  /* Creating a virtual table invokes the authorization callback twice.
  ** The first invocation, to obtain permission to INSERT a row into the
  ** sqlite_master table, has already been made by sqlite3StartTable().
  ** The second call, to obtain permission to create the table, is made now.
  */
  if( pTable->azModuleArg ){
    sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, 
            pTable->azModuleArg[0], pParse->db->aDb[iDb].zName);
  }
#endif
}

/*
** This routine takes the module argument that has been accumulating
** in pParse->zArg[] and appends it to the list of arguments on the
** virtual table currently under construction in pParse->pTable.
*/
static void addArgumentToVtab(Parse *pParse){
  if( pParse->sArg.z && pParse->pNewTable ){
    const char *z = (const char*)pParse->sArg.z;
    int n = pParse->sArg.n;
    addModuleArgument(pParse->pNewTable, sqliteStrNDup(z, n));
  }
}

/*
** The parser calls this routine after the CREATE VIRTUAL TABLE statement
** has been completely parsed.
*/
void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
  Table *pTab;        /* The table being constructed */
  sqlite3 *db;        /* The database connection */
  char *zModule;      /* The module name of the table: USING modulename */
  Module *pMod = 0;

  addArgumentToVtab(pParse);
  pParse->sArg.z = 0;

  /* Lookup the module name. */
  pTab = pParse->pNewTable;
  if( pTab==0 ) return;
  db = pParse->db;
  if( pTab->nModuleArg<1 ) return;
  zModule = pTab->azModuleArg[0];
  pMod = (Module *)sqlite3HashFind(&db->aModule, zModule, strlen(zModule));
  pTab->pMod = pMod;
  
  /* If the CREATE VIRTUAL TABLE statement is being entered for the
  ** first time (in other words if the virtual table is actually being
  ** created now instead of just being read out of sqlite_master) then
  ** do additional initialization work and store the statement text
  ** in the sqlite_master table.
  */
  if( !db->init.busy ){
    char *zStmt;
    char *zWhere;
    int iDb;
    Vdbe *v;

    /* Compute the complete text of the CREATE VIRTUAL TABLE statement */
    if( pEnd ){
      pParse->sNameToken.n = pEnd->z - pParse->sNameToken.z + pEnd->n;
    }
    zStmt = sqlite3MPrintf("CREATE VIRTUAL TABLE %T", &pParse->sNameToken);

    /* A slot for the record has already been allocated in the 
    ** SQLITE_MASTER table.  We just need to update that slot with all
    ** the information we've collected.  
    **
    ** The top of the stack is the rootpage allocated by sqlite3StartTable().
    ** This value is always 0 and is ignored, a virtual table does not have a
    ** rootpage. The next entry on the stack is the rowid of the record
    ** in the sqlite_master table.
    */
    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
    sqlite3NestedParse(pParse,
      "UPDATE %Q.%s "
         "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q "
       "WHERE rowid=#1",
      db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
      pTab->zName,
      pTab->zName,
      zStmt
    );
    sqliteFree(zStmt);
    v = sqlite3GetVdbe(pParse);
    sqlite3ChangeCookie(db, v, iDb);

    sqlite3VdbeAddOp(v, OP_Expire, 0, 0);
    zWhere = sqlite3MPrintf("name='%q'", pTab->zName);
    sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0, zWhere, P3_DYNAMIC);
    sqlite3VdbeOp3(v, OP_VCreate, iDb, 0, pTab->zName, strlen(pTab->zName) + 1);
  }

  /* If we are rereading the sqlite_master table create the in-memory
  ** record of the table. If the module has already been registered,
  ** also call the xConnect method here.
  */
  else {
    Table *pOld;
    Schema *pSchema = pTab->pSchema;
    const char *zName = pTab->zName;
    int nName = strlen(zName) + 1;
    pOld = sqlite3HashInsert(&pSchema->tblHash, zName, nName, pTab);
    if( pOld ){
      assert( pTab==pOld );  /* Malloc must have failed inside HashInsert() */
      return;
    }
    pParse->pNewTable = 0;
  }
}

/*
** The parser calls this routine when it sees the first token
** of an argument to the module name in a CREATE VIRTUAL TABLE statement.
*/
void sqlite3VtabArgInit(Parse *pParse){
  addArgumentToVtab(pParse);
  pParse->sArg.z = 0;
  pParse->sArg.n = 0;
}

/*
** The parser calls this routine for each token after the first token
** in an argument to the module name in a CREATE VIRTUAL TABLE statement.
*/
void sqlite3VtabArgExtend(Parse *pParse, Token *p){
  Token *pArg = &pParse->sArg;
  if( pArg->z==0 ){
    pArg->z = p->z;
    pArg->n = p->n;
  }else{
    assert(pArg->z < p->z);
    pArg->n = (p->z + p->n - pArg->z);
  }
}

/*
** Invoke a virtual table constructor (either xCreate or xConnect). The
** pointer to the function to invoke is passed as the fourth parameter
** to this procedure.
*/
static int vtabCallConstructor(
  sqlite3 *db, 
  Table *pTab,
  Module *pMod,
  int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**),
  char **pzErr
){
  int rc;
  int rc2;
  sqlite3_vtab *pVtab;
  const char *const*azArg = (const char *const*)pTab->azModuleArg;
  int nArg = pTab->nModuleArg;
  char *zErr = 0;
  char *zModuleName = sqlite3MPrintf("%s", pTab->zName);

  assert( !db->pVTab );
  assert( xConstruct );

  db->pVTab = pTab;
  rc = sqlite3SafetyOff(db);
  assert( rc==SQLITE_OK );
  rc = xConstruct(db, pMod->pAux, nArg, azArg, &pTab->pVtab, &zErr);
  rc2 = sqlite3SafetyOn(db);
  pVtab = pTab->pVtab;
  if( rc==SQLITE_OK && pVtab ){
    pVtab->pModule = pMod->pModule;
    pVtab->nRef = 1;
  }

  if( SQLITE_OK!=rc ){
    if( zErr==0 ){
      *pzErr = sqlite3MPrintf("vtable constructor failed: %s", zModuleName);
    }else {
      *pzErr = sqlite3MPrintf("%s", zErr);
      sqlite3_free(zErr);
    }
  }else if( db->pVTab ){
    const char *zFormat = "vtable constructor did not declare schema: %s";
    *pzErr = sqlite3MPrintf(zFormat, pTab->zName);
    rc = SQLITE_ERROR;
  } 
  if( rc==SQLITE_OK ){
    rc = rc2;
  }
  db->pVTab = 0;
  sqliteFree(zModuleName);
  return rc;
}

/*
** This function is invoked by the parser to call the xConnect() method
** of the virtual table pTab. If an error occurs, an error code is returned 
** and an error left in pParse.
**
** This call is a no-op if table pTab is not a virtual table.
*/
int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){
  Module *pMod;
  const char *zModule;
  int rc = SQLITE_OK;

  if( !pTab || !pTab->isVirtual || pTab->pVtab ){
    return SQLITE_OK;
  }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日产国产欧美视频一区精品| av网站一区二区三区| 成人av在线播放网址| 精品视频在线免费看| 亚洲韩国一区二区三区| 国产乱码一区二区三区| 色综合天天综合给合国产| 日韩欧美一区二区免费| 亚洲3atv精品一区二区三区| 欧美日韩午夜在线| 精品在线观看视频| 欧美日韩亚洲综合在线| 亚洲国产日韩a在线播放| 欧美视频一区二区三区四区| 亚洲一二三区视频在线观看| 欧美一卡在线观看| 日本午夜一区二区| 久久久五月婷婷| 在线看一区二区| 欧美一级理论性理论a| 亚洲高清视频在线| 精品理论电影在线| 国产成人夜色高潮福利影视| 亚洲精品美国一| 欧美日韩精品系列| 国产资源精品在线观看| 国产精品初高中害羞小美女文| 94-欧美-setu| 激情久久五月天| 亚洲免费成人av| 精品捆绑美女sm三区| 成人精品在线视频观看| 亚洲第一在线综合网站| 久久电影网站中文字幕| 夜夜精品视频一区二区| 久久久91精品国产一区二区精品 | 欧美高清在线一区| 精品福利在线导航| 在线播放欧美女士性生活| 欧美日韩一区小说| 日韩精品一区二区三区在线播放 | 成人欧美一区二区三区在线播放| 国产亚洲一二三区| 中文字幕日韩精品一区 | 国产美女在线观看一区| 精品一区二区三区av| 91在线国产福利| 粗大黑人巨茎大战欧美成人| 日韩精品免费视频人成| 亚洲国产美女搞黄色| 中文字幕中文乱码欧美一区二区 | 欧美色老头old∨ideo| 91丨porny丨在线| 91丨国产丨九色丨pron| 91麻豆产精品久久久久久| 91在线观看高清| 91豆麻精品91久久久久久| 欧美在线免费播放| 欧美精品粉嫩高潮一区二区| 日韩午夜在线播放| 精品久久五月天| 日本一区二区三区四区| 亚洲人成影院在线观看| 伊人夜夜躁av伊人久久| 日本在线播放一区二区三区| 国产一区免费电影| 成人av网址在线| 欧美日韩国产另类不卡| 久久免费国产精品| 亚洲人成网站色在线观看| 夜夜嗨av一区二区三区四季av| 日韩激情视频网站| 成人永久看片免费视频天堂| 欧美日韩在线电影| 国产偷v国产偷v亚洲高清| 1024成人网色www| 久久电影网站中文字幕| 日本韩国一区二区三区视频| 欧美成人一区二区三区片免费 | 亚洲综合丝袜美腿| 久久99国内精品| 欧美三级在线播放| 综合激情成人伊人| 国产乱码精品一区二区三区忘忧草| 9久草视频在线视频精品| 精品国产91洋老外米糕| 亚洲综合图片区| 99精品国产热久久91蜜凸| 精品国产自在久精品国产| 一区二区三区在线看| 粉嫩欧美一区二区三区高清影视| 5858s免费视频成人| 亚洲男人天堂av| 成人国产精品免费观看动漫| 精品国产免费一区二区三区四区| 亚洲18影院在线观看| 91丨porny丨国产入口| 国产精品二三区| 成人app网站| 中文字幕一区二| 成人黄页毛片网站| 国产精品久久久久一区二区三区共 | 欧美肥妇bbw| 午夜精品爽啪视频| 欧美一区二区三区爱爱| 国产成人午夜精品影院观看视频| 在线播放中文字幕一区| 日韩vs国产vs欧美| 日韩精品专区在线| 国产精品小仙女| 最新成人av在线| 欧美日韩精品一区二区天天拍小说 | 国产女主播在线一区二区| 成人精品小蝌蚪| 亚洲国产精品久久人人爱| 在线播放视频一区| 国产精品123| 亚欧色一区w666天堂| 日韩三级伦理片妻子的秘密按摩| 国产资源精品在线观看| 亚洲欧洲另类国产综合| 欧美一区二区视频免费观看| 国产精品一区二区三区99| 成人欧美一区二区三区| 欧美一区二区三区免费视频| 国产精品一卡二卡在线观看| 亚洲美腿欧美偷拍| 精品国产一区二区三区久久影院| 97精品电影院| 国产主播一区二区| 午夜精品久久久久久不卡8050| 亚洲视频一区在线| 69久久夜色精品国产69蝌蚪网| 成人性生交大片免费看在线播放 | 久久精品水蜜桃av综合天堂| 精品视频在线免费看| 99久久精品免费| 国产精品一区二区不卡| 日本一不卡视频| 亚洲猫色日本管| 中文字幕制服丝袜一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 日韩亚洲欧美一区二区三区| 欧美网站一区二区| 97se亚洲国产综合自在线 | 狠狠色综合播放一区二区| 亚洲精品第一国产综合野| 国产精品青草久久| 国产精品青草久久| 亚洲视频一区在线| 伊人色综合久久天天人手人婷| 中文字幕一区在线观看视频| 中文字幕永久在线不卡| 一区二区三区在线观看网站| 国产精品美女久久久久aⅴ国产馆| ww久久中文字幕| 国产精品久久久久7777按摩| 中文字幕永久在线不卡| 一区二区三区在线视频观看58| 亚洲综合偷拍欧美一区色| 亚洲6080在线| 国产成人精品三级麻豆| 不卡一区二区三区四区| 91女神在线视频| 6080国产精品一区二区| 国产午夜精品在线观看| 成人免费视频在线观看| 日韩高清不卡一区二区三区| 黄色资源网久久资源365| 97久久超碰精品国产| 欧美日本高清视频在线观看| 久久中文字幕电影| 亚洲综合视频网| 国产盗摄一区二区三区| 91久久香蕉国产日韩欧美9色| 在线播放国产精品二区一二区四区| 日韩一级大片在线观看| 亚洲欧美日韩小说| 久久成人免费网| 欧美日韩国产高清一区| 国产精品国产成人国产三级 | 一本大道久久精品懂色aⅴ| 91精品国产91久久久久久一区二区| 欧美韩国日本不卡| 免费观看日韩av| 欧美群妇大交群中文字幕| 中文字幕va一区二区三区| 麻豆精品国产91久久久久久| 欧美日韩在线播| 亚洲视频香蕉人妖| 国产精品一区一区| 国产午夜亚洲精品羞羞网站| 免费不卡在线视频| 在线综合视频播放| 日韩精品五月天| 欧美一级黄色录像| 日本视频中文字幕一区二区三区| 欧美一级搡bbbb搡bbbb| 亚洲一级二级在线| 欧美日韩另类国产亚洲欧美一级|