SQLite VACUUM命令分析
阿新 • • 發佈:2019-01-06
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);
}
///////////////////////////////////第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
"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)
);
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);
}