SQLite---VACUUM命令分析
该文章转载自:http://www.cnblogs.com/hustcat/archive/2009/09/16/1568065.html
VACUUM命令是SQLite的一个扩展功能,模仿PostgreSQL中的相同命令而来。若调用VACUUM带一个表名或索引名, 则将整理该表或索引。在SQLite 1.0中,VACUUM命令调用 gdbm_reorganize()整理后端数据库文件。 ///////////////////////////////// //第1步 //////////////////////////////////////////////// zSql = sqlite3MPrintf( " ATTACH'%q'ASvacuum_db; " ,zTemp); // 创建临时数据库vacuum_db rc = execSql(db,zSql); //第2步 //////////////////////////////////////////////// 开始一个事务 BEGINEXCLUSIVE; " ); //第3步 在vacuum_db中建立main数据库的所有表,索引和视图,并将main中的所有表,索引和视图的数据插入 到vacuum_db。即在vacuum_db建立main的镜象。 rc = execExecSql(db, SELECT'CREATETABLEvacuum_db.'||substr(sql,14,100000000) " FROMsqlite_masterWHEREtype='table'ANDname!='sqlite_sequence' " ); if (rc != SQLITE_OK) goto end_of_vacuum; rc = execExecSql(db,0)">SELECT'CREATEINDEXvacuum_db.'||substr(sql,0)">FROMsqlite_masterWHEREsqlLIKE'CREATEINDEX%' SELECT'CREATEUNIQUEINDEXvacuum_db.'||substr(sql,21,0)">FROMsqlite_masterWHEREsqlLIKE'CREATEUNIQUEINDEX%' SELECT'CREATEVIEWvacuum_db.'||substr(sql,13,0)">FROMsqlite_masterWHEREtype='view' " ); rc = execExecSql(db,0)">SELECT'INSERTINTOvacuum_db.'||quote(name) ||'SELECT*FROM'||quote(name)||';' FROMsqlite_master WHEREtype='table'ANDname!='sqlite_sequence'; " ); //第4步 //////////////////////////////////////////////// 将vacumm_db数据库对应的数据文件的数据拷贝到main数据库对应的数据文件,一个页面一个页面的拷贝 rc = sqlite3BtreeCopyFile(pMain,pTemp); //第5步 提交事务 rc = sqlite3BtreeCommit(pTemp); goto end_of_vacuum; rc = sqlite3BtreeCommit(pMain); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |