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

📄 pragma.c

📁 sqlite最新源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    }  }else#if !defined(SQLITE_ENABLE_LOCKING_STYLE)#  if defined(__APPLE__)#    define SQLITE_ENABLE_LOCKING_STYLE 1#  else#    define SQLITE_ENABLE_LOCKING_STYLE 0#  endif#endif#if SQLITE_ENABLE_LOCKING_STYLE  /*   **   PRAGMA [database.]lock_proxy_file   **   PRAGMA [database.]lock_proxy_file = ":auto:"|"lock_file_path"   **   ** Return or set the value of the lock_proxy_file flag.  Changing   ** the value sets a specific file to be used for database access locks.   **   */  if( sqlite3StrICmp(zLeft, "lock_proxy_file")==0 ){    if( !zRight ){      Pager *pPager = sqlite3BtreePager(pDb->pBt);      char *proxy_file_path = NULL;      sqlite3_file *pFile = sqlite3PagerFile(pPager);      sqlite3OsFileControl(pFile, SQLITE_GET_LOCKPROXYFILE,                            &proxy_file_path);            if( proxy_file_path ){        sqlite3VdbeSetNumCols(v, 1);        sqlite3VdbeSetColName(v, 0, COLNAME_NAME,                               "lock_proxy_file", SQLITE_STATIC);        sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, proxy_file_path, 0);        sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);      }    }else{      Pager *pPager = sqlite3BtreePager(pDb->pBt);      sqlite3_file *pFile = sqlite3PagerFile(pPager);      int res;      if( zRight[0] ){        res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE,                                      zRight);      } else {        res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE,                                      NULL);      }      if( res!=SQLITE_OK ){        sqlite3ErrorMsg(pParse, "failed to set lock proxy file");        goto pragma_out;      }    }  }else#endif /* SQLITE_ENABLE_LOCKING_STYLE */            /*  **   PRAGMA [database.]synchronous  **   PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL  **  ** Return or set the local value of the synchronous flag.  Changing  ** the local value does not make changes to the disk file and the  ** default value will be restored the next time the database is  ** opened.  */  if( sqlite3StrICmp(zLeft,"synchronous")==0 ){    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    if( !zRight ){      returnSingleInt(pParse, "synchronous", pDb->safety_level-1);    }else{      if( !db->autoCommit ){        sqlite3ErrorMsg(pParse,             "Safety level may not be changed inside a transaction");      }else{        pDb->safety_level = getSafetyLevel(zRight)+1;      }    }  }else#endif /* SQLITE_OMIT_PAGER_PRAGMAS */#ifndef SQLITE_OMIT_FLAG_PRAGMAS  if( flagPragma(pParse, zLeft, zRight) ){    /* The flagPragma() subroutine also generates any necessary code    ** there is nothing more to do here */  }else#endif /* SQLITE_OMIT_FLAG_PRAGMAS */#ifndef SQLITE_OMIT_SCHEMA_PRAGMAS  /*  **   PRAGMA table_info(<table>)  **  ** Return a single row for each column of the named table. The columns of  ** the returned data set are:  **  ** cid:        Column id (numbered from left to right, starting at 0)  ** name:       Column name  ** type:       Column declaration type.  ** notnull:    True if 'NOT NULL' is part of column declaration  ** dflt_value: The default value for the column, if any.  */  if( sqlite3StrICmp(zLeft, "table_info")==0 && zRight ){    Table *pTab;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pTab = sqlite3FindTable(db, zRight, zDb);    if( pTab ){      int i;      int nHidden = 0;      Column *pCol;      sqlite3VdbeSetNumCols(v, 6);      pParse->nMem = 6;      sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", SQLITE_STATIC);      sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);      sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", SQLITE_STATIC);      sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", SQLITE_STATIC);      sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", SQLITE_STATIC);      sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", SQLITE_STATIC);      sqlite3ViewGetColumnNames(pParse, pTab);      for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){        const Token *pDflt;        if( IsHiddenColumn(pCol) ){          nHidden++;          continue;        }        sqlite3VdbeAddOp2(v, OP_Integer, i-nHidden, 1);        sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pCol->zName, 0);        sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,           pCol->zType ? pCol->zType : "", 0);        sqlite3VdbeAddOp2(v, OP_Integer, (pCol->notNull ? 1 : 0), 4);        if( pCol->pDflt ){          pDflt = &pCol->pDflt->span;          assert( pDflt->z );          sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, (char*)pDflt->z, pDflt->n);        }else{          sqlite3VdbeAddOp2(v, OP_Null, 0, 5);        }        sqlite3VdbeAddOp2(v, OP_Integer, pCol->isPrimKey, 6);        sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6);      }    }  }else  if( sqlite3StrICmp(zLeft, "index_info")==0 && zRight ){    Index *pIdx;    Table *pTab;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pIdx = sqlite3FindIndex(db, zRight, zDb);    if( pIdx ){      int i;      pTab = pIdx->pTable;      sqlite3VdbeSetNumCols(v, 3);      pParse->nMem = 3;      sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC);      sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC);      sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC);      for(i=0; i<pIdx->nColumn; i++){        int cnum = pIdx->aiColumn[i];        sqlite3VdbeAddOp2(v, OP_Integer, i, 1);        sqlite3VdbeAddOp2(v, OP_Integer, cnum, 2);        assert( pTab->nCol>cnum );        sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0);        sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);      }    }  }else  if( sqlite3StrICmp(zLeft, "index_list")==0 && zRight ){    Index *pIdx;    Table *pTab;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pTab = sqlite3FindTable(db, zRight, zDb);    if( pTab ){      v = sqlite3GetVdbe(pParse);      pIdx = pTab->pIndex;      if( pIdx ){        int i = 0;         sqlite3VdbeSetNumCols(v, 3);        pParse->nMem = 3;        sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", SQLITE_STATIC);        while(pIdx){          sqlite3VdbeAddOp2(v, OP_Integer, i, 1);          sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0);          sqlite3VdbeAddOp2(v, OP_Integer, pIdx->onError!=OE_None, 3);          sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);          ++i;          pIdx = pIdx->pNext;        }      }    }  }else  if( sqlite3StrICmp(zLeft, "database_list")==0 ){    int i;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    sqlite3VdbeSetNumCols(v, 3);    pParse->nMem = 3;    sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);    sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);    sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", SQLITE_STATIC);    for(i=0; i<db->nDb; i++){      if( db->aDb[i].pBt==0 ) continue;      assert( db->aDb[i].zName!=0 );      sqlite3VdbeAddOp2(v, OP_Integer, i, 1);      sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, db->aDb[i].zName, 0);      sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,           sqlite3BtreeGetFilename(db->aDb[i].pBt), 0);      sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);    }  }else  if( sqlite3StrICmp(zLeft, "collation_list")==0 ){    int i = 0;    HashElem *p;    sqlite3VdbeSetNumCols(v, 2);    pParse->nMem = 2;    sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);    sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);    for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){      CollSeq *pColl = (CollSeq *)sqliteHashData(p);      sqlite3VdbeAddOp2(v, OP_Integer, i++, 1);      sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pColl->zName, 0);      sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2);    }  }else#endif /* SQLITE_OMIT_SCHEMA_PRAGMAS */#ifndef SQLITE_OMIT_FOREIGN_KEY  if( sqlite3StrICmp(zLeft, "foreign_key_list")==0 && zRight ){    FKey *pFK;    Table *pTab;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pTab = sqlite3FindTable(db, zRight, zDb);    if( pTab ){      v = sqlite3GetVdbe(pParse);      pFK = pTab->pFKey;      if( pFK ){        int i = 0;         sqlite3VdbeSetNumCols(v, 8);        pParse->nMem = 8;        sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "on_update", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 6, COLNAME_NAME, "on_delete", SQLITE_STATIC);        sqlite3VdbeSetColName(v, 7, COLNAME_NAME, "match", SQLITE_STATIC);        while(pFK){          int j;          for(j=0; j<pFK->nCol; j++){            char *zCol = pFK->aCol[j].zCol;            char *zOnUpdate = (char *)actionName(pFK->updateConf);            char *zOnDelete = (char *)actionName(pFK->deleteConf);            sqlite3VdbeAddOp2(v, OP_Integer, i, 1);            sqlite3VdbeAddOp2(v, OP_Integer, j, 2);            sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0);            sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0,                              pTab->aCol[pFK->aCol[j].iFrom].zName, 0);            sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0);            sqlite3VdbeAddOp4(v, OP_String8, 0, 6, 0, zOnUpdate, 0);            sqlite3VdbeAddOp4(v, OP_String8, 0, 7, 0, zOnDelete, 0);            sqlite3VdbeAddOp4(v, OP_String8, 0, 8, 0, "NONE", 0);            sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8);          }          ++i;          pFK = pFK->pNextFrom;        }      }    }  }else#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */#ifndef NDEBUG  if( sqlite3StrICmp(zLeft, "parser_trace")==0 ){    if( zRight ){      if( getBoolean(zRight) ){        sqlite3ParserTrace(stderr, "parser: ");      }else{        sqlite3ParserTrace(0, 0);      }    }  }else#endif  /* Reinstall the LIKE and GLOB functions.  The variant of LIKE  ** used will be case sensitive or not depending on the RHS.  */  if( sqlite3StrICmp(zLeft, "case_sensitive_like")==0 ){    if( zRight ){      sqlite3RegisterLikeFunctions(db, getBoolean(zRight));    }  }else#ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX# define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100#endif#ifndef SQLITE_OMIT_INTEGRITY_CHECK  /* Pragma "quick_check" is an experimental reduced version of   ** integrity_check designed to detect most database corruption  ** without most of the overhead of a full integrity-check.  */  if( sqlite3StrICmp(zLeft, "integrity_check")==0   || sqlite3StrICmp(zLeft, "quick_check")==0   ){    int i, j, addr, mxErr;    /* Code that appears at the end of the integrity check.  If no error    ** messages have been generated, output OK.  Otherwise output the    ** error message    */    static const VdbeOpList endCode[] = {      { OP_AddImm,      1, 0,        0},    /* 0 */      { OP_IfNeg,       1, 0,        0},    /* 1 */      { OP_String8,     0, 3,        0},    /* 2 */      { OP_ResultRow,   3, 1,        0},    };    int isQuick = (zLeft[0]=='q');    /* Initialize the VDBE program */    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pParse->nMem = 6;    sqlite3VdbeSetNumCols(v, 1);    sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", SQLITE_STATIC);    /* Set the maximum error count */    mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;    if( zRight ){      mxErr = atoi(zRight);      if( mxErr<=0 ){        mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;      }    }    sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1);  /* reg[1] holds errors left */    /* Do an integrity check on each database file */    for(i=0; i<db->nDb; i++){      HashElem *x;      Hash *pTbls;      int cnt = 0;      if( OMIT_TEMPDB && i==1 ) continue;      sqlite3CodeVerifySchema(pParse, i);      addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */      sqlite3VdbeAddOp2(v, OP_Halt, 0, 0);      sqlite3VdbeJumpHere(v, addr);      /* Do an integrity check of the B-Tree      **      ** Begin by filling registers 2, 3, ... with the root pages numbers      ** for all tables and indices in the database.      */      pTbls = &db->aDb[i].pSchema->tblHash;      for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){        Table *pTab = sqliteHashData(x);        Index *pIdx;        sqlite3VdbeAddOp2(v, OP_Integer, pTab->tnum, 2+cnt);        cnt++;        for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){

⌨️ 快捷键说明

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