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

Commit 74399645 by Sascha Depold

refactored Sequelize to not using global variables but exporting it according to CommonJS standard

1 parent 6e7b1043
......@@ -6,11 +6,14 @@ The Sequelize library provides easy access to a MySQL database by mapping databa
Sequelize will have a Kiwi package in future. For now, you can install it via NPM or just download the code from the git repository and require _sequelize.js_:
#npm:
# npm:
npm install sequelize
var Sequelize = require("sequelize").Sequelize
#checkout:
require(__dirname + "/path/to/sequelize/sequelize")
# checkout:
cd <path/to/lib>
git clone git://github.com/sdepold/sequelize.git
var Sequelize = require(__dirname + "/lib/sequelize/src/sequelize").Sequelize
This will make the class Sequelize available.
......
......@@ -28,3 +28,6 @@
- added FLOAT type
- fixed DATE type issue
- fixed npm package
# 0.2.6 #
- refactored Sequelize to fit CommonJS module conventions
\ No newline at end of file
/*
var sequelize = new require('sequelize').sequelize(database, username[, password])
var Tag = sequelize.define('Tag', {title: sequelize.TEXT, createdAt: sequelize.DATE})
var t = new Tag({title: 'Office-Stuff', createdAt: new Date()})
t.save(function() {
callback
})
*/
require(__dirname + "/src/Sequelize")
SequelizeHelper = {
exports.Helper = function(Sequelize) {
var Helper = {
log: function(obj) {
var sys = require("sys")
sys.puts(sys.inspect(obj))
......@@ -6,7 +7,7 @@ SequelizeHelper = {
evaluateTemplate: function(template, replacements) {
var result = template
SequelizeHelper.Hash.keys(replacements).forEach(function(key) {
Helper.Hash.keys(replacements).forEach(function(key) {
result = result.replace("%{" + key + "}", replacements[key])
})
return result
......@@ -18,7 +19,7 @@ SequelizeHelper = {
},
asTableIdentifier: function(name) {
return SequelizeHelper.Inflection.singularize(name.toLowerCase()) + "Id"
return Helper.Inflection.singularize(name.toLowerCase()) + "Id"
},
addPrefix: function(prefix, string) {
......@@ -26,7 +27,7 @@ SequelizeHelper = {
},
asTableName: function(name) {
return SequelizeHelper.Inflection.pluralize(name)
return Helper.Inflection.pluralize(name)
},
asSqlDate: function(date) {
......@@ -44,9 +45,9 @@ SequelizeHelper = {
var actualValues = object.values,
result = []
SequelizeHelper.Hash.forEach(actualValues, function(value, key) {
Helper.Hash.forEach(actualValues, function(value, key) {
var dataType = object.table.attributes[key]
result.push(SequelizeHelper.SQL.transformValueByDataType(value, dataType))
result.push(Helper.SQL.transformValueByDataType(value, dataType))
})
return result
......@@ -58,16 +59,16 @@ SequelizeHelper = {
options = options || {}
SequelizeHelper.Hash.forEach(actualValues, function(value, key) {
Helper.Hash.forEach(actualValues, function(value, key) {
var dataType = object.table.attributes[key]
result.push([key, SequelizeHelper.SQL.transformValueByDataType(value, dataType)].join(" = "))
result.push([key, Helper.SQL.transformValueByDataType(value, dataType)].join(" = "))
})
return result.join(options.seperator || ", ")
},
fieldsForInsertQuery: function(object) {
return SequelizeHelper.Hash.keys(object.values).join(", ")
return Helper.Hash.keys(object.values).join(", ")
},
transformValueByDataType: function(value, dataType) {
......@@ -84,7 +85,7 @@ SequelizeHelper = {
return value
if(dataType.indexOf(Sequelize.DATE) > -1)
return ("'" + SequelizeHelper.SQL.asSqlDate(value) + "'")
return ("'" + Helper.SQL.asSqlDate(value) + "'")
return ("'" + value + "'")
},
......@@ -94,8 +95,8 @@ SequelizeHelper = {
return ('id = ' + conditions)
else {
var result = []
SequelizeHelper.Hash.forEach(conditions, function(value, key) {
var _value = SequelizeHelper.SQL.transformValueByDataType(value, attributes[key])
Helper.Hash.forEach(conditions, function(value, key) {
var _value = Helper.SQL.transformValueByDataType(value, attributes[key])
if(_value == 'NULL') result.push(key + " IS NULL")
else result.push(key + "=" + _value)
})
......@@ -106,14 +107,14 @@ SequelizeHelper = {
Hash: {
forEach: function(object, func) {
SequelizeHelper.Hash.keys(object).forEach(function(key) {
Helper.Hash.keys(object).forEach(function(key) {
func(object[key], key, object)
})
},
map: function(object, func) {
var result = []
SequelizeHelper.Hash.forEach(object, function(value, key, object) {
Helper.Hash.forEach(object, function(value, key, object) {
result.push(func(value, key, object))
})
return result
......@@ -128,14 +129,14 @@ SequelizeHelper = {
values: function(object) {
var result = []
SequelizeHelper.Hash.keys(object).forEach(function(key) {
Helper.Hash.keys(object).forEach(function(key) {
result.push(object[key])
})
return result
},
merge: function(source, target, force) {
SequelizeHelper.Hash.forEach(source, function(value, key) {
Helper.Hash.forEach(source, function(value, key) {
if(!target[key] || force)
target[key] = value
})
......@@ -180,4 +181,7 @@ SequelizeHelper = {
},
Inflection: require(__dirname + "/../lib/inflection/inflection")
}
return Helper
}
\ No newline at end of file
require(__dirname + "/SequelizeHelper")
require(__dirname + "/SequelizeTable")
Sequelize = function(database, username, password, options) {
var Sequelize = function(database, username, password, options) {
this.config = {
database: database,
username: username,
......@@ -12,6 +9,8 @@ Sequelize = function(database, username, password, options) {
}
var classMethods = {
Helper: new require(__dirname + "/Helper").Helper(Sequelize),
STRING: 'VARCHAR(255)',
TEXT: 'TEXT',
INTEGER: 'INT',
......@@ -52,20 +51,20 @@ var classMethods = {
break
}
return SequelizeHelper.evaluateTemplate(query, values)
return Sequelize.Helper.evaluateTemplate(query, values)
},
chainQueries: function(queries, callback) {
// queries = [{method: object}, {method: object, params: [1,2,3]}, {method: object}]
var executeQuery = function(index) {
var queryHash = queries[index]
var method = SequelizeHelper.Array.without(SequelizeHelper.Hash.keys(queryHash), "params")[0]
var method = Sequelize.Helper.Array.without(Sequelize.Helper.Hash.keys(queryHash), "params")[0]
var object = queryHash[method]
var iterator = function() {
if(queries.length > (index + 1)) executeQuery(index + 1)
else if (callback) callback()
}
object[method].apply(object, SequelizeHelper.Array.join(queryHash.params || [], [iterator]))
object[method].apply(object, Sequelize.Helper.Array.join(queryHash.params || [], [iterator]))
}
if(queries.length > 0) executeQuery(0)
else if (callback) callback()
......@@ -75,8 +74,8 @@ var classMethods = {
Sequelize.prototype = {
get tableNames() {
var result = []
SequelizeHelper.Hash.keys(this.tables).forEach(function(tableName) {
result.push(SequelizeHelper.SQL.asTableName(tableName))
Sequelize.Helper.Hash.keys(this.tables).forEach(function(tableName) {
result.push(Sequelize.Helper.SQL.asTableName(tableName))
})
return result
},
......@@ -85,17 +84,17 @@ Sequelize.prototype = {
var finished = []
var tables = this.tables
SequelizeHelper.Hash.forEach(tables, function(table) {
Sequelize.Helper.Hash.forEach(tables, function(table) {
table.klass.prepareAssociations()
})
if((SequelizeHelper.Hash.keys(this.tables).length == 0) && callback)
if((Sequelize.Helper.Hash.keys(this.tables).length == 0) && callback)
callback()
else
SequelizeHelper.Hash.forEach(tables, function(table) {
Sequelize.Helper.Hash.forEach(tables, function(table) {
table.klass.sync(function() {
finished.push(true)
if((finished.length == SequelizeHelper.Hash.keys(tables).length) && callback)
if((finished.length == Sequelize.Helper.Hash.keys(tables).length) && callback)
callback()
})
})
......@@ -105,22 +104,24 @@ Sequelize.prototype = {
var finished = []
var tables = this.tables
if((SequelizeHelper.Hash.keys(tables).length == 0) && callback) callback()
if((Sequelize.Helper.Hash.keys(tables).length == 0) && callback) callback()
else
SequelizeHelper.Hash.forEach(tables, function(table, tableName) {
Sequelize.Helper.Hash.forEach(tables, function(table, tableName) {
table.klass.drop(function() {
finished.push(true)
if(finished.length == SequelizeHelper.Hash.keys(tables).length)
if(finished.length == Sequelize.Helper.Hash.keys(tables).length)
if(callback) callback()
})
})
},
define: function(name, attributes) {
var SequelizeTable = require(__dirname + "/SequelizeTable").SequelizeTable
attributes.createdAt = 'DATETIME NOT NULL'
attributes.updatedAt = 'DATETIME NOT NULL'
var table = new SequelizeTable(this, SequelizeHelper.SQL.asTableName(name), attributes)
var table = new SequelizeTable(Sequelize, this, Sequelize.Helper.SQL.asTableName(name), attributes)
table.attributes = attributes
this.tables[name] = {klass: table, attributes: attributes}
......@@ -139,7 +140,7 @@ Sequelize.prototype = {
.auth(this.config.database, this.config.username, this.config.password)
.addListener('authorized', function() {
if(!self.options.disableLogging)
SequelizeHelper.log("Executing the query: " + queryString)
Sequelize.Helper.log("Executing the query: " + queryString)
connection
.query(queryString)
......@@ -162,6 +163,6 @@ Sequelize.prototype = {
}
}
SequelizeHelper.Hash.forEach(classMethods, function(method, methodName) {
Sequelize[methodName] = method
})
\ No newline at end of file
for (var key in classMethods) Sequelize[key] = classMethods[key]
exports.Sequelize = Sequelize
\ No newline at end of file
......@@ -5,10 +5,10 @@
A.hasMany(B) + B.hasMany(A) => AB.aId + AB.bId
*/
SequelizeTable = function(sequelize, tableName, attributes) {
exports.SequelizeTable = function(Sequelize, sequelize, tableName, attributes) {
var table = function(values) {
var self = this
SequelizeHelper.Hash.forEach(values, function(value, key) {
Sequelize.Helper.Hash.forEach(values, function(value, key) {
if(attributes[key]) {
if(attributes[key].indexOf(Sequelize.BOOLEAN) > -1)
self[key] = ((value == 1) || (value == true)) ? true : false
......@@ -31,7 +31,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
isAssociatedWith: function(anotherTable, associationType) {
var result = false
var associations = SequelizeHelper.Array.select(table.associations, function(assoc) {
var associations = Sequelize.Helper.Array.select(table.associations, function(assoc) {
return assoc.table.tableName == anotherTable.tableName
})
......@@ -56,7 +56,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
var _attributes = {}
_attributes[table.identifier] = Sequelize.INTEGER
_attributes[association.table.identifier] = Sequelize.INTEGER
sequelize.define(SequelizeHelper.SQL.manyToManyTableName(table, association.table), _attributes)
sequelize.define(Sequelize.Helper.SQL.manyToManyTableName(table, association.table), _attributes)
} else {
// one to many relation
association.table.attributes[table.identifier] = Sequelize.INTEGER
......@@ -77,7 +77,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
sync: function(callback) {
var fields = ["id INT NOT NULL auto_increment PRIMARY KEY"]
SequelizeHelper.Hash.forEach(table.attributes, function(type, name) {
Sequelize.Helper.Hash.forEach(table.attributes, function(type, name) {
fields.push(name + " " + type)
})
......@@ -98,13 +98,13 @@ SequelizeTable = function(sequelize, tableName, attributes) {
// use the first param as callback if it is no object (hash)
var _callback = (typeof options == 'object') ? callback : options
var queryOptions = (typeof options == 'object')
? SequelizeHelper.Hash.merge(options, { table: table.tableName })
? Sequelize.Helper.Hash.merge(options, { table: table.tableName })
: { table: table.tableName }
sequelize.query(
Sequelize.sqlQueryFor('select', queryOptions),
function(result) {
var objects = SequelizeHelper.Array.map(result, function(r) { return table.sqlResultToObject(r) })
var objects = Sequelize.Helper.Array.map(result, function(r) { return table.sqlResultToObject(r) })
if(_callback) _callback(objects)
}
)
......@@ -114,7 +114,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
sequelize.query(
Sequelize.sqlQueryFor('select', {
table: table.tableName,
where: SequelizeHelper.SQL.hashToWhereConditions(conditions, table.attributes),
where: Sequelize.Helper.SQL.hashToWhereConditions(conditions, table.attributes),
order: 'id DESC',
limit: 1
}), function(result) {
......@@ -142,7 +142,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
// don't check inside of method to increase performance
if(_table.isCrossAssociatedWith(table)) {
table.prototype[assocName] = function(callback) {
var Association = sequelize.tables[SequelizeHelper.SQL.manyToManyTableName(_table, table)].klass
var Association = sequelize.tables[Sequelize.Helper.SQL.manyToManyTableName(_table, table)].klass
var whereConditions = [table.identifier, this.id].join("=")
Association.findAll({ where: whereConditions }, function(result) {
if(result.length > 0) {
......@@ -154,11 +154,11 @@ SequelizeTable = function(sequelize, tableName, attributes) {
}
})
}
table.prototype[SequelizeHelper.SQL.addPrefix('set', assocName)] = function(objects, callback) {
table.prototype[Sequelize.Helper.SQL.addPrefix('set', assocName)] = function(objects, callback) {
var self = this
var Association = sequelize.tables[SequelizeHelper.SQL.manyToManyTableName(_table, table)].klass
var Association = sequelize.tables[Sequelize.Helper.SQL.manyToManyTableName(_table, table)].klass
var currentAssociations = null
var objectIds = SequelizeHelper.Array.map(objects, function(obj) { return obj.id })
var objectIds = Sequelize.Helper.Array.map(objects, function(obj) { return obj.id })
var getAssociatedObjects = function(callback) {
self[assocName](function(associations) {
......@@ -180,8 +180,8 @@ SequelizeTable = function(sequelize, tableName, attributes) {
)
}
var createNewAssociations = function(obsolete) {
var currentIds = SequelizeHelper.Array.map(currentAssociations, function(assoc) { return assoc.id })
var withoutExisting = SequelizeHelper.Array.reject(objects, function(o) {
var currentIds = Sequelize.Helper.Array.map(currentAssociations, function(assoc) { return assoc.id })
var withoutExisting = Sequelize.Helper.Array.reject(objects, function(o) {
currentIds.indexOf(o.id) > -1
})
var savings = []
......@@ -209,18 +209,18 @@ SequelizeTable = function(sequelize, tableName, attributes) {
var whereConditions = [table.identifier, this.id].join("=")
_table.findAll({where: whereConditions}, callback)
}
table.prototype[SequelizeHelper.SQL.addPrefix('set', assocName)] = function(objects, callback) {
table.prototype[Sequelize.Helper.SQL.addPrefix('set', assocName)] = function(objects, callback) {
var self = this
var objectIds = SequelizeHelper.Array.map(objects, function(obj) { return obj.id })
var objectIds = Sequelize.Helper.Array.map(objects, function(obj) { return obj.id })
this[assocName](function(currentAssociations) {
var currentIds = SequelizeHelper.Array.map(currentAssociations, function(assoc) { return assoc.id })
var obsoleteAssociations = SequelizeHelper.Array.select(currentAssociations, function(assoc) { return objectsIds.indexOf(assoc.id) == -1 })
var currentIds = Sequelize.Helper.Array.map(currentAssociations, function(assoc) { return assoc.id })
var obsoleteAssociations = Sequelize.Helper.Array.select(currentAssociations, function(assoc) { return objectsIds.indexOf(assoc.id) == -1 })
var queries = []
obsoleteAssociations.forEach(function(assoc) {
var attr = {}; attr[table.identifier] = null
queries.push({updateAttributes: assoc, params: [attr]})
})
var newAssociations = SequelizeHelper.Array.select(objects, function(o) { return currentIds.indexOf(o.id) == -1 })
var newAssociations = Sequelize.Helper.Array.select(objects, function(o) { return currentIds.indexOf(o.id) == -1 })
newAssociations.forEach(function(assoc) {
var attr = {}; attr[table.identifier] = self.id
queries.push({updateAttributes: assoc, params: [attr]})
......@@ -248,7 +248,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
_table.find(whereConditions, callback)
}
table.prototype[SequelizeHelper.SQL.addPrefix('set', assocName)] = function(object, callback) {
table.prototype[Sequelize.Helper.SQL.addPrefix('set', assocName)] = function(object, callback) {
var self = this
this[assocName](function(currentAssociation) {
......@@ -286,7 +286,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
_table.find(this[_table.identifier], callback)
}
table.prototype[SequelizeHelper.SQL.addPrefix('set', assocName)] = function(object, callback) {
table.prototype[Sequelize.Helper.SQL.addPrefix('set', assocName)] = function(object, callback) {
var attr = {}; attr[object.table.identifier] = object.id
var self = this
this.updateAttributes(attr, function() {
......@@ -298,7 +298,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
}
}
// don't put this into the hash!
classMethods.identifier = SequelizeHelper.SQL.asTableIdentifier(classMethods.tableName)
classMethods.identifier = Sequelize.Helper.SQL.asTableIdentifier(classMethods.tableName)
// instance methods
table.prototype = {
......@@ -306,7 +306,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
var result = {}
var self = this
SequelizeHelper.Hash.keys(table.attributes).forEach(function(attribute) {
Sequelize.Helper.Hash.keys(table.attributes).forEach(function(attribute) {
result[attribute] = (typeof self[attribute] == "undefined") ? null : self[attribute]
})
......@@ -322,11 +322,11 @@ SequelizeTable = function(sequelize, tableName, attributes) {
this.createdAt = new Date()
query = Sequelize.sqlQueryFor('insert', {
table: table.tableName,
fields: SequelizeHelper.SQL.fieldsForInsertQuery(this),
values: SequelizeHelper.SQL.valuesForInsertQuery(this)
fields: Sequelize.Helper.SQL.fieldsForInsertQuery(this),
values: Sequelize.Helper.SQL.valuesForInsertQuery(this)
})
} else
query = Sequelize.sqlQueryFor('update', { table: table.tableName, values: SequelizeHelper.SQL.valuesForUpdate(this), id: this.id })
query = Sequelize.sqlQueryFor('update', { table: table.tableName, values: Sequelize.Helper.SQL.valuesForUpdate(this), id: this.id })
sequelize.query(query, function(result, stats) {
self.id = self.id || stats.insert_id
......@@ -336,7 +336,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
updateAttributes: function(newValues, callback) {
var self = this
SequelizeHelper.Hash.keys(table.attributes).forEach(function(attribute) {
Sequelize.Helper.Hash.keys(table.attributes).forEach(function(attribute) {
if(typeof newValues[attribute] != 'undefined')
self[attribute] = newValues[attribute]
})
......@@ -352,7 +352,7 @@ SequelizeTable = function(sequelize, tableName, attributes) {
}
}
SequelizeHelper.Hash.forEach(classMethods, function(method, methodName) {
Sequelize.Helper.Hash.forEach(classMethods, function(method, methodName) {
table[methodName] = method
})
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!