不要怂,就是干,撸起袖子干!

Commit a1432851 by Sascha Depold

refactored query-generator for multidatabase support

1 parent fe91e41c
var ConnectorManager = module.exports = function() { var ConnectorManager = module.exports = function(sequelize, config) {
throw new Error('Define the constructor!') throw new Error('Define the constructor!')
} }
ConnectorManager.prototype.getQueryGenerator = function() {
this.__QueryGenerator = this.__QueryGenerator || require(__dirname + '/' + this.sequelize.options.connector + '/query-generator')
return this.__QueryGenerator
}
ConnectorManager.prototype.query = function(sql, callee, options) { ConnectorManager.prototype.query = function(sql, callee, options) {
throw new Error('Define the query method!') throw new Error('Define the query method!')
} }
......
...@@ -2,9 +2,10 @@ var Query = require("../../query") ...@@ -2,9 +2,10 @@ var Query = require("../../query")
, Utils = require("../../utils") , Utils = require("../../utils")
, without = function(arr, elem) { return arr.filter(function(e) { return e != elem }) } , without = function(arr, elem) { return arr.filter(function(e) { return e != elem }) }
var ConnectorManager = module.exports = function(config) { var ConnectorManager = module.exports = function(sequelize, config) {
this.sequelize = sequelize
this.client = null this.client = null
this.config = config this.config = config || {}
this.disconnectTimeoutId = null this.disconnectTimeoutId = null
this.queue = [] this.queue = []
this.activeQueue = [] this.activeQueue = []
......
var Utils = require("./utils") var Utils = require("../../utils")
var QueryGenerator = module.exports = { var QueryGenerator = module.exports = {
/* /*
...@@ -194,3 +194,4 @@ var QueryGenerator = module.exports = { ...@@ -194,3 +194,4 @@ var QueryGenerator = module.exports = {
}).join(" AND ") }).join(" AND ")
} }
} }
QueryGenerator = Utils._.extend(Utils._.clone(require("../query-generator")), QueryGenerator)
var Utils = require("../../utils") var Utils = require("../../utils")
var ConnectorManager = module.exports = function() { var ConnectorManager = module.exports = function() {}
}
Utils._.extend(ConnectorManager.prototype, require("../connector-manager").prototype) Utils._.extend(ConnectorManager.prototype, require("../connector-manager").prototype)
ConnectorManager.prototype.connect = function() {
return ''
}
var Utils = require("../../utils")
var QueryGenerator = module.exports = {}
QueryGenerator = Utils._.extend(Utils._.clone(require("../query-generator")), QueryGenerator)
var Utils = require("./utils") var Utils = require("./utils")
, Model = require("./model") , Model = require("./model")
, QueryGenerator = require("./query-generator")
, DataTypes = require("./data-types") , DataTypes = require("./data-types")
var ModelDefinition = module.exports = function(name, attributes, options) { var ModelDefinition = module.exports = function(name, attributes, options) {
...@@ -21,6 +20,10 @@ var ModelDefinition = module.exports = function(name, attributes, options) { ...@@ -21,6 +20,10 @@ var ModelDefinition = module.exports = function(name, attributes, options) {
} }
Utils.addEventEmitter(ModelDefinition) Utils.addEventEmitter(ModelDefinition)
ModelDefinition.prototype.__defineGetter__('QueryGenerator', function() {
return this.modelManager.sequelize.connectorManager.getQueryGenerator()
})
ModelDefinition.prototype.addOptionalClassMethods = function() { ModelDefinition.prototype.addOptionalClassMethods = function() {
var self = this var self = this
Utils._.each(this.options.classMethods || {}, function(fct, name) { self[name] = fct }) Utils._.each(this.options.classMethods || {}, function(fct, name) { self[name] = fct })
...@@ -72,7 +75,7 @@ ModelDefinition.prototype.sync = function(options) { ...@@ -72,7 +75,7 @@ ModelDefinition.prototype.sync = function(options) {
var self = this var self = this
var doQuery = function() { var doQuery = function() {
self.query(QueryGenerator.createTableQuery(self.tableName, self.attributes, options)) self.query(self.QueryGenerator.createTableQuery(self.tableName, self.attributes, options))
.on('success', function() { self.emit('success', self) }) .on('success', function() { self.emit('success', self) })
.on('failure', function(err) { self.emit('failure', err) }) .on('failure', function(err) { self.emit('failure', err) })
} }
...@@ -89,18 +92,18 @@ ModelDefinition.prototype.sync = function(options) { ...@@ -89,18 +92,18 @@ ModelDefinition.prototype.sync = function(options) {
} }
ModelDefinition.prototype.drop = function() { ModelDefinition.prototype.drop = function() {
return this.query(QueryGenerator.dropTableQuery(this.tableName, this.id)) return this.query(this.QueryGenerator.dropTableQuery(this.tableName, this.id))
} }
ModelDefinition.prototype.__defineGetter__('all', function() { ModelDefinition.prototype.__defineGetter__('all', function() {
return this.query(QueryGenerator.selectQuery(this.tableName)) return this.query(this.QueryGenerator.selectQuery(this.tableName))
}) })
ModelDefinition.prototype.count = function(options) { ModelDefinition.prototype.count = function(options) {
var self = this var self = this
var emitter = new Utils.CustomEventEmitter(function() { var emitter = new Utils.CustomEventEmitter(function() {
self.query(QueryGenerator.countQuery(self.tableName, options), self, {plain: true}).on('success', function(obj) { self.query(self.QueryGenerator.countQuery(self.tableName, options), self, {plain: true}).on('success', function(obj) {
emitter.emit('success', obj['count(*)']) emitter.emit('success', obj['count(*)'])
}) })
}) })
...@@ -121,14 +124,14 @@ ModelDefinition.prototype.min = function(field, options) { ...@@ -121,14 +124,14 @@ ModelDefinition.prototype.min = function(field, options) {
var self = this var self = this
var emitter = new Utils.CustomEventEmitter(function() { var emitter = new Utils.CustomEventEmitter(function() {
self.query(QueryGenerator.minQuery(self.tableName, field,options), self, {plain: true}).on('success', function(obj) { self.query(self.QueryGenerator.minQuery(self.tableName, field,options), self, {plain: true}).on('success', function(obj) {
emitter.emit('success', obj['min']) emitter.emit('success', obj['min'])
}) })
}) })
return emitter.run() return emitter.run()
} }
ModelDefinition.prototype.findAll = function(options) { ModelDefinition.prototype.findAll = function(options) {
return this.query(QueryGenerator.selectQuery(this.tableName, options)) return this.query(this.QueryGenerator.selectQuery(this.tableName, options))
} }
ModelDefinition.prototype.find = function(options) { ModelDefinition.prototype.find = function(options) {
...@@ -152,7 +155,7 @@ ModelDefinition.prototype.find = function(options) { ...@@ -152,7 +155,7 @@ ModelDefinition.prototype.find = function(options) {
options.limit = 1 options.limit = 1
var query = QueryGenerator.selectQuery(this.tableName, options) var query = this.QueryGenerator.selectQuery(this.tableName, options)
return this.query(query, this, {plain: true}) return this.query(query, this, {plain: true})
} }
......
var Utils = require("./utils") var Utils = require("./utils")
, Mixin = require("./associations/mixin") , Mixin = require("./associations/mixin")
, QueryGenerator = require("./query-generator")
var Model = module.exports = function(values, options) { var Model = module.exports = function(values, options) {
var self = this var self = this
...@@ -38,6 +37,10 @@ Model.Events = { ...@@ -38,6 +37,10 @@ Model.Events = {
destroy: 'DestroyQuery' destroy: 'DestroyQuery'
} }
Model.prototype.__defineGetter__('QueryGenerator', function() {
return this.__definition.QueryGenerator
})
Model.prototype.addAttribute = function(attribute, value) { Model.prototype.addAttribute = function(attribute, value) {
this[attribute] = value this[attribute] = value
this.attributes.push(attribute) this.attributes.push(attribute)
...@@ -60,7 +63,7 @@ Model.prototype.save = function() { ...@@ -60,7 +63,7 @@ Model.prototype.save = function() {
if(this.isNewRecord) { if(this.isNewRecord) {
var self = this var self = this
var eventEmitter = new Utils.CustomEventEmitter(function() { var eventEmitter = new Utils.CustomEventEmitter(function() {
self.query(QueryGenerator.insertQuery(self.__definition.tableName, self.values)) self.query(self.QueryGenerator.insertQuery(self.__definition.tableName, self.values))
.on('success', function(obj) { .on('success', function(obj) {
obj.isNewRecord = false obj.isNewRecord = false
eventEmitter.emit('success', obj) eventEmitter.emit('success', obj)
...@@ -70,7 +73,7 @@ Model.prototype.save = function() { ...@@ -70,7 +73,7 @@ Model.prototype.save = function() {
return eventEmitter.run() return eventEmitter.run()
} else { } else {
var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id
return this.query(QueryGenerator.updateQuery(this.__definition.tableName, this.values, identifier)) return this.query(this.QueryGenerator.updateQuery(this.__definition.tableName, this.values, identifier))
} }
} }
...@@ -100,7 +103,7 @@ Model.prototype.destroy = function() { ...@@ -100,7 +103,7 @@ Model.prototype.destroy = function() {
return this.save() return this.save()
} else { } else {
var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id
return this.query(QueryGenerator.deleteQuery(this.__definition.tableName, identifier)) return this.query(this.QueryGenerator.deleteQuery(this.__definition.tableName, identifier))
} }
} }
......
...@@ -11,6 +11,7 @@ var Sequelize = module.exports = function(database, username, password, options) ...@@ -11,6 +11,7 @@ var Sequelize = module.exports = function(database, username, password, options)
}) })
this.options = options this.options = options
this.options.connector = this.options.connector || 'mysql'
this.config = { this.config = {
database: database, database: database,
username: username, username: username,
...@@ -19,10 +20,10 @@ var Sequelize = module.exports = function(database, username, password, options) ...@@ -19,10 +20,10 @@ var Sequelize = module.exports = function(database, username, password, options)
port : options.port || 3306 port : options.port || 3306
} }
var ConnectorManager = require("./connectors/" + (this.options.connector || 'mysql') + "/connector-manager") var ConnectorManager = require("./connectors/" + this.options.connector + "/connector-manager")
this.modelManager = new ModelManager(this) this.modelManager = new ModelManager(this)
this.connectorManager = new ConnectorManager(this.config) this.connectorManager = new ConnectorManager(this, this.config)
} }
Sequelize.Utils = Utils Sequelize.Utils = Utils
......
var assert = require("assert") var assert = require("assert")
, QueryGenerator = require("../../lib/query-generator") , QueryGenerator = require("../../lib/connectors/mysql/query-generator")
, eql = assert.equal , eql = assert.equal
module.exports = { module.exports = {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!