Nasty Pirate Macaw

    cavia

    0.0.1 • Public • Published

    [VERY MUCH A WORK IN PROGRESS]

    Simple key value implementation on top of old fashioned sql.

    Philosophy

    Some stuff I like for storing my data

    • A very simple engine with a minimal api (get, put, del, query) so it can be replaced with something more optimized if needed
    • Old fashion storage engines that you can hire as a service and install locally
    • options (sqlite, mysql, postgresql)
    • Data model flexibility, no schemas
    • Enforce querying on indexes, so they are always fast
    • Separating indexes from the actual data, and dynamically generating them on put
    • The ability to cheat on all of the above if you need it
    • Transactions and aggregates

    Obvious downsides

    • No type checking, validation etc.
    • Not very space efficient (index is data copy)
    • Definitely not the fastest way to store data

    Simple Example

    models = 
        person: 
            kind: "person"
            indexes:
                age: {type: "int"getter: (data) -> data.age}
     
    data =
        key: utils.uuid()
        kind: "person"
        name: "Koen Bok"
        age: 29
     
    backend = new PostgresBackend "postgres://localhost/test"
    store = new Store backend[models.person]
     
    store.create (err) ->
        
        # Store a person (upsert) 
        store.put data(err) ->
            
            # Get a person by key 
            store.get "person"data.key (err, result) ->
                console.log result
     
            # Query persons older then 10 years 
            store.query "person"{"name >": "10"}(err, result) ->
                console.log result

    Api

    new Backend <"dsl"><[models]>
     
    store.create <"kind">callback
    store.get <"kind"><"key"[keys]>callback
    store.put <"kind"><{data}[{data}]>callback
    store.del <"kind"><"key"[keys]>callback
    store.query <"kind"><{filters}>callback

    Run the tests

    make test

    Extras

    REST API example using express. Deployable to Heroku.

    Todo

    • Make it work in the browser with websql database
    • Add middleware system and implementations (caching, serializing, performance, logging, structured data validation, authentication)
    • Add events action.pre|post
    • Refactor transactions to be objects
    • Refactor query pattern to something nicer (allowing querying on multiple indexes)

    Inspiration

    http://backchannel.org/blog/friendfeed-schemaless-mysql

    Keywords

    none

    Install

    npm i cavia

    DownloadsWeekly Downloads

    0

    Version

    0.0.1

    License

    none

    Last publish

    Collaborators

    • koenbok