· 9 years ago · Oct 29, 2016, 03:40 AM
1/**
2 * データベースå
3 */
4Backbone.DATABASE_NAME = "backbone";
5
6/**
7 * データベースã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³
8 */
9Backbone.DATABASE_VERSION = "0.1";
10
11/**
12 * データベースã®è¡¨ç¤ºå
13 */
14Backbone.DATABASE_DISPLAY_NAME = "backbone";
15
16/**
17 * データベースã®äºˆæ¸¬ã‚µã‚¤ã‚º
18 */
19Backbone.DATABASE_SIZE = 1024 * 1024;
20
21/**
22 * Web SQL Database 上ã®ãƒ†ãƒ¼ãƒ–ルを表ã—ã¾ã™ã€‚
23 *
24 * @class
25 * @param name テーブルå
26 * @param columns 列ã®å®šç¾©
27 * @example
28 * var table = new Table("user", {
29 * name: "TEXT",
30 * email: "TEXT"
31 * });
32 */
33var Table = function(name, columns) {
34 this.name = name;
35 this.columns = columns;
36};
37/**
38 * データベースを開ãã¾ã™ã€‚
39 */
40Table.openDatabase = function() {
41 return openDatabase(
42 Backbone.DATABASE_NAME,
43 Backbone.DATABASE_VERSION,
44 Backbone.DATABASE_DISPLAY_NAME,
45 Backbone.DATABASE_SIZE);
46};
47/**
48 * データベースを開ã„㦠SQL を実行ã—ã¾ã™ã€‚
49 *
50 * @param sql 実行ã™ã‚‹ SQL
51 * @param params ãƒ—ãƒ¬ãƒ¼ã‚¹ãƒ•ã‚©ãƒ«ãƒ€ã«æ¸¡ã™ãƒ‘ラメータ
52 * @param options オプション
53 * @example
54 * Table.executeSql("SELECT * FROM users", [], {
55 * success: function(result) {
56 * alert(result);
57 * }
58 * });
59 */
60Table.executeSql = function(sql, params, options) {
61 var options = options || {};
62 var db = Table.openDatabase();
63 db.transaction(function(tx) {
64 // 発行ã™ã‚‹ SQL ã¨ãƒ‘ラメータをãƒã‚°ã«å‡ºåŠ›
65 console.log(sql);
66 console.log(params);
67
68 tx.executeSql(sql, params, function(tx, rs) {
69 if (options.success) {
70 options.success(rs);
71 }
72 }, function(tx, error) {
73 if (options.error) {
74 options.error(error);
75 }
76 });
77 });
78};
79/**
80 * テーブルを作æˆã—ã¾ã™ã€‚
81 *
82 * @param options オプション
83 * @example
84 * table.createTable({
85 * success: function(result) {
86 * alert("テーブルã®ä½œæˆã«æˆåŠŸã—ã¾ã—ãŸã€‚");
87 * }
88 * });
89 */
90Table.prototype.createTable = function(options) {
91 var columnNames = "";
92 _.each(this.columns, function(type, col) {
93 columnNames += " , " + col + " " + type;
94 });
95
96 var sql = "CREATE TABLE IF NOT EXISTS "
97 + this.name
98 + " (id INTEGER PRIMARY KEY "
99 + columnNames
100 + " ) ";
101
102 Table.executeSql(sql, [], options);
103};
104/**
105 * テーブルを削除ã—ã¾ã™ã€‚
106 *
107 * @param options オプション
108 * @example
109 * table.dropTable({
110 * success: function(result) {
111 * alert("テーブルã®å‰Šé™¤ã«æˆåŠŸã—ã¾ã—ãŸã€‚");
112 * }
113 * });
114 */
115Table.prototype.dropTable = function(options) {
116 var sql = "DROP TABLE IF EXISTS " + this.name;
117 Table.executeSql(sql, [], options);
118};
119/**
120 * モデルを1ä»¶å–å¾—ã—ã¾ã™ã€‚
121 */
122Table.prototype.find = function(model, options) {
123 var sql = "SELECT * FROM " + this.name + " WHERE id = ?";
124 var params = [model.id];
125
126 // success ã‚’å·®ã—æ›¿ãˆã‚‹
127 if (options.success) {
128 var originalSuccess = options.success;
129 options.success = function(result) {
130 var row = result.rows.item(0);
131 originalSuccess(row);
132 };
133 }
134
135 Table.executeSql(sql, params, options);
136};
137/**
138 * モデルを複数件å–å¾—ã—ã¾ã™ã€‚
139 */
140Table.prototype.findAll = function(collection, options) {
141 // SQL ã®çµ„ã¿ç«‹ã¦
142 var sql = "SELECT * FROM " + this.name;
143 var params = [];
144 if (collection.filterString) {
145 sql += " WHERE " + collection.filterString;
146 if (collection.filterParams) {
147 params = collection.filterParams;
148 }
149 }
150 if (collection.orderString) {
151 sql += " ORDER BY " + collection.orderString;
152 }
153
154 // success ã‚’å·®ã—æ›¿ãˆã‚‹
155 if (options.success) {
156 var originalSuccess = options.success;
157 options.success = function(result) {
158 var models = [];
159 for (var i = 0, len = result.rows.length; i < len; i++) {
160 models.push(result.rows.item(i));
161 }
162 originalSuccess(models);
163 };
164 }
165
166 Table.executeSql(sql, params, options);
167};
168/**
169 * モデルを新ã—ã作æˆã—ã¾ã™ã€‚
170 */
171Table.prototype.create = function(model, options) {
172 // SQL を組ã¿ç«‹ã¦ã‚‹
173 var columnNames = "";
174 var paramNames = "";
175 var params = [];
176 var first = true;
177 _.each(this.columns, function(type, col) {
178 if (!first) {
179 columnNames += " , ";
180 paramNames += " , ";
181 }
182 first = false;
183 columnNames += col;
184 paramNames += "?";
185 var value = model.get(col);
186 params.push(value);
187 }, this);
188 var sql = "INSERT INTO "
189 + this.name
190 + " ( "
191 + columnNames
192 + " ) VALUES ( "
193 + paramNames
194 + " ) ";
195
196 // success ã‚’å·®ã—æ›¿ãˆã‚‹
197 if (options.success) {
198 var originalSuccess = options.success;
199 options.success = function(result) {
200 originalSuccess(model);
201 };
202 }
203
204 // SQL を実行ã™ã‚‹
205 Table.executeSql(sql, params, options);
206};
207/**
208 * モデルを更新ã—ã¾ã™ã€‚
209 */
210Table.prototype.update = function(model, options) {
211 // SQL を組ã¿ç«‹ã¦ã‚‹
212 var columnNames = "";
213 var params = [];
214 var first = true;
215 _.each(this.columns, function(type, col) {
216 if (!first) {
217 columnNames += " , ";
218 }
219 first = false;
220 columnNames += col + " = ? ";
221 var value = model.get(col);
222 params.push(value);
223 }, this);
224 var sql = "UPDATE "
225 + this.name
226 + " SET "
227 + columnNames
228 + " WHERE id = ? ";
229 params.push(model.id);
230
231 // success ã‚’å·®ã—æ›¿ãˆã‚‹
232 if (options.success) {
233 var originalSuccess = options.success;
234 options.success = function(result) {
235 originalSuccess(model);
236 };
237 }
238
239 // SQL を実行ã™ã‚‹
240 Table.executeSql(sql, params, options);
241};
242/**
243 * 指定ã—ãŸãƒ¢ãƒ‡ãƒ«ã‚’削除ã—ã¾ã™ã€‚
244 */
245Table.prototype.destroy = function(model, options) {
246 var sql = "DELETE FROM " + this.name + " WHERE id = ?";
247 var params = [model.id];
248
249 // success ã‚’å·®ã—æ›¿ãˆã‚‹
250 if (options.success) {
251 var originalSuccess = options.success;
252 options.success = function(result) {
253 originalSuccess(model);
254 };
255 }
256
257 Table.executeSql(sql, params, options);
258};
259
260/**
261 * オリジナル㮠sync メソッド。
262 */
263Backbone.originalSync = Backbone.sync;
264
265Backbone.sync = function(method, model, options) {
266 var table = model.table || model.model.prototype.table;
267 switch (method) {
268 case "read":
269 if(model.id) {
270 table.find(model, options);
271 } else {
272 table.findAll(model, options);
273 }
274 break;
275 case "create":
276 table.create(model, options);
277 break;
278 case "update":
279 table.update(model, options);
280 break;
281 case "delete":
282 table.destroy(model, options);
283 break;
284 }
285}