atomicrecord
Version:
Super lightweight node.js ActiveRecord ORM layer for FoundationDB
135 lines (98 loc) • 2.91 kB
text/coffeescript
path = require('path')
{ObjectID} = require('bson')
fdb = require('fdboost')()
db = fdb.open()
ID = require('./id')
module.exports = (database, dataset, overrides) ->
directories = {}
getDirectory = (dirPath, fnName, callback) ->
directory = directories[dirPath]
if (directory)
callback(null, directory)
else
cb = (err, dir) ->
if (err)
err.message = "Directory path \"#{dirPath}\" does not exist." if err.message is 'The directory does not exist.'
callback(err)
else
directories[dirPath] = dir
callback(null, dir)
fdb.directory[fnName](db, dirPath.split('/'), {}, cb)
return
class KeyFrag
constructor: ->
if (overrides)
for prop, val of overrides
KeyFrag::[prop] = val if typeof val is 'function'
database: database
dataset: dataset
_fields: null
getDirectoryFields: ->
[]
getKeyFields: ->
['id']
getIdName: ->
'id'
generateId: ->
serializeId: (hexStr) ->
new ID(hexStr)
deserializeId: (id) ->
id.toString()
getRootPath: ->
path.join('atomicrecord', , )
getDirectoryPath: (obj) ->
dirPath =
dirPath = dirPath.substr(1) if dirPath.indexOf('/') is 0
dirPath += "/#{obj[field]}" for field in
dirPath
resolveDirectory: (obj, callback) ->
getDirectory( , 'open', callback)
return
resolveOrCreateDirectory: (obj, callback) ->
getDirectory( , 'createOrOpen', callback)
return
resolveKey: (obj) ->
key = []
idName =
for field in
val = obj[field]
val = fdb.encoding.encode(val) unless field is idName
key.push(val)
key
encodeKey: (directory, obj, keySuffix) ->
keyArr =
keyArr = keyArr.concat(keySuffix) if keySuffix
### Store key internally in record if obj is an ActiveRecord instance ###
obj.key = keyArr if obj.__proto__.hasOwnProperty('key')
directory.pack(keyArr)
# rethink this
decodeKey: (directory, buffer, obj) -> # obj = {}) ->
keyArr = directory.unpack(buffer)
for i in [0... .length]
val = keyArr[i]
val = fdb.encoding.decode(val) unless i is .length - 1
obj[ [i]] = val
# obj
return
decodeDirectory: (directory, obj) ->
start = directory._path.length - .length
obj[ [i - start]] = directory._path[i] for i in [start...directory._path.length]
return
Object.defineProperties @::,
directoryFields:
get: ->
keyFields:
get: ->
idName:
get: ->
fields:
get: ->
if ( is null)
= {}
[field] = 1 for field in .concat( )
new KeyFrag()