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

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

?? attach.c

?? 新版輕量級嵌入式數據庫
?? C
字號:
/*** 2003 April 6**** 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 implement the ATTACH and DETACH commands.**** $Id: attach.c,v 1.50 2006/04/05 11:57:37 drh Exp $*/#include "sqliteInt.h"/*** Resolve an expression that was part of an ATTACH or DETACH statement. This** is slightly different from resolving a normal SQL expression, because simple** identifiers are treated as strings, not possible column names or aliases.**** i.e. if the parser sees:****     ATTACH DATABASE abc AS def**** it treats the two expressions as literal strings 'abc' and 'def' instead of** looking for columns of the same name.**** This only applies to the root node of pExpr, so the statement:****     ATTACH DATABASE abc||def AS 'db2'**** will fail because neither abc or def can be resolved.*/static int resolveAttachExpr(NameContext *pName, Expr *pExpr){  int rc = SQLITE_OK;  if( pExpr ){    if( pExpr->op!=TK_ID ){      rc = sqlite3ExprResolveNames(pName, pExpr);    }else{      pExpr->op = TK_STRING;    }  }  return rc;}/*** An SQL user-function registered to do the work of an ATTACH statement. The** three arguments to the function come directly from an attach statement:****     ATTACH DATABASE x AS y KEY z****     SELECT sqlite_attach(x, y, z)**** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the** third argument.*/static void attachFunc(  sqlite3_context *context,  int argc,  sqlite3_value **argv){  int i;  int rc = 0;  sqlite3 *db = sqlite3_user_data(context);  const char *zName;  const char *zFile;  Db *aNew;  char zErr[128];  char *zErrDyn = 0;  zFile = (const char *)sqlite3_value_text(argv[0]);  zName = (const char *)sqlite3_value_text(argv[1]);  /* Check for the following errors:  **  **     * Too many attached databases,  **     * Transaction currently open  **     * Specified database name already being used.  */  if( db->nDb>=MAX_ATTACHED+2 ){    sqlite3_snprintf(      127, zErr, "too many attached databases - max %d", MAX_ATTACHED    );    goto attach_error;  }  if( !db->autoCommit ){    strcpy(zErr, "cannot ATTACH database within transaction");    goto attach_error;  }  for(i=0; i<db->nDb; i++){    char *z = db->aDb[i].zName;    if( z && sqlite3StrICmp(z, zName)==0 ){      sqlite3_snprintf(127, zErr, "database %s is already in use", zName);      goto attach_error;    }  }  /* Allocate the new entry in the db->aDb[] array and initialise the schema  ** hash tables.  */  if( db->aDb==db->aDbStatic ){    aNew = sqliteMalloc( sizeof(db->aDb[0])*3 );    if( aNew==0 ){      return;    }    memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);  }else{    aNew = sqliteRealloc(db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );    if( aNew==0 ){      return;    }   }  db->aDb = aNew;  aNew = &db->aDb[db->nDb++];  memset(aNew, 0, sizeof(*aNew));  /* Open the database file. If the btree is successfully opened, use  ** it to obtain the database schema. At this point the schema may  ** or may not be initialised.  */  rc = sqlite3BtreeFactory(db, zFile, 0, MAX_PAGES, &aNew->pBt);  if( rc==SQLITE_OK ){    aNew->pSchema = sqlite3SchemaGet(aNew->pBt);    if( !aNew->pSchema ){      rc = SQLITE_NOMEM;    }else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){      strcpy(zErr,         "attached databases must use the same text encoding as main database");      goto attach_error;    }  }  aNew->zName = sqliteStrDup(zName);  aNew->safety_level = 3;#if SQLITE_HAS_CODEC  {    extern int sqlite3CodecAttach(sqlite3*, int, void*, int);    extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*);    int nKey;    char *zKey;    int t = sqlite3_value_type(argv[2]);    switch( t ){      case SQLITE_INTEGER:      case SQLITE_FLOAT:        zErrDyn = sqliteStrDup("Invalid key value");        rc = SQLITE_ERROR;        break;              case SQLITE_TEXT:      case SQLITE_BLOB:        nKey = sqlite3_value_bytes(argv[2]);        zKey = (char *)sqlite3_value_blob(argv[2]);        sqlite3CodecAttach(db, db->nDb-1, zKey, nKey);        break;      case SQLITE_NULL:        /* No key specified.  Use the key from the main database */        sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey);        sqlite3CodecAttach(db, db->nDb-1, zKey, nKey);        break;    }  }#endif  /* If the file was opened successfully, read the schema for the new database.  ** If this fails, or if opening the file failed, then close the file and   ** remove the entry from the db->aDb[] array. i.e. put everything back the way  ** we found it.  */  if( rc==SQLITE_OK ){    sqlite3SafetyOn(db);    rc = sqlite3Init(db, &zErrDyn);    sqlite3SafetyOff(db);  }  if( rc ){    int iDb = db->nDb - 1;    assert( iDb>=2 );    if( db->aDb[iDb].pBt ){      sqlite3BtreeClose(db->aDb[iDb].pBt);      db->aDb[iDb].pBt = 0;      db->aDb[iDb].pSchema = 0;    }    sqlite3ResetInternalSchema(db, 0);    db->nDb = iDb;    if( rc==SQLITE_NOMEM ){      sqlite3MallocFailed();      sqlite3_snprintf(127, zErr, "out of memory");    }else{      sqlite3_snprintf(127, zErr, "unable to open database: %s", zFile);    }    goto attach_error;  }    return;attach_error:  /* Return an error if we get here */  if( zErrDyn ){    sqlite3_result_error(context, zErrDyn, -1);    sqliteFree(zErrDyn);  }else{    zErr[sizeof(zErr)-1] = 0;    sqlite3_result_error(context, zErr, -1);  }}/*** An SQL user-function registered to do the work of an DETACH statement. The** three arguments to the function come directly from a detach statement:****     DETACH DATABASE x****     SELECT sqlite_detach(x)*/static void detachFunc(  sqlite3_context *context,  int argc,  sqlite3_value **argv){  const char *zName = (const char *)sqlite3_value_text(argv[0]);  sqlite3 *db = sqlite3_user_data(context);  int i;  Db *pDb = 0;  char zErr[128];  assert(zName);  for(i=0; i<db->nDb; i++){    pDb = &db->aDb[i];    if( pDb->pBt==0 ) continue;    if( sqlite3StrICmp(pDb->zName, zName)==0 ) break;  }  if( i>=db->nDb ){    sqlite3_snprintf(sizeof(zErr), zErr, "no such database: %s", zName);    goto detach_error;  }  if( i<2 ){    sqlite3_snprintf(sizeof(zErr), zErr, "cannot detach database %s", zName);    goto detach_error;  }  if( !db->autoCommit ){    strcpy(zErr, "cannot DETACH database within transaction");    goto detach_error;  }  sqlite3BtreeClose(pDb->pBt);  pDb->pBt = 0;  pDb->pSchema = 0;  sqlite3ResetInternalSchema(db, 0);  return;detach_error:  sqlite3_result_error(context, zErr, -1);}/*** This procedure generates VDBE code for a single invocation of either the** sqlite_detach() or sqlite_attach() SQL user functions.*/static void codeAttach(  Parse *pParse,       /* The parser context */  int type,            /* Either SQLITE_ATTACH or SQLITE_DETACH */  const char *zFunc,   /* Either "sqlite_attach" or "sqlite_detach */  int nFunc,           /* Number of args to pass to zFunc */  Expr *pAuthArg,      /* Expression to pass to authorization callback */  Expr *pFilename,     /* Name of database file */  Expr *pDbname,       /* Name of the database to use internally */  Expr *pKey           /* Database key for encryption extension */){  int rc;  NameContext sName;  Vdbe *v;  FuncDef *pFunc;  sqlite3* db = pParse->db;#ifndef SQLITE_OMIT_AUTHORIZATION  assert( sqlite3MallocFailed() || pAuthArg );  if( pAuthArg ){    char *zAuthArg = sqlite3NameFromToken(&pAuthArg->span);    if( !zAuthArg ){      goto attach_end;    }    rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0);    sqliteFree(zAuthArg);    if(rc!=SQLITE_OK ){      goto attach_end;    }  }#endif /* SQLITE_OMIT_AUTHORIZATION */  memset(&sName, 0, sizeof(NameContext));  sName.pParse = pParse;  if(       SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) ||      SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) ||      SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey))  ){    pParse->nErr++;    goto attach_end;  }  v = sqlite3GetVdbe(pParse);  sqlite3ExprCode(pParse, pFilename);  sqlite3ExprCode(pParse, pDbname);  sqlite3ExprCode(pParse, pKey);  assert( v || sqlite3MallocFailed() );  if( v ){    sqlite3VdbeAddOp(v, OP_Function, 0, nFunc);    pFunc = sqlite3FindFunction(db, zFunc, strlen(zFunc), nFunc, SQLITE_UTF8,0);    sqlite3VdbeChangeP3(v, -1, (char *)pFunc, P3_FUNCDEF);    /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this    ** statement only). For DETACH, set it to false (expire all existing    ** statements).    */    sqlite3VdbeAddOp(v, OP_Expire, (type==SQLITE_ATTACH), 0);  }  attach_end:  sqlite3ExprDelete(pFilename);  sqlite3ExprDelete(pDbname);  sqlite3ExprDelete(pKey);}/*** Called by the parser to compile a DETACH statement.****     DETACH pDbname*/void sqlite3Detach(Parse *pParse, Expr *pDbname){  codeAttach(pParse, SQLITE_DETACH, "sqlite_detach", 1, pDbname, 0, 0, pDbname);}/*** Called by the parser to compile an ATTACH statement.****     ATTACH p AS pDbname KEY pKey*/void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){  codeAttach(pParse, SQLITE_ATTACH, "sqlite_attach", 3, p, p, pDbname, pKey);}/*** Register the functions sqlite_attach and sqlite_detach.*/void sqlite3AttachFunctions(sqlite3 *db){  static const int enc = SQLITE_UTF8;  sqlite3CreateFunc(db, "sqlite_attach", 3, enc, db, attachFunc, 0, 0);  sqlite3CreateFunc(db, "sqlite_detach", 1, enc, db, detachFunc, 0, 0);}/*** Initialize a DbFixer structure.  This routine must be called prior** to passing the structure to one of the sqliteFixAAAA() routines below.**** The return value indicates whether or not fixation is required.  TRUE** means we do need to fix the database references, FALSE means we do not.*/int sqlite3FixInit(  DbFixer *pFix,      /* The fixer to be initialized */  Parse *pParse,      /* Error messages will be written here */  int iDb,            /* This is the database that must be used */  const char *zType,  /* "view", "trigger", or "index" */  const Token *pName  /* Name of the view, trigger, or index */){  sqlite3 *db;  if( iDb<0 || iDb==1 ) return 0;  db = pParse->db;  assert( db->nDb>iDb );  pFix->pParse = pParse;  pFix->zDb = db->aDb[iDb].zName;  pFix->zType = zType;  pFix->pName = pName;  return 1;}/*** The following set of routines walk through the parse tree and assign** a specific database to all table references where the database name** was left unspecified in the original SQL statement.  The pFix structure** must have been initialized by a prior call to sqlite3FixInit().**** These routines are used to make sure that an index, trigger, or** view in one database does not refer to objects in a different database.** (Exception: indices, triggers, and views in the TEMP database are** allowed to refer to anything.)  If a reference is explicitly made** to an object in a different database, an error message is added to** pParse->zErrMsg and these routines return non-zero.  If everything** checks out, these routines return 0.*/int sqlite3FixSrcList(  DbFixer *pFix,       /* Context of the fixation */  SrcList *pList       /* The Source list to check and modify */){  int i;  const char *zDb;  struct SrcList_item *pItem;  if( pList==0 ) return 0;  zDb = pFix->zDb;  for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){    if( pItem->zDatabase==0 ){      pItem->zDatabase = sqliteStrDup(zDb);    }else if( sqlite3StrICmp(pItem->zDatabase,zDb)!=0 ){      sqlite3ErrorMsg(pFix->pParse,         "%s %T cannot reference objects in database %s",         pFix->zType, pFix->pName, pItem->zDatabase);      return 1;    }#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)    if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1;    if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1;#endif  }  return 0;}#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)int sqlite3FixSelect(  DbFixer *pFix,       /* Context of the fixation */  Select *pSelect      /* The SELECT statement to be fixed to one database */){  while( pSelect ){    if( sqlite3FixExprList(pFix, pSelect->pEList) ){      return 1;    }    if( sqlite3FixSrcList(pFix, pSelect->pSrc) ){      return 1;    }    if( sqlite3FixExpr(pFix, pSelect->pWhere) ){      return 1;    }    if( sqlite3FixExpr(pFix, pSelect->pHaving) ){      return 1;    }    pSelect = pSelect->pPrior;  }  return 0;}int sqlite3FixExpr(  DbFixer *pFix,     /* Context of the fixation */  Expr *pExpr        /* The expression to be fixed to one database */){  while( pExpr ){    if( sqlite3FixSelect(pFix, pExpr->pSelect) ){      return 1;    }    if( sqlite3FixExprList(pFix, pExpr->pList) ){      return 1;    }    if( sqlite3FixExpr(pFix, pExpr->pRight) ){      return 1;    }    pExpr = pExpr->pLeft;  }  return 0;}int sqlite3FixExprList(  DbFixer *pFix,     /* Context of the fixation */  ExprList *pList    /* The expression to be fixed to one database */){  int i;  struct ExprList_item *pItem;  if( pList==0 ) return 0;  for(i=0, pItem=pList->a; i<pList->nExpr; i++, pItem++){    if( sqlite3FixExpr(pFix, pItem->pExpr) ){      return 1;    }  }  return 0;}#endif#ifndef SQLITE_OMIT_TRIGGERint sqlite3FixTriggerStep(  DbFixer *pFix,     /* Context of the fixation */  TriggerStep *pStep /* The trigger step be fixed to one database */){  while( pStep ){    if( sqlite3FixSelect(pFix, pStep->pSelect) ){      return 1;    }    if( sqlite3FixExpr(pFix, pStep->pWhere) ){      return 1;    }    if( sqlite3FixExprList(pFix, pStep->pExprList) ){      return 1;    }    pStep = pStep->pNext;  }  return 0;}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
激情六月婷婷久久| 欧美三级日韩在线| 日韩理论片在线| 色婷婷激情一区二区三区| 亚洲精品伦理在线| 欧美狂野另类xxxxoooo| 男女激情视频一区| 国产性做久久久久久| 不卡一区二区中文字幕| 国产精品国产三级国产普通话99| 日本精品免费观看高清观看| 无吗不卡中文字幕| 久久蜜桃一区二区| 99久久精品免费精品国产| 亚洲一区免费视频| 日韩一级完整毛片| 成人免费av网站| 亚洲伊人伊色伊影伊综合网| 日韩一区二区影院| 国产·精品毛片| 亚洲一区av在线| 日韩欧美国产不卡| 成人免费高清视频在线观看| 亚洲自拍另类综合| 欧美成人性福生活免费看| 波多野结衣在线一区| 亚洲最大成人综合| 久久天堂av综合合色蜜桃网| 99久久精品国产导航| 五月综合激情婷婷六月色窝| 久久青草国产手机看片福利盒子 | 中文字幕一区日韩精品欧美| 色8久久精品久久久久久蜜| 日产国产欧美视频一区精品| 欧美激情一区二区三区在线| 欧美视频一区在线观看| 精品一区二区三区在线观看国产| 国产精品毛片高清在线完整版| 欧美在线一二三四区| 国产乱码精品一区二区三区忘忧草| 日韩毛片一二三区| 欧美刺激午夜性久久久久久久| av在线不卡免费看| 日本不卡视频在线观看| 中文字幕乱码日本亚洲一区二区| 欧美日韩精品欧美日韩精品一综合| 国产一区二区三区最好精华液 | 国产精品嫩草久久久久| 欧美剧在线免费观看网站| 国产精品一区二区三区四区| 亚洲成人av免费| 国产欧美日韩麻豆91| 8v天堂国产在线一区二区| 成人午夜私人影院| 裸体歌舞表演一区二区| 一区二区三区色| 国产女同性恋一区二区| 日韩一级片在线观看| 色综合久久综合网97色综合| 国产精品自拍网站| 日日噜噜夜夜狠狠视频欧美人| 中国av一区二区三区| 日韩视频一区在线观看| 91精彩视频在线观看| 成人成人成人在线视频| 美女视频黄免费的久久 | 91麻豆精品国产91久久久久| zzijzzij亚洲日本少妇熟睡| 久久66热偷产精品| 午夜精品久久久久久久蜜桃app| 国产精品麻豆视频| 2022国产精品视频| 91精品国产综合久久香蕉的特点| 91麻豆国产福利精品| 国产精品自在在线| 另类的小说在线视频另类成人小视频在线| 亚洲免费在线观看| 中文字幕一区二区三| 久久精品一区二区三区四区| 91精品国产色综合久久不卡电影| 91在线观看成人| 成人网男人的天堂| 国产精品一区专区| 韩国毛片一区二区三区| 男人的天堂久久精品| 水蜜桃久久夜色精品一区的特点| 一区二区三区四区激情 | 国产精品动漫网站| 国产视频一区二区在线| 精品国产乱码久久久久久浪潮| 欧美日韩国产在线播放网站| 色综合天天在线| av一区二区三区在线| 懂色av一区二区夜夜嗨| 国产在线精品一区二区不卡了| 蜜桃视频免费观看一区| 三级欧美韩日大片在线看| 亚洲国产你懂的| 亚洲午夜免费电影| 一二三区精品福利视频| 亚洲美女视频在线| 一区二区三区四区不卡在线 | 免费人成精品欧美精品| 日日夜夜精品视频免费| 日韩精品一二区| 奇米精品一区二区三区在线观看| 日韩主播视频在线| 丝袜亚洲另类丝袜在线| 日本欧美一区二区三区乱码| 丝袜脚交一区二区| 男男视频亚洲欧美| 久久精品99久久久| 国内外成人在线| 国产成人午夜电影网| 高清不卡一二三区| 成人免费精品视频| 91亚洲国产成人精品一区二区三 | 色av成人天堂桃色av| 91福利视频网站| 欧美性色aⅴ视频一区日韩精品| 欧美色手机在线观看| 欧美日韩电影一区| 欧美一区二区三区四区在线观看| 日韩精品一区二区三区老鸭窝 | 日韩欧美一区二区在线视频| 日韩欧美国产wwwww| 久久影院午夜片一区| 欧美国产一区视频在线观看| 自拍av一区二区三区| 亚洲成av人片在线观看无码| 日韩高清在线观看| 极品美女销魂一区二区三区 | 国产不卡视频一区二区三区| 成人精品视频一区二区三区| 91亚洲国产成人精品一区二三| 精品视频1区2区| 日韩一级免费观看| 欧美韩国一区二区| 一区二区三区在线观看动漫| 视频一区二区不卡| 国产乱国产乱300精品| 99精品国产热久久91蜜凸| 欧美性生活大片视频| 欧美成人免费网站| 国产精品国产三级国产aⅴ无密码| 一区二区高清免费观看影视大全| 日本美女视频一区二区| 国产一区二区在线观看免费| av在线播放成人| 6080国产精品一区二区| 久久久精品综合| 亚洲免费观看在线观看| 日韩中文字幕av电影| 国产精品69毛片高清亚洲| 91丨九色丨国产丨porny| 欧美一区二区在线免费观看| 国产欧美精品一区aⅴ影院| 一区二区在线看| 久久国产精品99久久久久久老狼| 成人的网站免费观看| 8x8x8国产精品| 国产精品狼人久久影院观看方式| 亚洲不卡av一区二区三区| 国产老妇另类xxxxx| 欧美亚洲国产bt| 久久这里只精品最新地址| 一区二区国产视频| 国产乱子伦一区二区三区国色天香| 99re这里只有精品6| 日韩无一区二区| 亚洲色图都市小说| 久久精品国产在热久久| 99视频精品全部免费在线| 欧美一区二区三级| 亚洲国产高清不卡| 日产国产欧美视频一区精品 | 欧美亚洲国产一区二区三区va| 欧美精品一区二区三区在线 | 成年人网站91| 日韩写真欧美这视频| 综合中文字幕亚洲| 狠狠色伊人亚洲综合成人| 欧美性生活久久| 国产欧美一区二区三区沐欲| 午夜国产不卡在线观看视频| 成人a区在线观看| 日韩天堂在线观看| 亚洲一区在线电影| 成人av资源站| 亚洲精品一区二区三区四区高清| 午夜久久久久久| 91在线观看美女| 国产人久久人人人人爽| 青青草成人在线观看| 一本一道久久a久久精品综合蜜臀| 国产亚洲精久久久久久| 久久精品久久99精品久久| 欧美视频一区二区在线观看| 亚洲特黄一级片| 国产成人福利片|