标签:
写了个模块,本模块中应用了sqllite3数据库,升级原理是检查数据库的version版本表中版本值,把版本值加一之后去读取对应的sql文件,执行sql语句,然后依次循环说取下一个文件直到完成。
本模块中所有sql文件放在/sql/文件夹下,如:contact_create.sql,contact_update_1.sql,contact_update_2.sql,等等,使用时执行 updateUserDB()方法就行。
var _=require("underscore");
var sqlite3 = require(‘sqlite3‘).verbose();
var fs = require(‘fs‘);
var async = require("async");
var path=require("path");
EnvironmentDAO = function(){
var DB={},dbNames=["contact","groups","message"];//for example
//初始化
var init = function(){
_.each(dbNames,function(name){
DB[name]=new sqlite3.Database(path.join("/main/db",name+‘.db‘), sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE)
});
};
init();
// 检查数据库是否为空
this.checkDB = function(db,callback){
db.get("SELECT count(*) as exist FROM sqlite_master WHERE type=‘table‘ AND name=‘version‘",function(err,result){
if(err){
console.error("checkDB error",err);
callback(null,false);
}else{
if(result.exist == 1){
callback(null,true);
}else{
callback(null,false);
}
}
});
};
// 通用初始化数据库
this.initDbCommon = function(db,dbName,callback){
var self=this;
var sql = fs.readFileSync(‘/sql/‘+dbName+"_create.sql", ‘utf8‘);
db.exec(sql,function(err,result){
if(err){
console.error("create DB error",dbName,err)
}
callback&&callback(err,result)
});
};
// 通用获取数据库版本
this.getDbVersionCommon = function(db,callback){
db.get("SELECT version from version where key = ‘db_version‘",function(err,result){
if(err){
console.error("getDbVersion err",err);
}
callback&&callback(err,result);
})
};
// 通用升级数据库
this.updateDbCommon = function(db,dbName,callback){
var self = this;
var doUpdate = function(cb){
self.getDbVersionCommon(db,function(err,dbv){
if(err||!dbv){
console.error("getDbVersion err ",dbName,dbv,err);
//没有表或表名错误时重新创建表--容错机制
if(err.code == "SQLITE_ERROR"){
self.initDbCommon(db,dbName,function(err){
if(!err){
self.updateDbCommon(db,dbName,function(err){
if(err){
console.error("second time Init and UPdate DB error",dbName,err);
}
cb(true);
});
}
})
}else{
//其它错误忽略
cb(false)
}
}else{
var v = dbv.version;
v++;
if(fs.existsSync(‘/sql/‘+dbName+"_update_"+v+‘.sql‘)){
var sql = fs.readFileSync(‘/sql/‘+dbName+"_update_"+v+‘.sql‘, ‘utf8‘);
db.exec(sql,function(err){
if(err){
console.error("updateDbCommon err:",dbName,sql,err);
cb(false);
}else{
cb(true);
}
});
}else{
cb(false);
}
}
});
}
doUpdate(function(tryAgain){
if(tryAgain){
doUpdate.apply(this,[arguments.callee]);
}else{
if(typeof callback =="function") callback();
}
});
};
// 升级所有用户数据库
this.updateUserDB=function(callback){
var self = this;
async.forEach(
dbNames,
function(dbname,cb){
self.checkDB(DB[dbname],function(err,isExist){
if(isExist){
self.updateDbCommon(DB[dbname],dbname,cb);
}else{
self.initDbCommon(DB[dbname],dbname,function(){
self.updateDbCommon(DB[dbname],dbname,cb);
})
}
})
},
function(err){
if(err){
logger.error("updateUserDB Error:",err);
}
if(typeof callback =="function") {
callback(err);
}
}
);
};
}
exports = module.exports = new EnvironmentDAO();
标签:
原文地址:http://my.oschina.net/u/265765/blog/358859