[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": dataage data = key: utilsuuid kind: "person" name: "Koen Bok" age: 29 backend = "postgres://localhost/test"store = backendmodelsperson storecreate # Store a person (upsert) storeput data # Get a person by key storeget "person"datakey consolelog result # Query persons older then 10 years storequery "person""name >": "10" consolelog result
Api
<"dsl"><models> storecreate <"kind">callbackstoreget <"kind"><"key"keys>callbackstoreput <"kind"><datadata>callbackstoredel <"kind"><"key"keys>callbackstorequery <"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)