node-webkit中数据库升级机制

写了个模块,本模块中应用了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();
时间: 2024-08-14 12:05:27

node-webkit中数据库升级机制的相关文章

Android中数据库升级onUpgrade方法说明

Andoird的SQLiteOpenHelper类中有一个onUpgrade方法.帮助文档中只是说当数据库升级时该方法被触发.经过实践,解决了我一连串的疑问: 1. 帮助文档里说的“数据库升级”是指什么? 你开发了一个程序,当前是1.0版本.该程序用到了数据库.到1.1版本时,你在数据库的某个表中增加了一个字段.那么软件1.0版本用的数据库在软件1.1版本就要被升级了. 2. 数据库升级应该注意什么? 软件的1.0版本升级到1.1版本时,老的数据不能丢.那么在1.1版本的程序中就要有地方能够检测

Node.js中的模块机制

本文为读书笔记. 一.CommonJS的模块规范 Node与浏览器以及 W3C组织.CommonJS组织.ECMAScript之间的关系 Node借鉴CommonJS的Modules规范实现了一套模块系统,所以先来看看CommonJS的模块规范. CommonJS对模块的定义十分简单,主要分为模块引用.模块定义和模块标识3个部分. 1. 模块引用 模块引用的示例代码如下: var math = require('math'); 在CommonJS规范中,存在require()方法,这个方法接受模

web worker在WebKit中的实现机制

web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能.这是HTML5的一个标准:实现上讲,浏览器为wokrer启动了新的线程,从而实现了异步操作的功能; 下面是woker的一个简单例子,在html页面中,以worker.js为源文件,创建了名为"worker"的Worker对象,通过worker.postMessage()接口向worker线程发送消息: worker线程将JSON格式化传递的两个数据相加后,再通过postMessage()接口

Android中数据库升级

public class MySQLiteHelper extends SQLiteOpenHelper { public static final String <span style="font-family: Arial, Helvetica, sans-serif;">SQL_CREATE</span><span style="font-family: Arial, Helvetica, sans-serif;">= &q

【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93%E4%B8%8ENode-js%E7%9A%84%E5%BC%82%E6%AD%A5IO%E6%9C%BA%E5%88%B6/ 译者:xidui原文: http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html 译者前言 如

一劳永逸的数据库升级方案

数据库升级方案 一.面临的问题 在项目中数据库升级是经常遇到的事情,这个工作比较繁琐,特别是在线数据库升级需要十分小心,我们先来看一下通常面临的问题: 1.    表修改,包括增加了字段.修改了字段类型或者长度,更换了主键等.对于表的升级不能删除重建,需要单独修改,或者写脚本来升级. 2.    视图的修改,视图的修改比较简单,无非是增加了字段,取消了字段,不影响基础数据.视图的升级可以删除重建. 3.    存储过程的修改,存储过程的修改和视图一样,可以删除重建,二者都可以通过脚本来完成. 4

基于Oracle数据库锁机制,解决集群中的并发访问问题

1.需求 应用场景是这样的: 使用Oracle数据保存待办任务,使用状态字段区分任务是否已经被执行.多个Worker线程同时执行任务,执行成功或失败后,修改状态字段的值. 假设数据库表结构如下所示. create table Task( id varchar2(32), name varchar2(32), flag varchar2(1), worker varchar2(32) ); flag 可取的值包括:0-待办,1-已办,-1-失败待重试. 需要避免的问题: 多个Worker同时工作时

MySQL数据库InnoDB存储引擎中的锁机制

MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本

[转]在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

本文转自:https://www.cnblogs.com/kongxianghai/p/5582661.html Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持MySQL,.MariaDB.SQLite.PostgreSQL.Sql Server 数据库. 目前在Node.js中,Sequelize的关注度较高,用的也较多. 因为是基于promi