added json-tables
This commit is contained in:
parent
db85305e55
commit
68fb4619ca
|
@ -0,0 +1,176 @@
|
|||
(function () {
|
||||
"use strict";
|
||||
|
||||
var Future = require('future')
|
||||
, __id_ = 'id'
|
||||
, nameToString = function () {
|
||||
return this.name;
|
||||
};
|
||||
|
||||
function RowType(table) {
|
||||
var name = table.name,
|
||||
columns = table.columns,
|
||||
klass;
|
||||
|
||||
klass = function (id, arr) {
|
||||
/*
|
||||
// Extending Array doesn't work very well
|
||||
|
||||
var self = this;
|
||||
arr.forEach(function (item, i) {
|
||||
self[i] = item;
|
||||
});
|
||||
*/
|
||||
if (!(__id_ in this)) {
|
||||
this[__id_] = id;
|
||||
}
|
||||
this.arr = arr;
|
||||
};
|
||||
|
||||
// TODO make more directive-like
|
||||
// TODO create a delegates_to directive
|
||||
klass.prototype.toString = table.toString || nameToString;
|
||||
|
||||
columns.forEach(function (column, i) {
|
||||
klass.prototype.__defineGetter__(column, function () {
|
||||
return this.arr[i];
|
||||
//return this[i];
|
||||
});
|
||||
});
|
||||
return klass;
|
||||
}
|
||||
|
||||
function createIndexes(tables) {
|
||||
Object.keys(tables).forEach(function (name) {
|
||||
var table = tables[name],
|
||||
index,
|
||||
krow;
|
||||
|
||||
if (!table.columns) {
|
||||
console.log("missing columns");
|
||||
console.log(table);
|
||||
}
|
||||
|
||||
table.klass = RowType(table);
|
||||
|
||||
index = table.indexed = {};
|
||||
|
||||
table.rows.forEach(function (row, z) {
|
||||
// TODO no need to index
|
||||
var krow = new table.klass(z, row);
|
||||
//krow.id = z;
|
||||
index[krow[__id_]] = krow;
|
||||
table.rows[z] = krow;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function createRelationships(tables) {
|
||||
Object.keys(tables).forEach(function (name) {
|
||||
var table = tables[name],
|
||||
relationships,
|
||||
relHandlers = {};
|
||||
|
||||
// TODO create a delegates_to directive
|
||||
relHandlers.belongs_to = function (relname) {
|
||||
// TODO abstract name mutation
|
||||
var relation = tables[relname + 's'],
|
||||
relname_s = relname + '_id';
|
||||
|
||||
table.klass.prototype.__defineGetter__(relname, function () {
|
||||
var fid = this[relname_s];
|
||||
|
||||
return relation.indexed[fid];
|
||||
});
|
||||
}
|
||||
|
||||
//relationships = table.relationships && table.relationships.belongs_to;
|
||||
//relationships = relationships || [];
|
||||
|
||||
relationships = table.relationships || {};
|
||||
|
||||
Object.keys(relationships).forEach(function (relType) {
|
||||
if (!relHandlers[relType]) {
|
||||
console.log('relationship type "' + relType + '" is not supported');
|
||||
return;
|
||||
}
|
||||
relationships[relType].forEach(relHandlers[relType]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function createRelate(tables) {
|
||||
var future = Future()
|
||||
;
|
||||
|
||||
createIndexes(tables);
|
||||
createRelationships(tables);
|
||||
//testRelationships(tables);
|
||||
//console.log(Object.keys(data));
|
||||
|
||||
future.fulfill(null, tables);
|
||||
|
||||
return future.passable();
|
||||
}
|
||||
|
||||
var Future = require('Future')
|
||||
, Join = require('Join')
|
||||
;
|
||||
|
||||
function createGet(pathname, tables) {
|
||||
var future = Future()
|
||||
, join = Join()
|
||||
, request = require('ahr2')
|
||||
, db = {}
|
||||
, errs = []
|
||||
;
|
||||
|
||||
tables.forEach(function (tablename) {
|
||||
var resource = pathname + '/' + tablename + ".json"
|
||||
, req = request.get(resource)
|
||||
;
|
||||
|
||||
req.when(function (err, xhr, data) {
|
||||
if (err) {
|
||||
console.log('error tables-get');
|
||||
console.log(err);
|
||||
console.log(err.message);
|
||||
return;
|
||||
}
|
||||
|
||||
if (global.Buffer && data instanceof global.Buffer) {
|
||||
data = data.toString();
|
||||
}
|
||||
|
||||
// TODO need to refactor AHR and fix JSON / text handling
|
||||
try {
|
||||
data = JSON.parse(data.toString());
|
||||
} catch (e) {
|
||||
// ignore, it was probably already parsed
|
||||
}
|
||||
// follow convention
|
||||
tablename = tablename.replace('-','_');
|
||||
db[tablename] = data;
|
||||
});
|
||||
|
||||
join.add(req);
|
||||
});
|
||||
|
||||
join.when(function () {
|
||||
// TODO add timeout as error
|
||||
if (0 == errs.length) {
|
||||
errs = null;
|
||||
}
|
||||
|
||||
future.fulfill(errs, db);
|
||||
});
|
||||
|
||||
return future.passable();
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
get: createGet
|
||||
, relate: createRelate
|
||||
};
|
||||
}());
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"author": "AJ ONeal <coolaj86@gmail.com> (http://coolaj86.info)"
|
||||
, "name": "json-tables"
|
||||
, "description": "An abstraction for models to be stored in json-storage"
|
||||
, "keywords": ["ender", "orm", "sql", "model", "json-storage", "localStorage", "sessionStorage", "globalStorage", "Storage"]
|
||||
, "version": "0.7.0"
|
||||
, "repository": {
|
||||
"type": "git"
|
||||
, "url": "git://github.com/coolaj86/json-storage-js.git"
|
||||
}
|
||||
, "engines": {
|
||||
"node": ">= v0.2.0"
|
||||
}
|
||||
, "main": "index"
|
||||
, "dependencies": {
|
||||
"json-storage-model": ">= 0.9.0"
|
||||
, "json-storage": ">= 1.0.0"
|
||||
, "node-uuid": ">= 0.0.0"
|
||||
}
|
||||
, "devDependencies": {}
|
||||
}
|
Loading…
Reference in New Issue