2021-03-14 11:09:02 +01:00

136 lines
3.3 KiB
JavaScript

var Class = require('better-js-class');
var $U = require('underscore');
var _DB = require('./db.js');
var $M = require('./model.js');
var DB = Class(_DB, {
_init: function(cfg) {
this.parent._init.call(this, cfg);
this._models = {};
},
add: function(cfg) {
var me = this;
var model = {};
var RowTemplate = function(model) {
var closedRowClass = Class($M.Row, {
_init: function(data) {
this.parent._init.call(this, data, {
table: model.Table
});
}
});
return Class(closedRowClass, cfg.Row || {});
};
var Row = RowTemplate(model);
$U.extend(model, {
Row: Row,
_RowTemplate: RowTemplate
});
var TableTemplate = function(model) {
var closedTableClass = Class($M.Table, {
_init: function() {
this.parent._init.call(this, {
db: me,
name: cfg.name,
rowClass: model.Row,
idFieldName: cfg.idFieldName || 'id',
versionFieldName: cfg.versionFieldName || 'version',
createdFieldName: cfg.createdFieldName || 'date_created',
updatedFieldName: cfg.updatedFieldName || 'last_updated'
});
}
});
return Class(closedTableClass, cfg.Table || {});
};
var TableClass = TableTemplate(model);
var Table = new TableClass();
$U.extend(model, {
Table: Table,
_TableTemplate: TableTemplate
});
this._models[cfg.name] = model;
return Table;
},
clone: function() {
var tempClass = function() {
this._models = $U.clone(this._models);
};
tempClass.prototype = this;
return new tempClass();
},
extend: function(cfg) {
var _model = this.get(cfg.name);
if (!_model) {
throw new Error('node-mysql-runtime-error: db.extend can not be used on empty model.');
}
var model = {};
var _RowTemplate = _model._RowTemplate;
var RowTemplate = function(model) {
var superClass = _RowTemplate(model);
return Class(superClass, cfg.Row || {});
};
var Row = RowTemplate(model);
$U.extend(model, {
Row: Row,
_RowTemplate: RowTemplate
});
var _TableTemplate = _model._TableTemplate;
var TableTemplate = function(model) {
var superClass = _TableTemplate(model);
return Class(superClass, cfg.Table || {});
};
var TableClass = TableTemplate(model);
var Table = new TableClass();
$U.extend(model, {
Table: Table,
_TableTemplate: TableTemplate
});
this._models[cfg.name] = model;
return Table;
},
get: function(name) {
return this._models[name];
}
});
DB.format = _DB.format;
module.exports = {
DB: DB,
Row: $M.Row,
Table: $M.Table,
OPTIMISTIC_LOCK_EXCEPTION: $M.OPTIMISTIC_LOCK_EXCEPTION
}