AvenirSQL 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
AvenirSQL 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
AvenirSQL 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
AvenirSQL 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
AvenirSQL 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !
授权协议 GPL-2.0
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
提 交 者 OSCHINA编辑部
适用人群 未知
收录时间 2021-02-07

软件简介

AvenirSQL是一个用Node.js设计的数据库,支持常见的SQL语句。

技术特点

  • 1.支持增删改查
  • 2.精确查找支持哈希索引,范围查找支持B+树索引
  • 3.智能缓存,提升QPS性能
  • 4.提供用户管理,cli程序(curl.js)
  • 5.实现串行锁功能
  • 6.灵活的策略配置

具体技术实现

  • 1.统一的底层错误处理函数,避免函数重复传递参数。
async response(type, client) {
        let res = null;
        if (typeof type == 'string') {
            res = getError(type);
            if (!res) {
                res = unknown;
            }
        } else {
            let code = type.code;
            let data = type.data;
            res = getError(code);
            if (!res) {
                res = unknown;
            }
            res.data = data;
        }
        client.write(JSON.stringify(res));
        //如果没有配置默认短连接

        if( ini.db.keepAlive != true) {
            toLog("主动踢掉客户端的连接");
            client.end();
        }
    }

2.数据库结构

数据库:文件夹名

表:数据文件、哈希索引文件、B+树索引文件(聚合索引)

  • 数据文件:

    第一行存放表结构定义,第二行开始第一位为压缩的16进制数,表示该行元素是否为空,后续存储按分隔符排列。

  • 哈希索引:

    对象,key为主键,value为所在文件的行号

  • B+树索引:

    存放B+树的结构

3.连接管理

为了区分不同的用户对数据库进行的不同操作,如同一秒内多个进程进行多次请求,AvenirSQL会生成一个签名,用户登录后需使用此签名进行操作。

4.串行锁

进行操作前加锁,操作完成后解锁,并刷新缓存(select语句不会刷新缓存)

//自动释放锁防止数据库死锁
    async releaseLock() {
        let now = moment().valueOf();
        let releaseLockTime = ini.db.releaseLockTime;
        releaseLockTime = releaseLockTime > ini.db.checkLockTime ? releaseLockTime : ini.db.checkLockTime;
        for(let key in this.table) {
            let tables = this.table[key];
            for(let subKey in tables) {
                let times = tables[subKey];
                if(moment(now).diff(moment(times),'seconds') > releaseLockTime) {
                    delete tables[subKey];
                    toLog("自动释放了锁 ",tables[subKey]);
                }
            }
        }
    }

5.缓存

目前共五类缓存,数据库配置文件缓存和表结构缓存不会刷新,哈希索引、表数据、B+树索引缓存会定时刷新。

6.解析SQL

在此感谢阿里巴巴的sql解析器 node-sqlparser

AvenirSQL独有的sql会先解析,除此之外的SQL会转交给node-sqlparser。

//包含原生SQL和能够被AvenirSQL识别的语句
    async parse(sql, sign) {
        //先解析AvenirSQL特有的语句 再解析原生SQL
        toLog("要解析的 sql为 ", sql);
        let raw = this.getArray(sql);
        if (raw.length === 0 || !sql) {
            throw ('SQL_PARSE_ERROR');
        } else {
            //AvenirSQL解析出错不报错,转给解析器解析,解析器报错直接throw
            try {
                await this.parseAvenirSql(raw, sql, sign);
            } catch (error) {
                //不是内部定义的错误就代表程序处理出错了
                toLog('error = ', error);
                if (error == SUCCESS || error != 'error') {
                    throw (error);
                }

                //不需要try catch了,底层会抓住错误
                let par = this.parseSql(sql);
                await this.doSql(par, sign);

            }
        }
    }
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (1)

加载中
唉,只会用nodejs写CRUD的惭愧路过。。。
02/09 20:01
回复
举报
更多评论
发表于数据库专区
02/18 11:37

AvenirSQL V1.1.2 已经发布,基于 Node.js 的数据库

AvenirSQL V1.1.2 已经发布,这是一个基于 Node.js 的数据库。 此版本更新内容包括: 功能: 1.开始支持distinct方法,但暂时只支持将多个列拼接成字符串,判断是否重复。 bug fix: 1.更新了readme文件,以及增加了一些错误码。 详情查看:https://gitee.com/onlyyyy/AvenirSQL/releases/V1.1.2

0
0
发表于数据库专区
02/07 15:30

AvenirSQL V1.1.0 已经发布

AvenirSQL V1.1.0 已经发布,这是一个基于 Node.js 的数据库。 此版本更新内容包括: 功能: 1.AvenirSQL开始支持in操作符 例如 select * from t where a in (1,2,3) 2.AvenirSQL开始支持or操作符,例如select * from t where a = 1 or b = 2,但不支持同一个列连续出现两次,如where a = 1 or a = 2,并且SQL出现or字段则无法使用主键索引。 3.cli程序(curl.js)不再需要输入sql前缀,即可发送SQL语句了。 bug修复: 1.解决selec...

0
2
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
暂无内容
1 评论
11 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部