基于json数据格式实现的简单数据库——jsonDB

news/2024/10/5 12:35:41/文章来源:https://www.cnblogs.com/firespeed/p/18447759
//基于json数据格式实现的简单数据库——jsonDB
//https://www.cnblogs.com/cynchanpin/p/7068151.html
//已在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);

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808432.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WMCTF 2024 wp

WEBPasswdStealer前言本来题目叫PasswdStealer的:)考点就是CVE-2024-21733在SpringBoot场景下的利用。漏洞基本原理参考 https://mp.weixin.qq.com/s?__biz=Mzg2MDY2ODc5MA==&mid=2247484002&idx=1&sn=7936818b93f2d9a656d8ed48843272c0不再赘述。SpringBoot场景…

Z-library数字图书馆镜像地址及客户端/app(持续更新)

Z-library数字图书馆介绍 Z-library,被誉为全球范围内最为庞大的数字图书馆之一,其藏书量之丰富令人叹为观止,总计囊括了超过9,826,996册电子书及84,837,646篇学术期刊文章。这座庞大的知识宝库覆盖了从经典文学巨著到前沿理工学科,从人文艺术瑰宝到专业学术论文的广泛领域…

T3 玄泡面求调

觉得模拟赛题解还是单独放出来比较好。 A.挤压 好像不难?二进制表示下的平方展开没推出来,不然就成简单题了。 首先我们需要知道对于一个数 \(x\),把它拆成 29 位的二进制形式后,用 \(s_i\) 表示二进制下第 \(i\) 位上的数,那么其实这个数就是 \((\overline{s_{29} s_{28}…

Nuxt.js 应用中的 app:mounted 钩子详解

title: Nuxt.js 应用中的 app:mounted 钩子详解 date: 2024/10/5 updated: 2024/10/5 author: cmdragon excerpt: app:mounted 钩子在 Vue 应用的生命周期中扮演着重要角色,提供了在组件被挂载后的执行时机。通过合理利用这个钩子,我们能够提高组件的交互性、用户体验以及…

有奖求调!!!

T3 求调,12:00 之前调成功悬一袋红烧牛肉面 #include<bits/stdc++.h> #define Type int #define qr(x) x=read() typedef long long ll; using namespace std;inline Type read(){char c=getchar(); Type x=0;while(!isdigit(c))c=getchar();while(isdigit(c))x=(x<…

c盘清理指南

1.清理缓存文件 快捷键Win+R输入%temp%2.磁盘清理直接win键+搜索磁盘清理3.休眠文件关闭关机时下次开机powercfg -h off 有需要休眠文件的时候再powercfg -h on 4.临时文件 设置→系统→存储→临时文件,删除! 5.把ubuntu从c移到d出现0x80073cf6错误代码 https://www.yundongf…

轻松找到并查看织梦CMS的数据库配置文件,从而获取数据库连接信息

使用FTP工具连接到服务器。 导航到 /var/www/html/include 目录。 打开 config.inc.php 文件。使用SSH连接到服务器。 切换到相应目录:bashcd /var/www/html/include使用文本编辑器打开文件:bashvi config.inc.php通过以上步骤,你可以轻松找到并查看织梦CMS的数据库配置文件…

使用ValueConverters扩展实现枚举控制页面的显示

1、ValueConverters 本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能,方便快速。像BoolToValueConverterBase、V…

【Shiro】3.Springboot实现缓存

最近已经快速入门了Shiro。对于登录、授权、认证等方法,每次都是从数据库直接查询。如果登录的人员过多,对数据库来说,是一项压力。如何减轻数据库的压力。EhCache 实现缓存 集成 Redis 实现 Shiro 缓存(推荐使用)在此之前,我们已经简单学会EhCache 和Reids的使用。 EhCa…

织梦如何数据库备份,织梦cms网站数据怎么备份与还原

织梦CMS(DedeCMS)的数据库备份和还原是非常重要的操作,可以帮助你在出现问题时快速恢复数据。下面详细介绍如何进行织梦CMS的数据库备份和还原。 一、数据库备份 1. 使用 phpMyAdmin 备份数据库登录 phpMyAdmin登录到你的网站控制面板(如 cPanel)。 找到并打开 phpMyAdmin…

【软考】3 校验码

校验码 码距概念:任意进制的两个码值之间的最小二进制位数称为校验码的码距 例如:二进制1bit位,从0到1,则码距是1,二进制2bit位 从 00 到 11 一共4个码字,但码距还是为1 可以设置 性别男为 00 女为 11两个合法码字,则该两个合法码字的最小码距为2 (间隔 01 和 10 两个)…

IOU指标

IOU:全称 intersection over union 交并比,两个区域真实框和预测框之间的交集比他们之间的总面积-交集的 IOU指标:通常用于评估计算机视觉任务中的模型性能,特别是目标检测和图像分割。一个较高的IoU值意味着模型的定位和分割精度更好。