基于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成为理想的数据交换语言.易于人阅读和编写,同时也易 ...
随机推荐
- BZOJ 2402 陶陶的难题II (01分数规划+树剖+线段树+凸包+二分)
题目大意:略 一定范围内求最大值,考虑二分答案 设现在选择的答案是$mid$,$max \left \{ \frac{yi+qj}{xi+pj} \right \} \geq mid $ 展开可得,$ ...
- 转载:CentOS查看本机公网IP命令
icanhazip.com 使你在任何地方知道你的公网IP地址 icanhazip.com是一个网址,你在浏览器中输入这个网址,你就能得到你的公网IP地址了. 我在Linux下一般使用curl ica ...
- linux内存随笔
内存在电脑中使用广泛,比如内存条内存.显卡显存.cpu缓存.raid卡缓存等,缓存就是数据交换的缓冲区(称作cache),缓存往往都是RAM(断电文件丢失),他们的读写速率非常高,用来帮助硬件更快的响 ...
- Layui表格编辑【不依赖Layui的动态table加载】
依赖jquer,layui/css <td class="My_edit"></td> Jquery代码 //-----[Layui表格编辑(<td ...
- javascript try{}catch(e){}
<script language="javascript"> try { throw new Error(10,"asdasdasd") } ca ...
- 简单来说一下java中的泛型,ssh中dao层使用会简化代码量
原来仅仅是听老师说泛型特别好用,但是后来一直弄android用的泛型就比較少了.但是感觉它真的非常重要,于是花了一下午的时间写了个demo.好,老规矩.上代码: 首先,sysout是个工具,可是用着不 ...
- TRIZ系列-创新原理-34-抛弃和再生部件原理
抛弃和再生部件原理的详细描写叙述例如以下:1)物件的部件在完毕其功能,或者变得没用之后,就被扔掉(丢弃.溶解,挥发等),或者在工作过程已经改变.2)物体已经用掉的部件,应该在工作期间恢复: 对于抛弃原 ...
- Android使用有道翻译API实如今线翻译功能
在Android应用中,加入在线翻译的功能,这里调用的是有道翻译的API. 使用有道翻译API.首先要申请一个key,申请地址为:path=data-mode">有道翻译API申请地址 ...
- JAVA设计模式之【命令模式】
命令模式 为了降低耦合度,将请求的发送者和接收者解耦 发送请求的对象只需要哦知道如何发送请求,而不必知道如何完成请求 对请求排队 记录请求日志 支持撤销操作 核心在于引入命令类 角色 抽象命令类Com ...
- win32编程 画图
void cDefense::DrawAll() { HDC hDc = GetDC(m_hWnd);//获取客户区窗口,如果该值为NULL,GetDC则获整个屏幕的窗口. HDC dcMem = C ...