1 var Type = require("./index").Type, 2 comb = require("comb"); 3 4 var dateDefaults = { 5 allowNull : true, 6 primaryKey : false, 7 foreignKey : false, 8 "default" : null, 9 unique : false, 10 description : "" 11 }; 12 13 14 var setDateType = function(type, cmpFun) { 15 return function(val) { 16 if (!comb.isDate(val)) { 17 var patt = "yyyy"; 18 if (type == "TIME") { 19 patt = "h:m:s"; 20 } else if (type == "DATE") { 21 patt += "-MM-dd"; 22 } else if ((type == "DATETIME" || type == 'TIMESTAMP')) { 23 patt += "-MM-dd h:m:s"; 24 } 25 val = comb.date.parse(val, patt); 26 if (!val) { 27 throw new Error("DATE must be formatted as " + patt); 28 } 29 } 30 cmpFun && cmpFun(val); 31 return val; 32 }; 33 }; 34 35 var checkDateType = function(type) { 36 return function(val) { 37 if (!(val instanceof Date)) { 38 throw new Error(type + " requires a date type"); 39 } 40 }; 41 }; 42 43 /** 44 * Mysql DATE datatype 45 * 46 * @function 47 * @param {Object} options options for the DATE data type. 48 * @param {Boolean} [options.allowNull=true] should the field allow null 49 * @param {Boolean} [options.default = null] default value of the field 50 * @param {Boolean} [options.unsigned = false] unsigned number 51 * @param {Boolean} [options.description = ""] description fo the field. 52 * 53 * @return {Type} A Type representing a DATE column. 54 * 55 * @name DATE 56 * @memberOf moose.adapters.mysql.types 57 * 58 */ 59 exports.DATE = function(options) { 60 var ops = comb.merge({}, dateDefaults, {type : "DATE"}, options || {}); 61 ops.setSql = setDateType(ops.type, checkDateType(ops.type)); 62 ops.checkType = checkDateType(ops.type); 63 return new Type(ops); 64 }; 65 66 /** 67 * Mysql TIME datatype 68 * 69 * @function 70 * @param {Object} options options for the TIME data type. 71 * @param {Boolean} [options.allowNull=true] should the field allow null 72 * @param {Boolean} [options.default = null] default value of the field 73 * @param {Boolean} [options.unsigned = false] unsigned number 74 * @param {Boolean} [options.description = ""] description fo the field. 75 * 76 * @return {Type} A Type representing a TIME column. 77 * 78 * @name TIME 79 * @memberOf moose.adapters.mysql.types 80 * 81 */ 82 exports.TIME = function(options) { 83 var ops = comb.merge({}, dateDefaults, {type : "TIME"}, options || {}); 84 ops.setSql = setDateType(ops.type, checkDateType(ops.type)); 85 ops.checkType = checkDateType(ops.type); 86 return new Type(ops); 87 }; 88 89 90 /** 91 * Mysql TIMESTAMP datatype 92 * 93 * @function 94 * @param {Object} options options for the TIMESTAMP data type. 95 * @param {Boolean} [options.allowNull=true] should the field allow null 96 * @param {Boolean} [options.default = null] default value of the field 97 * @param {Boolean} [options.unsigned = false] unsigned number 98 * @param {Boolean} [options.description = ""] description fo the field. 99 * 100 * @return {Type} A Type representing a TIMESTAMP column. 101 * 102 * @name TIMESTAMP 103 * @memberOf moose.adapters.mysql.types 104 * 105 */ 106 exports.TIMESTAMP = function(options) { 107 var ops = comb.merge({}, dateDefaults, {type : "TIMESTAMP", allowNull : false}, options || {}); 108 ops.setSql = setDateType(ops.type, checkDateType(ops.type)); 109 ops.checkType = checkDateType(ops.type); 110 return new Type(ops); 111 }; 112 113 114 /** 115 * Mysql YEAR datatype 116 * 117 * @function 118 * @param {Object} options options for the YEAR data type. 119 * @param {Boolean} [options.allowNull=true] should the field allow null 120 * @param {Boolean} [options.default = null] default value of the field 121 * @param {Boolean} [options.unsigned = false] unsigned number 122 * @param {Boolean} [options.description = ""] description fo the field. 123 * 124 * @return {Type} A Type representing a YEAR column. 125 * 126 * @name YEAR 127 * @memberOf moose.adapters.mysql.types 128 * 129 */ 130 exports.YEAR = function(options) { 131 var ops = comb.merge({}, dateDefaults, {type : "YEAR"}, options || {}); 132 ops.setSql = setDateType(ops.type, checkDateType(ops.type)); 133 ops.checkType = checkDateType(ops.type); 134 return new Type(ops); 135 }; 136 137 138 /** 139 * Mysql DATETIME datatype 140 * 141 * @function 142 * @param {Object} options options for the DATETIME data type. 143 * @param {Boolean} [options.allowNull=true] should the field allow null 144 * @param {Boolean} [options.default = null] default value of the field 145 * @param {Boolean} [options.unsigned = false] unsigned number 146 * @param {Boolean} [options.description = ""] description fo the field. 147 * 148 * @return {Type} A Type representing a DATETIME column. 149 * 150 * @name DATETIME 151 * @memberOf moose.adapters.mysql.types 152 * 153 */ 154 exports.DATETIME = function(options) { 155 var ops = comb.merge({}, dateDefaults, {type : "DATETIME"}, options || {}); 156 ops.setSql = setDateType(ops.type, checkDateType(ops.type)); 157 ops.checkType = checkDateType(ops.type); 158 return new Type(ops); 159 };