/lsdb

ORM database for the LocalStorage

Primary LanguageJavaScript

lsdb.js

Lightweight database and ORM layer for the LocalStorage-enabled browsers

Quick start

Download and include lsdb.js to your app

<script type="text/javascript" src="[yourpath]/lsdb.js"></script>

Create new connection

var db = new dbb({ dbname: 'db_demo' });

Insert record:

db.insert('users', { name: 'Engelbert', lastname: 'Humperdinck' });

Select record:

db.select('users'); 

Update record:

db.update('users', { name: 'Zingelbert', lastname: 'Bembledack' }, 1); 

Drop table:

db.drop('users'); 

Why?

I used it mostly for the rich UI prototypes. On prototyping stage, all database interaction is done via lsdb.js layer, which then can be easily replaced by the real ORM. But of course, you can build a real-world stateful client-side applications with it as well.

Reduce pattern

You can use reduce-style callbacks for almost every lsdb.js operation.

Retrieving only adults

db.select('users', function(rec) {
    return rec.age > 17; 
}); 

Updating only Engelberts

db.update('users', { new_field: 'I am the Moon' }, function(rec) { 
    return (rec.name == 'Engelbert')
});

API in examples

Create connection

var db = new lsdb({ dbname: 'db_demo' }); 

Insert single record

db.insert( 'users', { name: 'Engelbert', lastname: 'Humperdinck' } );

Insert several records

db.insert( 'users', [
        { name: 'Yingybert', lastname: 'Dambleban' },  
        { name: 'Wengelbert', lastname: 'Humptyback' } 
    ] );

Update records

db.update('users', { new_field: 'I am the Moon' }, 1); // update record with id = 1

or

db.update('users', { new_field: 'I am the Moon' }, [ 1, 2 ] ); // update several records 

or

db.update('users', { new_field: 'I am the Moon' }, function(rec) { // update via reduce callback
    return (rec.name == 'Engelbert')
});

Select records

db.select_all('users');

=>

Object
    1: Object
        id: 1
        lastname: "Dambleban"
        name: "Yingybert"
        new_field: "I'm the Moon"
    2: Object
        id: 2
        lastname: "Humptyback"
        name: "Wengelbert"

or

db.select_all('users', 'array'); // will produce the array instead of object

or

db.select('users', 1); // select single record by id

or

db.select('users', [ 1, 2 ], 'array' ); // select several records by ids as array

or

db.select('users', function(rec) {
    return rec.new_field; // return only records with the certain field set
}); // select records via reduce

Remove records

db.remove('users', [ 1, 2 ]);

or

db.remove('users', function(rec) {
    return rec.new_field; // remove only records with the certain field set
}); // select records via reduce

Drop table

db.drop('users');

Working with ORM

Models

To start working with the ORM layer you should define your models:

var User = {
    table: 'users', // table name
    fields: [ 'id', 'name', 'lastname' ], // fields
    associations: [ // array of associations
        { type: 'hasMany', model: 'Project', name: 'projects' }
    ]
};

var Project = {
    table: 'projects', // table name
    fields: [ 'id', 'title', 'description' ], // fields
    associations: [ // array of associations
        { type: 'hasOne', model: 'User', name: 'user' }
    ]
};

db.orm_init( { models: { 'Project': Project, 'User': User } } ); 

Create new record(s)

db.orm_save('User', { name: 'Howard', lastname: 'Moon' });

or

db.orm_save('User', [ 
    { name: 'Howard', lastname: 'Moon' },
    { name: 'Vincent', lastname: 'Noire' }
]);

Update record(s)

db.orm_save('User', { name: 'Howard', lastname: 'Moon', id: 1 });

or (update and create in one command)

db.orm_save('User', [ 
    { name: 'Howard', lastname: 'Moon', id: 1 },  
    { name: 'New', lastname: 'Gregg' } 
]);

Create new associated record(s)

var id = db.orm_save('User', { name: 'Vincent', lastname: 'Noire' } );
db.orm_save( 'Project', [ 
    { title: 'Make up the hair', user: id },
    { title: 'Be gorgeous', user: id } 
]);

Retrieve record(s)

var users = db.orm_load( 'User' );

=>

Object
    id: 3
    lastname: "Noire"
    name: "Vincent"
    projects: Array[2]
        0: Object
            id: 1
            title: "Make up the hair"
        1: Object
            id: 2
            title: "Be gorgeous"

All associated recors will also be retrieved.

Remove record

db.orm_remove( 'User', [1, 3] );

or

db.orm_remove( 'User', function(rec) { return rec.lastname=='Noire' } );

Platforms

Tested on Chrome and Firefox. Wait, are there any other browsers?