文档章节

node-webkit中数据库升级机制

tinderfang
 tinderfang
发布于 2014/12/21 12:02
字数 571
阅读 493
收藏 4

写了个模块,本模块中应用了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();


© 著作权归作者所有

tinderfang
粉丝 4
博文 12
码字总数 4847
作品 0
深圳
架构师
私信 提问
node-webkit v0.7.2 发布

node-webkit 是一个基于 Chromium 和 Node.js 的 Web 运行环境,可让你直接在 DOM 中调用 Node.js 模块,并可使用任何现有的 Web 技术来编写本地应用。 下载地址: https://s3.amazonaws.com...

打杂程序猿
2013/08/27
2.5K
11
node-webkit v0.8.0 发布

node-webkit 是一个基于 Chromium 和 Node.js 的 Web 运行环境,可让你直接在 DOM 中调用 Node.js 模块,并可使用任何现有的 Web 技术来编写本地应用。 下载地址: https://s3.amazonaws.com...

打杂程序猿
2013/10/30
5.2K
16
用node-webkit 创建 osChina PC 客户端

7月 3 2013 导言 node-webkit 是一个很神奇的桌面客户端项目,正如这个项目的名字,这个项目是由node 和 webkit 构成,简单来说,就是你可以用HTML 5和 node 进行桌面客户端开发,而且客户端还是同...

打杂程序猿
2013/07/03
0
29
node-webkit:开发桌面+WEB混合型应用的神器

大漠穷秋 2014-01-31 bla...bla... 顾名思义,node-webkit就是nodejs+webkit。 这样做的好处显而易见,核心奥义在于,用nodejs来进行本地化调用,用webkit来解析和执行HTML+JS。 快速上手 下...

随影求是
2014/01/31
0
4
node-webkit 插件

@打杂程序猿 你好,想跟你请教个问题:node-webkit 如何支持类似于支付宝安全登陆一样的插件。不知道node-webkit的插件机制是怎样的?

young-轻人
2013/09/03
3K
6

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部