基于json数据格式实现的简单数据库——jsonDB
已在github上建立项目:https://github.com/ThinkerCodeChina/jsonDB
/**
+-----------------------------------------
* jsonDB 基于json数据格式构建的数据模型
+-----------------------------------------
* @description 对json数据检索,删除,查询和更新
* @author 戚银(web程序员) thinkercode@sina.com
* @date 2014年6月28日
* @version 0.1
* @blog http://blog.csdn.net/thinkercode/
+-----------------------------------------
* 简单介绍:
* jsonDB是js的一个类库,是基于json数据格式构建的数据
* 模型实现对json数据增删改查。 jsonDB的构建源自于HTML5
* 本地存储的一个应用需求,能够通过sql对json数据进行增
* 删改查,同一时候该类库提供强大的where检索条件,数据排序,
* limit查询条件限制等数据库基本功能。 通过jsonDB能够轻
* 松维护一个库/表或多个库/表。而无需额外实现json的数据
* 的维护等,在该类库完好以后为简化sql操作,基于jsonDB核
* 心模块扩展了连贯操作模型,简化对jsonDB的操作以及sql语
* 句出错的概率。
+-----------------------------------------
* 当前版本号的不足:
* 1.无法支持查询字段运算
* 2.不支持对没有选取的查询字段排序
* 3.仅仅支持单个字段排序,无法进行组合排序操作
* 4.update、delete语句不支持order by子句。导致limit子句功能弱化
* 5.编写where条件是必须使用()包括where条件
* 6.无法选取深层次的字段作为返回字段
* 7.没有错误或异常解决方式
* 8.不支持外部扩展
+-----------------------------------------
* jsonDB的使用:
* jsonDB会提供一个具体的使用手冊,当中包括大量演示样例
* jsonDB还有非常多能够使用的技巧并没有一一包括在手冊中
* 期望强大的网友一起挖掘jsonDB的潜在使用技巧。并分享给大家
* 假设使用中发现问题能够随时发送邮件,或者通过博客留言等方式一起探讨
* 同一时候鉴于自己实力有限,期望发动网友一起扩展jsonDB。
* 能在未来前端应用中奉献一份力量
+-----------------------------------------
*/
(function(window,undefined){
_jsonDB = window.jsonDB,
_history = null,
DBCore = {},
Database = {},
DBExpand = {}; /**
* [jsonDB 初始化模型。支持定义本地数据库和数据表]
* @param mixed data 数据
* @param string dbName 数据库名字
* @return jsonDB
*/
var jsonDB = function(data,dbName){ //创建数据库或者数据表
if(data){
dbName = dbName || 'json_db';
eval('Database.'+ dbName +'= data');
} return jsonDB.fn.init();
} jsonDB.fn = jsonDB.prototype = {
//初始化插件
init : function (alias){
if(alias){
_history = window[alias];
window[alias] = jsonDB();
}
return this;
}, query : function(sql){
var type = sql.match(/^(\w+)/);
switch(type[0]){
case 'select' :
case 'delete' :
case 'update' :
return eval('DBCore.fn.'+ type[0] +'(sql+" ")');
break;
default :
return false;
break;
}
}, insert : function(data,dbName){
if(data){
dbName = dbName || 'json_db';
eval('Database.'+ dbName +'.push(data)');
}
return this;
}, findAll : function(dbName){
if(dbName){
return eval('Database.'+ dbName);
}
return Database;
}
}; /**
* [DBExpand 数据库核心功能扩展]
*/
DBExpand = DBExpand.prototype = {
sqlParam : {
fields : '*',
table : 'json_db',
where : null,
order : null,
limit : null,
}, add : function(data){
return this.insert(data,this.sqlParam.table);
}, select : function(){
var sql = 'select '+this.sqlParam.fields+' from '+this.sqlParam.table;
if(this.sqlParam.where){
sql += ' where '+this.sqlParam.where;
}
if(this.sqlParam.order){
sql += ' order by '+this.sqlParam.order;
}
if(this.sqlParam.limit){
sql += ' limit '+this.sqlParam.limit;
} this.clear();
return this.query(sql);
}, update : function(data){
if(data.length<1){
return false;
} var sql = 'update '+this.sqlParam.table+' set '+data;
if(this.sqlParam.where){
sql += ' where '+this.sqlParam.where;
}
if(this.sqlParam.limit){
sql += ' limit '+this.sqlParam.limit;
}
this.clear();
return this.query(sql);
}, delete : function(){
if(this.sqlParam.where.length<1){
return false;
} var sql = 'delete from '+this.sqlParam.table;
if(this.sqlParam.where){
sql += ' where '+this.sqlParam.where;
}
if(this.sqlParam.limit){
sql += ' limit '+this.sqlParam.limit;
}
this.clear();
return this.query(sql);
}, drop : function(dbName){
//创建数据库或者数据表
if(data){
dbName = dbName || 'json_db';
eval('Database.'+ dbName +'= null');
}
return this;
}, field : function(fields){
if(typeof fields == 'object'){
this.sqlParam.fields = fields.join(',');
}else{
this.sqlParam.fields = fields;
}
return this;
}, table : function(table){
this.sqlParam.table = table;
return this;
}, where : function(where){
this.sqlParam.where = '('+where+')';
return this;
}, order : function(order){
this.sqlParam.order = order;
return this;
}, limit : function(limit){
this.sqlParam.limit = limit;
return this;
}, clear : function(){
this.sqlParam.fields = '*';
this.sqlParam.where = null;
this.sqlParam.order = null;
this.sqlParam.limit = null;
}
} /**
* [DBCore 数据库核心]
*/
DBCore.fn = DBCore.prototype = {
SqlRegExp : {
fields: '([a-z0-9_\\,\\.\\s\\*]*?\\s+)',
from : '(from\\s+([a-z0-9_\\.]+)\\s*)?',
where : '(?:where\\s+(\\(.*\\))\\s*)? ',
order : '(?:order\\s+by\\s+([a-z0-9_\\,\\.]+))? \\s+(asc|desc|ascnum|descnum)?\\s*',
limit : '(?:limit\\s+([0-9\\,]+))?',
set : '(set\\s+(.*?)\\s+)',
table : '(([a-z0-9_\\.]*?)\\s*)?',
}, select : function(sql){
var params = {fields:["*"], from:"json_db", where:"", orderby:[], order: "asc", limit:[]},
SqlRegExp = this.SqlRegExp,
reg = '^(select)\\s+'+SqlRegExp.fields + SqlRegExp.from + SqlRegExp.where + SqlRegExp.order + SqlRegExp.limit,
sqlReg = new RegExp(reg,'i'),
sqlFields = sql.match(sqlReg),
options = {
fields: sqlFields[2].replace(' ','').split(','),
from: (sqlFields[4] == undefined) ? 'json_db' : sqlFields[4],
where: (sqlFields[5] == undefined) ? "true" : sqlFields[5].replace(/([^\>\<\!\=])=([^\>\<\!\=])/gi,'$1 == $2').replace(/\sand\s/gi,' && ').replace(/\sor\s/gi,' || ').replace(/`/gi,''),
orderby: (sqlFields[6] == undefined) ? []:sqlFields[6].replace(' ','').split(','),
order: (sqlFields[7] == undefined) ? "asc" : sqlFields[7],
limit: (sqlFields[8] == undefined) ? [] : sqlFields[8].replace(' ','').split(',')
}; for(i in options){
params[i] = options[i];
} var result = [];
result = this.filter(params,function(data){
if(options.fields.length == 0 || options.fields[0] == "*"){
return data;
} var result = {};
for(var i in options.fields){
result[options.fields[i]] = data[options.fields[i]];
}
return result;
});
result = this.orderBy(result,options);
result = this.limit(result,options);
return result;
}, update : function(sql){
var params = {from:"json_db", where:"", limit:[], set:[]},
SqlRegExp = this.SqlRegExp,
reg = '^(update)\\s+'+ SqlRegExp.table + SqlRegExp.set + SqlRegExp.where + SqlRegExp.limit,
sqlReg = new RegExp(reg,'i'),
sqlFields = sql.match(sqlReg),
options = {
from: (sqlFields[3] == undefined) ? 'json_db' : sqlFields[3],
set: (sqlFields[5] == undefined) ? [] : sqlFields[5].replace(' ','').split(','),
where: (sqlFields[6] == undefined) ? "true" : sqlFields[6].replace(/([^\>\<\!\=])=([^\>\<\!\=])/gi,'$1 == $2').replace(/\sand\s/gi,' && ').replace(/\sor\s/gi,' || ').replace(/`/gi,''),
limit: (sqlFields[7] == undefined) ? [] : sqlFields[7].replace(' ','').split(',')
}; for(i in options){
params[i] = options[i];
}
var jsonData = eval('Database.' + options.from),
tally = 0,
extent = this.extent(params),
setLen = options.set.length,
affected_rows = 0; if(setLen<1){
return false;
} options.where = options.where || "true";
for(var i in jsonData){
with(jsonData[i]){
if(eval(options.where)){
if(affected_rows >= extent.start && tally < extent.stop){
for(var j=0;j<setLen;++j){
eval(options.set[j]);
}
++tally;
}else if(tally == extent.stop){
return tally;
}
++affected_rows;
}
}
}
return tally;
}, delete : function(sql){
var params = {from:"json_db", where:"", limit:[]},
SqlRegExp = this.SqlRegExp,
reg = '^(delete)\\s+'+ SqlRegExp.from + SqlRegExp.where + SqlRegExp.limit,
sqlReg = new RegExp(reg,'i'),
sqlFields = sql.match(sqlReg),
options = {
from: (sqlFields[3] == undefined) ? 'json_db' : sqlFields[3],
where: (sqlFields[4] == undefined) ? "true" : sqlFields[4].replace(/([^\>\<\!\=])=([^\>\<\!\=])/gi,'$1 == $2').replace(/\sand\s/gi,' && ').replace(/\sor\s/gi,' || ').replace(/`/gi,''),
limit: (sqlFields[5] == undefined) ? [] : sqlFields[5].replace(' ','').split(',')
}; for(i in options){
params[i] = options[i];
} var jsonData = eval('Database.' + options.from + '.concat()'),
tally = 0,
extent = this.extent(params),
affected_rows = 0; options.where = options.where || "true";
for(var i in jsonData){
with(jsonData[i]){
if(eval(options.where)){
if(affected_rows >= extent.start && tally < extent.stop){
eval('Database.'+options.from+'.splice(i-tally,1)');
++tally;
}else if(tally == extent.stop){
return tally;
}
++affected_rows;
}
}
}
return tally;
}, filter : function(options, callback){
var jsonData = eval('Database.' + options.from),
result = [],
index = 0; options.where = options.where || "true";
for(var i in jsonData){
with(jsonData[i]){
if(eval(options.where)){
if(callback){
result[index++] = callback(jsonData[i]);
}else{
result[index++] = jsonData[i];
}
}
}
} return result;
}, orderBy : function(result,options){
if(options.orderby.length == 0){
return result;
} result.sort(function(a,b){
switch(options.order.toLowerCase()){
case "desc": return (eval('a.'+ options.orderby[0] +' < b.'+ options.orderby[0]))? 1:-1;
case "asc": return (eval('a.'+ options.orderby[0] +' > b.'+ options.orderby[0]))? 1:-1;
case "descnum": return (eval('a.'+ options.orderby[0] +' - b.'+ options.orderby[0]));
case "ascnum": return (eval('b.'+ options.orderby[0] +' - a.'+ options.orderby[0]));
}
}); return result;
}, limit : function(result,options){
switch(options.limit.length){
case 0:
return result;
case 1:
return result.splice(0,options.limit[0]);
case 2:
return result.splice(options.limit[0],options.limit[1]);
}
}, extent : function(options){
switch(options.limit.length){
case 0:
return {start:0, stop:9e+99};
case 1:
return {start:0, stop:options.limit[0]};
case 2:
return {start:options.limit[0], stop:options.limit[1]};
}
}
} window.jsonDB = jsonDB; //追加扩展功能
jsonDB.fn = jsonDB.prototype =extend(jsonDB.fn,DBExpand); //合并对象方法
function extend(){
var paramsLen = arguments.length;
if(paramsLen<1){
return false;
} var target = arguments[0];
for(var i=1;i<paramsLen;++i){
for(var j in arguments[i]){
target[j] = arguments[i][j];
}
} return target;
}
})(window);
源代码与演示样例下载:jsonDB.rar
基于json数据格式实现的简单数据库——jsonDB的更多相关文章
- Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现)
Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现) 一丶CSRF相关的装饰器 from django.utils.decorators import m ...
- jQuery EasyUI:根据数据库内容生成适合于easyui-tree的JSON数据格式
1,jQuery EasyUI中easyui-tree特定的JSON数据格式 [ {"id":1,"text":"某公司","ch ...
- $Django ajax简介 ajax简单数据交互,上传文件(form-data格式数据),Json数据格式交互
一.ajax 1 什么是ajax:异步的JavaScript和xml,跟后台交互,都用json 2 ajax干啥用的?前后端做数据交互: 3 之前学的跟后台做交互的方式: -第一种:在浏览器 ...
- json数据格式的简单案例
json数据是一种文本字符串,它是javascript的原生数据格式,在数据需要多次重复使用时,json数据是ajax请求的首先.(注:ajax返回的数据格式支持三种分别为:文本格式,json.和xm ...
- Jquery 实现json复杂查询等操作(jsonDB)
一.jsonDB 下载地址:https://github.com/ThinkerCodeChina/jsonDB jsonDB是js的一个类库,实现使用SQL语句对json数据增删改查.jsonDB的 ...
- 基于json的jquery地区联动探索
贴一个基于jquery联动的代码,相信这样的代码有一大把,就当是jquery的练手吧, 写这个东西的初衷是来之于新浪微博,在新浪微博帐号设置里面有个地区的选项,使用js写的,想把它的代码给截获下来,可 ...
- VS快速生成JSON数据格式对应的实体
有固定好的Json数据格式,你还在手动敲对应的实体吗?有点low了!步入正题,这是一个json字符串,先去验证JSON数据格式(http://www.bejson.com/)如下: { & ...
- 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...
- JSON 数据格式
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易 ...
随机推荐
- NOIP2016 DAY1 T1 玩具谜题
题目描述 小南有一套可爱的玩具小人,它们各有不同的职业. 有一天,这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时 singer 告诉小 ...
- js中的变量提升和函数提升
从上周开始,我所在的学习小组正式开始了angular的学习,angular是全面支持es6的,所以语法上和以前的angular有了很大的不同,比如变量声明时就抛弃了var,而选择了let和const: ...
- [剑指offer] 1. 二维数组中的查找 (数组)
注意是有序数组!! 思路: 1.利用二维数组由上到下,由左到右递增的规律,选取右上角或者左下角的元素a[m][n]与target进行比较, 当target小于元素a[m][n]时,那么target必定 ...
- WinServer-IIS-SEO优化
来自为知笔记(Wiz)
- 将maven中央仓库不存在的jar包添加到本地仓库
这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...
- java io包File类
1.java io包File类, Java.io.File(File用于管理文件或目录: 所属套件:java.io)1)File对象,你只需在代码层次创建File对象,而不必关心计算机上真正是否存在对 ...
- HDU 4329 Contest 3
果然换个编译器就过了.总的来说,不难,不过就是处理一些空格.学习了一个新的类 istringstream可以按空格划分.然后,那条式子要理解. 式子的意义是: 找到一个串,该串在query中是第几个找 ...
- leetcode第一刷_Subsets II
要求子集,有很现成的方法.N个数.子集的个数是2^N.每一个元素都有在集合中和不在集合中两种状态,这些状态用[0,pow(2,N)]中每一个数来穷举,假设这个数中的第i位为1,说明当前集合中包括源数组 ...
- Android Parcelable vs Serializable
序列化 在Android中.对象在实现序列化之前是无法直接作为Intent參数在Activity之间传递的. Android中对象序列化能够通过实现Serializable接口或者实现Parcelab ...
- CoreData的介绍和使用
一.CoreData是什么? CoreData是iOS SDK里的一个很强大的框架,允许程序员以面向对象的方式存储和管理数据.使用CoreData框架,程序员可以轻松有效地通过面向对象的接口管理数据 ...