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

Commit cabfdfee by Sascha Depold

big refactoring: correct emitter usage + added id as primary id

1 parent 291fde51
...@@ -10,7 +10,11 @@ var ModelDefinition = module.exports = function(name, attributes, options) { ...@@ -10,7 +10,11 @@ var ModelDefinition = module.exports = function(name, attributes, options) {
this.tableName = name this.tableName = name
this.attributes = attributes this.attributes = attributes
this.modelManager = null // defined by model-manager during addModel this.modelManager = null // defined by model-manager during addModel
// additional attributes
this.attributes.id = 'INT NOT NULL auto_increment PRIMARY KEY'
} }
Utils.addEventEmitter(ModelDefinition)
ModelDefinition.prototype.sync = function(options) { ModelDefinition.prototype.sync = function(options) {
options = options || {} options = options || {}
...@@ -18,13 +22,15 @@ ModelDefinition.prototype.sync = function(options) { ...@@ -18,13 +22,15 @@ ModelDefinition.prototype.sync = function(options) {
var self = this var self = this
var doQuery = function() { var doQuery = function() {
var query = QueryGenerator.createTableQuery(self.tableName, self.attributes) var query = QueryGenerator.createTableQuery(self.tableName, self.attributes)
return self.modelManager.sequelize.query(query) self.modelManager.sequelize.query(query)
.on('success', function() { self.emit('success') })
.on('failure', function() { self.emit('failure') })
} }
if(options.force) if(options.force) this.drop().on('success', function() { doQuery() })
this.drop().on('end', function() { return doQuery() }) else doQuery()
else
return doQuery() return this
} }
ModelDefinition.prototype.drop = function() { ModelDefinition.prototype.drop = function() {
...@@ -32,7 +38,15 @@ ModelDefinition.prototype.drop = function() { ...@@ -32,7 +38,15 @@ ModelDefinition.prototype.drop = function() {
return this.modelManager.sequelize.query(query) return this.modelManager.sequelize.query(query)
} }
ModelDefinition.prototype.create = function(values) { ModelDefinition.prototype.build = function(values) {
var instance = new Model(values) var instance = new Model(values)
, self = this
instance.definition = this
return instance return instance
} }
ModelDefinition.prototype.create = function(values) {
return this.build(values).save()
}
\ No newline at end of file
...@@ -5,13 +5,13 @@ var Utils = require("./utils") ...@@ -5,13 +5,13 @@ var Utils = require("./utils")
var Model = module.exports = function(values) { var Model = module.exports = function(values) {
var self = this var self = this
this.id = null // a newly created model has no id this.definition = null // will be set on Model.build or Model.create
this.attributes = []
this.addAttribute('id', null) // a newly created model has no id
Utils._.map(values, function(value, key) { Utils._.map(values, function(value, key) { self.addAttribute(key, value) })
self[key] = value
})
} }
require("sys").inherits(Model, require('events').EventEmitter); Utils.addEventEmitter(Model)
Utils._.map(Mixin.classMethods, function(fct, name) { Model[name] = fct }) Utils._.map(Mixin.classMethods, function(fct, name) { Model[name] = fct })
Model.Events = { Model.Events = {
...@@ -22,16 +22,37 @@ Model.Events = { ...@@ -22,16 +22,37 @@ Model.Events = {
var instanceMethods = { var instanceMethods = {
save: function() { save: function() {
this.isNewRecord ? this.emit(Model.Events.insert, this) : this.emit(Model.Events.update, this) if(this.isNewRecord) {
var query = QueryGenerator.insertQuery(this.definition.tableName, this.values)
return this.definition.modelManager.sequelize.query(query)
} else {
var query = QueryGenerate.updateQuery(this.definition.tableName, this.values, this.id)
return this.definition.modelManager.sequelize.query(query)
}
}, },
destroy: function() { destroy: function() {
this.emit(Model.Events.destroy, this) var query = QueryGenerate.deleteQuery(this.definition.tableName, this.id)
return this.definition.modelManager.sequelize.query(query)
},
addAttribute: function(attribute, value) {
this[attribute] = value
this.attributes.push(attribute)
} }
} }
Model.prototype.__defineGetter__('isNewRecord', function() { Model.prototype.__defineGetter__('isNewRecord', function() {
return this.id == null return this.id == null
}) })
Model.prototype.__defineGetter__('values', function() {
var result = {}
, self = this
this.attributes.forEach(function(attr) {
result[attr] = self[attr]
})
return result
})
/* Add the instance methods to Model */ /* Add the instance methods to Model */
Utils._.map(instanceMethods, function(fct, name) { Model.prototype[name] = fct}) Utils._.map(instanceMethods, function(fct, name) { Model.prototype[name] = fct})
......
var Utils = require("./utils")
var Query = module.exports = function(databaseConfig) { var Query = module.exports = function(databaseConfig) {
this.config = databaseConfig this.config = databaseConfig
} }
require("sys").inherits(Query, require('events').EventEmitter) Utils.addEventEmitter(Query)
Query.prototype.run = function(query) { Query.prototype.run = function(query) {
var self = this var self = this
...@@ -16,7 +17,8 @@ Query.prototype.run = function(query) { ...@@ -16,7 +17,8 @@ Query.prototype.run = function(query) {
console.log('Executing: ' + query) console.log('Executing: ' + query)
client.connect() client.connect()
client.query(query, function() { self.emit('end') }) client.query(query, function() { self.emit('success') })
client.on("error", function(err) { self.emit('failure', err) })
client.end() client.end()
return this return this
......
var Utils = module.exports = { var Utils = module.exports = {
_: require("underscore"), _: require("underscore"),
addEventEmitter: function(_class) {
require("sys").inherits(_class, require('events').EventEmitter)
},
addTicks: function(s) { addTicks: function(s) {
return '`' + Utils.removeTicks(s) + '`' return '`' + Utils.removeTicks(s) + '`'
}, },
......
...@@ -7,9 +7,14 @@ var User = sequelize.define('User', { ...@@ -7,9 +7,14 @@ var User = sequelize.define('User', {
bio: Sequelize.TEXT bio: Sequelize.TEXT
}) })
console.log(User) User.sync({force: true}).on('success', function() {
User.sync() var user = User.build({title: 'barfooz', bio: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'})
User.drop() console.log(user)
var user = User.create({title: 'barfooz', bio: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'}) user.save().on('success', function() {
console.log(user) console.log('just saved the user :)')
console.log(user.save()) })
\ No newline at end of file })
// console.log(user)
// console.log(user.save())
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!