0.0.8 • Published 5 years ago

jsimdb v0.0.8

Weekly downloads
-
License
BSD
Repository
github
Last release
5 years ago

JavaScript In-Memory Database

Build Status codecov License Language grade: JavaScript

In-memory database for Node with no dependencies. jsimdb is type safe, fast, and easy to use.

jsimdb is intended for rapid prototyping and other non-critical use-cases. Get functionality similar to mongoose without needing to spin up an instance.

NOTE: This project is currently a work in progress and, as such, will be under heavy development. Use at your own risk before version 0.1.0

Getting Started

Have a look at the docs for in-depth information about methods and a few tutorials.

Basic principles

See glossary

jsimdb offers a relational database that can contain any number of tables. A table is a named object that contains any number of entries, each of which is referenced by a UUID. Each of these entries must conform to a rigid schema that ensures that the types conform.

Upon insertion of a new entry, the entry is compared against the schema for type, and optionally to ensure that the field has a defined value. Accessing an entry directly via its id is a quick operation thanks to V8 optimizations (see this V8 devblog for more info).

A table can also be searched using one of several query functions. Each of these query functions take a query object that defines rules for matching entries. Queries return an object containing the entry or entries which match the given query object, with each entry's id as its key.

Example

const express = require('express')
const app = express()
const jsimdb = require('jsimdb')
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))

const tables = {
    table1: {
        field1: {
            type: 'string',
            required: true
        },
        field2: {
            type: 'array number',
            required: true
        },
        field3: {
            type: 'array id table2'
        }
    },
    table2: {
        field1: {
            type: 'date',
            required: true
        },
        field2: {
            type: 'id table1'
        }
    }
}

const db = jsimdb.relational('newdb', tables)

app.get('/table1/:id', (req, res) => {
    db.findById('table1', req.params.id, (err, data) => {
        if (err) {
            res.render('error', { error: err })
        } else {
            res.render('table1', data)
        }
    })
})

app.get('/table/q/:query', (req, res) => {
    db.findAll(
        new Query('table1', 'field1', 'eq', 'some string'),
        (err, entries) => {
            if (err) {
                res.render('error', { error: err })
            } else {
                res.render('query', { results: entries })
            }
        }
    )
})

app.post('/table1', (req, res) => {
    // Pass data from the browser to the server wrapped inside an object named entry attached to the request body
    db.insert('table1', req.body.entry, (err, data) => {
        if (err) {
            res.render('error', { error: err })
        } else {
            res.redirect('/table1')
        }
    })
})

app.delete('/table1/:id', (req, res) => {
    db.deleteById('table1', req.params.id, (err, data) => {
        if (err) {
            res.render('error', { error: err })
        } else {
            res.redirect('/')
        }
    })
})

app.listen(8080, '127.0.0.1')
0.0.8

5 years ago

0.0.7

5 years ago