已在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的更多相关文章

  1. Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现)

    Django---CSRF的装饰器,CSRF的流程,JSON数据格式,ajax技术(基于JQ实现) 一丶CSRF相关的装饰器 from django.utils.decorators import m ...

  2. jQuery EasyUI:根据数据库内容生成适合于easyui-tree的JSON数据格式

    1,jQuery EasyUI中easyui-tree特定的JSON数据格式 [ {"id":1,"text":"某公司","ch ...

  3. $Django ajax简介 ajax简单数据交互,上传文件(form-data格式数据),Json数据格式交互

    一.ajax  1 什么是ajax:异步的JavaScript和xml,跟后台交互,都用json  2 ajax干啥用的?前后端做数据交互:  3 之前学的跟后台做交互的方式:   -第一种:在浏览器 ...

  4. json数据格式的简单案例

    json数据是一种文本字符串,它是javascript的原生数据格式,在数据需要多次重复使用时,json数据是ajax请求的首先.(注:ajax返回的数据格式支持三种分别为:文本格式,json.和xm ...

  5. Jquery 实现json复杂查询等操作(jsonDB)

    一.jsonDB 下载地址:https://github.com/ThinkerCodeChina/jsonDB jsonDB是js的一个类库,实现使用SQL语句对json数据增删改查.jsonDB的 ...

  6. 基于json的jquery地区联动探索

    贴一个基于jquery联动的代码,相信这样的代码有一大把,就当是jquery的练手吧, 写这个东西的初衷是来之于新浪微博,在新浪微博帐号设置里面有个地区的选项,使用js写的,想把它的代码给截获下来,可 ...

  7. VS快速生成JSON数据格式对应的实体

          有固定好的Json数据格式,你还在手动敲对应的实体吗?有点low了!步入正题,这是一个json字符串,先去验证JSON数据格式(http://www.bejson.com/)如下: { & ...

  8. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

    作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...

  9. JSON 数据格式

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易 ...

随机推荐

  1. 聚类(Clustering)

    简介 相对于决策树.朴素贝叶斯.SVM等有监督学习,聚类算法属于无监督学习. 有监督学习通常根据数据集的标签进行分类,而无监督学习中,数据集并没有相应的标签,算法仅根据数据集进行划分. 由于具有出色的 ...

  2. 新手学python-Day2-变量和循环判断

    第二天作业: 初探三级菜单,凭现有知识,注意变量可以不声明,但要提前赋值! 此处shuru = '' 可以不写,因为第7行被赋值了,如果只调用shuru不赋值就会报错 shuru = '' sheng ...

  3. [luogu] P3089 [USACO13NOV]POGO的牛Pogo-Cow

    P3089 [USACO13NOV]POGO的牛Pogo-Cow 题目描述 In an ill-conceived attempt to enhance the mobility of his pri ...

  4. Vue框架Element UI教程-axios请求数据

    Element UI手册:https://cloud.tencent.com/developer/doc/1270 中文文档:http://element-cn.eleme.io/#/zh-CN gi ...

  5. webpack基础知识点

    webpack 是一个现代的 JavaScript 应用程序的模块打包器(module bundler). 入口(Entry) webpack 将创建所有应用程序的依赖关系图表(dependency ...

  6. input输入框获取焦点是背景黄色去除

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset !important;}

  7. HDU——T 2119 Matrix

    http://acm.hdu.edu.cn/showproblem.php?pid=2119 Time Limit: 5000/1000 MS (Java/Others)    Memory Limi ...

  8. POJ 2906 数学期望

    开始时直接设了一个状态,dp[i][j]为发现i种bug,j个系统有bug的期望天数.但很错误,没能转移下去.... 看了题解,设状态dp[i][j]为已发现i种bug,j个系统有bug,到完成目标状 ...

  9. 排序(3)---------冒泡排序(C语言实现)

    说到冒泡排序,大一的时候第一次学习这个排序算法,可能大家不知道,"冒泡"在我说的方言里面是吹牛逼的意思. 所以就认为这个排序算法特吹牛逼有木有. 相信大家对全部的排序算法,这个想必 ...

  10. Oracle 12c agent install for windows

    在Oracle EM12c 中部署agent的方法分两种,一种是通过EM12c的控制台通过ssh直接把agent"推送"安装到被管理端.这样的方法在linux平台的OMS和被管理端 ...