|
1 | 1 | /** |
2 | | - * jSQL.js v2.9 |
| 2 | + * jSQL.js v2.9.1 |
3 | 3 | * A Javascript Query Language Database Engine |
4 | 4 | * @author Robert Parham |
5 | 5 | * @website http://pamblam.github.io/jSQL/ |
|
88 | 88 | case "0065": this.message = "AUTO_INCREMENT column must be a key."; break; |
89 | 89 | case "0066": this.message = "AUTO_INCREMENT column must be an INT type."; break; |
90 | 90 | case "0067": this.message = "API is out of memory, cannot store more data."; break; |
| 91 | + case "0068": this.message = "Invalid ENUM value."; break; |
| 92 | + case "0069": this.message = "NUMERIC or INT type invalid or out of range."; break; |
91 | 93 | default: this.message = "Unknown error."; break; |
92 | 94 | } |
93 | 95 | this.toString = function () { |
|
117 | 119 | aliases: ["NUMBER", "DECIMAL", "FLOAT"], |
118 | 120 | serialize: function(value, args){ |
119 | 121 | return !isNaN(parseFloat(value)) && isFinite(value) ? |
120 | | - parseFloat(value) : 0; |
| 122 | + parseFloat(value) : |
| 123 | + _throw(new jSQL_Error("0069")) ; |
121 | 124 | }, |
122 | 125 | unserialize: function(value, args){ |
123 | 126 | return !isNaN(parseFloat(value)) && isFinite(value) ? |
124 | | - parseFloat(value) : 0; |
| 127 | + parseFloat(value) : |
| 128 | + _throw(new jSQL_Error("0069")) ; |
| 129 | + } |
| 130 | + },{ |
| 131 | + type: "ENUM", |
| 132 | + serialize: function(value, args){ |
| 133 | + for(var i=args.length; i--;) |
| 134 | + if(value.toUpperCase() == removeQuotes(args[i]).toUpperCase()) return removeQuotes(args[i]); |
| 135 | + return _throw(new jSQL_Error("0068")); |
| 136 | + }, |
| 137 | + unserialize: function(value, args){ |
| 138 | + for(var i=args.length; i--;) |
| 139 | + if(value.toUpperCase() == removeQuotes(args[i]).toUpperCase()) return removeQuotes(args[i]); |
| 140 | + return _throw(new jSQL_Error("0068")); |
| 141 | + } |
| 142 | + },{ |
| 143 | + type: "TINYINT", |
| 144 | + serialize: function(value, args){ |
| 145 | + return !isNaN(parseInt(value)) && isFinite(value) && |
| 146 | + value >= -128 && value <= 127 ? |
| 147 | + parseInt(value) : 0; |
| 148 | + }, |
| 149 | + unserialize: function(value, args){ |
| 150 | + return !isNaN(parseInt(value)) && isFinite(value) ? |
| 151 | + parseInt(value) : 0; |
| 152 | + } |
| 153 | + },{ |
| 154 | + type: "SMALLINT", |
| 155 | + serialize: function(value, args){ |
| 156 | + return !isNaN(parseInt(value)) && isFinite(value) && |
| 157 | + value >= -32768 && value <= 32767 ? |
| 158 | + parseInt(value) : |
| 159 | + _throw(new jSQL_Error("0069")) ; |
| 160 | + }, |
| 161 | + unserialize: function(value, args){ |
| 162 | + return !isNaN(parseInt(value)) && isFinite(value) ? |
| 163 | + parseInt(value) : |
| 164 | + _throw(new jSQL_Error("0069")) ; |
| 165 | + } |
| 166 | + },{ |
| 167 | + type: "MEDIUMINT", |
| 168 | + serialize: function(value, args){ |
| 169 | + return !isNaN(parseInt(value)) && isFinite(value) && |
| 170 | + value >= -8388608 && value <= 8388607 ? |
| 171 | + parseInt(value) : |
| 172 | + _throw(new jSQL_Error("0069")) ; |
| 173 | + }, |
| 174 | + unserialize: function(value, args){ |
| 175 | + return !isNaN(parseInt(value)) && isFinite(value) ? |
| 176 | + parseInt(value) : |
| 177 | + _throw(new jSQL_Error("0069")) ; |
| 178 | + } |
| 179 | + },{ |
| 180 | + type: "INT", |
| 181 | + serialize: function(value, args){ |
| 182 | + return !isNaN(parseInt(value)) && isFinite(value) && |
| 183 | + value >= -2147483648 && value <= 2147483647 ? |
| 184 | + parseInt(value) : _throw(new jSQL_Error("0069")); |
| 185 | + }, |
| 186 | + unserialize: function(value, args){ |
| 187 | + return !isNaN(parseInt(value)) && isFinite(value) ? |
| 188 | + parseInt(value) : _throw(new jSQL_Error("0069")); |
| 189 | + } |
| 190 | + },{ |
| 191 | + type: "BIGINT", |
| 192 | + serialize: function(value, args){ |
| 193 | + return !isNaN(parseInt(value)) && isFinite(value) && |
| 194 | + value >= -9007199254740991 && value <= 9007199254740991 ? |
| 195 | + parseInt(value) : _throw(new jSQL_Error("0069")); |
| 196 | + }, |
| 197 | + unserialize: function(value, args){ |
| 198 | + return !isNaN(parseInt(value)) && isFinite(value) ? |
| 199 | + parseInt(value) : _throw(new jSQL_Error("0069")); |
125 | 200 | } |
126 | 201 | },{ |
127 | 202 | type: "JSON", |
128 | | - aliases: ["ARRAY","OBJECT"], |
129 | | - serialize: function(value, args){ |
| 203 | + aliases: ["ARRAY", "OBJECT"], |
| 204 | + serialize: function(value){ |
130 | 205 | return JSON.stringify(value); |
131 | 206 | }, |
132 | | - unserialize: function(value, args){ |
| 207 | + unserialize: function(value){ |
133 | 208 | return JSON.parse(value); |
134 | 209 | } |
135 | 210 | },{ |
136 | 211 | type: "FUNCTION", |
137 | | - serialize: function(value, args){ |
| 212 | + serialize: function(value){ |
138 | 213 | if(typeof value !== "function") value=function(){}; |
139 | 214 | return "jSQLFunct-"+value.toString(); |
140 | 215 | }, |
141 | | - unserialize: function(value, args){ |
| 216 | + unserialize: function(value){ |
142 | 217 | var p = value.split("-"); |
143 | 218 | if(p.shift() !== "jSQLFunct") return _throw(new jSQL_Error("0001")); |
144 | 219 | p = value.split("-"); |
|
153 | 228 | },{ |
154 | 229 | type: "BOOLEAN", |
155 | 230 | aliases: ['BOOL'], |
156 | | - serialize: function(value, args){ return !!value; }, |
157 | | - unserialize: function(value, args){ return !!value; } |
| 231 | + serialize: function(value){ |
| 232 | + return value ? "1" : "0"; |
| 233 | + }, |
| 234 | + unserialize: function(value){ |
| 235 | + return value == "1"; |
| 236 | + } |
158 | 237 | },{ |
159 | | - type: "INT", |
| 238 | + type: "CHAR", |
160 | 239 | serialize: function(value, args){ |
161 | | - return !isNaN(parseInt(value)) && isFinite(value) ? |
162 | | - parseInt(value) : 0; |
| 240 | + return ""+value; |
163 | 241 | }, |
164 | 242 | unserialize: function(value, args){ |
165 | | - return !isNaN(parseInt(value)) && isFinite(value) ? |
166 | | - parseInt(value) : 0; |
| 243 | + var targetLength = args[0]>>0, padString = ' '; |
| 244 | + if (value.length > targetLength) return value.substr(0, args[0]); |
| 245 | + else { |
| 246 | + targetLength = targetLength-value.length; |
| 247 | + if (targetLength > padString.length) |
| 248 | + padString += padString.repeat(targetLength/padString.length); |
| 249 | + return String(value) + padString.slice(0,targetLength); |
| 250 | + } |
| 251 | + return ""+value; |
167 | 252 | } |
168 | 253 | },{ |
169 | | - type: "CHAR", |
170 | | - aliases: ["VARCHAR", "LONGTEXT", "MEDIUMTEXT"], |
171 | | - serialize: function(value, args){ return ""+value; }, |
172 | | - unserialize: function(value, args){ return ""+value; } |
| 254 | + type: "VARCHAR", |
| 255 | + aliases: ["LONGTEXT", "MEDIUMTEXT"], |
| 256 | + serialize: function(value, args){ |
| 257 | + return ""+value; |
| 258 | + }, |
| 259 | + unserialize: function(value, args){ |
| 260 | + return ""+value; |
| 261 | + } |
173 | 262 | },{ |
174 | 263 | type: "DATE", |
175 | | - serialize: function(value, args){ |
| 264 | + serialize: function(value){ |
176 | 265 | if(!value instanceof Date) return new Date(0).getTime(); |
177 | 266 | return value.getTime(); |
178 | 267 | }, |
179 | | - unserialize: function(value, args){ |
| 268 | + unserialize: function(value){ |
180 | 269 | return new Date(value); |
181 | 270 | } |
182 | 271 | },{ |
183 | 272 | type: "AMBI", |
184 | | - serialize: function(value, args){ |
| 273 | + serialize: function(value){ |
185 | 274 | if(value instanceof Date) return value.getTime(); |
186 | 275 | if(typeof value === "function") return "jSQLFunct-"+value.toString(); |
187 | 276 | if(!isNaN(parseFloat(value)) && isFinite(value)) return value; |
188 | 277 | return ""+value; |
189 | 278 | }, |
190 | | - unserialize: function(value, args){ |
| 279 | + unserialize: function(value){ |
191 | 280 | if(typeof value === "string"){ |
192 | 281 | if(value.split("-")[0] === "jSQLFunct"){ |
193 | 282 | var p = value.split("-"); |
|
925 | 1014 |
|
926 | 1015 | function jSQLParseQuery(query){ |
927 | 1016 |
|
928 | | - // Remove surrounding quotes from a string |
929 | | - var removeQuotes = function(str){ |
930 | | - var quotes = ['"', "'", "`"]; |
931 | | - for (var i = quotes.length; i--; ) |
932 | | - if (str.substr(0, 1) == quotes[i] && str.substr(str.length - 1, 1) == quotes[i]) |
933 | | - return str.substr(1, str.length - 2); |
934 | | - return str; |
935 | | - }; |
936 | | - |
937 | 1017 | // Predcit the correct casing for column and table names |
938 | 1018 | var convertToCol = function(c, skipErrors){ |
939 | 1019 | for(var i=0; i<jSQL.tables[table].columns.length; i++) |
|
2487 | 2567 | self.api.init([{name: "jSQL_data_schema", rows:[]}], successCallback); |
2488 | 2568 | APIIsSet = true; |
2489 | 2569 | }catch(ex){ |
2490 | | - console.log(ex); |
2491 | 2570 | APIIsSet = false; |
2492 | 2571 | } |
2493 | 2572 | if(!APIIsSet) loop(1+i); |
|
2656 | 2735 | .trim(); |
2657 | 2736 | } |
2658 | 2737 |
|
| 2738 | + function removeQuotes(str){ |
| 2739 | + var quotes = ['"', "'", "`"]; |
| 2740 | + for (var i = quotes.length; i--; ) |
| 2741 | + if (str.substr(0, 1) == quotes[i] && str.substr(str.length - 1, 1) == quotes[i]) |
| 2742 | + return str.substr(1, str.length - 2); |
| 2743 | + return str; |
| 2744 | + } |
| 2745 | + |
2659 | 2746 | //////////////////////////////////////////////////////////////////////////// |
2660 | 2747 | // Exposed Methods ///////////////////////////////////////////////////////// |
2661 | 2748 | //////////////////////////////////////////////////////////////////////////// |
2662 | 2749 |
|
2663 | 2750 | return { |
2664 | | - version: 2.9, |
| 2751 | + version: 2.91, |
2665 | 2752 | tables: {}, |
2666 | 2753 | query: jSQLParseQuery, |
2667 | 2754 | createTable: createTable, |
|
0 commit comments