1. 程式人生 > >SQLite VACUUM命令分析

SQLite VACUUM命令分析

複製程式碼 int sqlite3RunVacuum(char**pzErrMsg, sqlite3 *db){
///////////////////////////////////第1步////////////////////////////////////////////////
zSql = sqlite3MPrintf("ATTACH '%q' AS vacuum_db;", zTemp);
  
//建立臨時資料庫vacuum_db  rc = execSql(db, zSql);
///////////////////////////////////第2步////////////////////////////////////////////////
//開始一個事務  rc = execSql(db, "BEGIN EXCLUSIVE;");
///////////////////////////////////第3步////////////////////////////////////////////////
//在vacuum_db中建立main資料庫的所有表,索引和檢視,並將main中的所有表,索引和檢視的資料插入
  
//到vacuum_db。即在vacuum_db建立main的鏡象。  rc 
= execExecSql(db, 
      
"SELECT 'CREATE TABLE vacuum_db.' || substr(sql,14,100000000) ""  FROM sqlite_master WHERE type='table' AND name!='sqlite_sequence'");
  
if( rc!=SQLITE_OK ) goto end_of_vacuum;
  rc 
= execExecSql(db, 
      
"SELECT 'CREATE INDEX vacuum_db.' || substr(sql,14,100000000)""  FROM sqlite_master WHERE sql LIKE 'CREATE INDEX %' 
");
  
if( rc!=SQLITE_OK ) goto end_of_vacuum;
  rc 
= execExecSql(db, 
      
"SELECT 'CREATE UNIQUE INDEX vacuum_db.' || substr(sql,21,100000000) ""  FROM sqlite_master WHERE sql LIKE 'CREATE UNIQUE INDEX %'");
  
if( rc!=SQLITE_OK ) goto end_of_vacuum;
  rc 
= execExecSql(db, 
      
"SELECT 'CREATE VIEW vacuum_db.' || substr(sql,13,100000000) 
""  FROM sqlite_master WHERE type='view'"
  );
rc 
= execExecSql(db, 
      
"SELECT 'INSERT INTO vacuum_db.' || quote(name) ""|| ' SELECT * FROM ' || quote(name) || ';'""FROM sqlite_master ""WHERE type = 'table' AND name!='sqlite_sequence';"
  );
///////////////////////////////////第4步////////////////////////////////////////////////
//將vacumm_db資料庫對應的資料檔案的資料拷貝到main資料庫對應的資料檔案,一個頁面一個頁面的拷貝rc = sqlite3BtreeCopyFile(pMain, pTemp);
///////////////////////////////////第5步////////////////////////////////////////////////
//提交事務    rc = sqlite3BtreeCommit(pTemp);
    
if( rc!=SQLITE_OK ) goto end_of_vacuum;
    rc 
= sqlite3BtreeCommit(pMain);
}
複製程式碼