SHOW:
|
|
- or go back to the newest paste.
1 | var sqlite3 = require("sqlite3"), | |
2 | _ = require("underscore"), | |
3 | slide = require("slide"), | |
4 | fs = require("fs"); | |
5 | ||
6 | var db; | |
7 | ||
8 | function init(callback) { | |
9 | var self = this; | |
10 | ||
11 | - | var file = "./transcation.sqlite3"; |
11 | + | var file = "./async_transaction.sqlite3"; |
12 | ||
13 | - | fs.unlink(file, function(e) { |
13 | + | db = new sqlite3.Database( |
14 | file, | |
15 | sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, | |
16 | - | db = new sqlite3.Database( |
16 | + | function(err) { |
17 | - | file, |
17 | + | if (err) return callback(err); |
18 | - | sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, |
18 | + | initDatabase(callback); |
19 | } | |
20 | - | if (err) return callback(err); |
20 | + | |
21 | - | initDatabase(callback); |
21 | + | |
22 | ||
23 | function initDatabase(callback) { | |
24 | db.exec( | |
25 | "CREATE TABLE IF NOT EXISTS data (" + | |
26 | "id INTEGER PRIMARY KEY AUTOINCREMENT, " + | |
27 | "t TEXT NOT NULL" + | |
28 | ");" + | |
29 | "DELETE FROM data;", | |
30 | ||
31 | callback | |
32 | - | "); ", |
32 | + | |
33 | } | |
34 | ||
35 | ||
36 | function insertData(callback) { | |
37 | // start a transaction | |
38 | db.exec("BEGIN;", function(err) { | |
39 | //console.log('insertData -> begin'); | |
40 | // do multiple inserts | |
41 | slide.asyncMap( | |
42 | ['all', 'your', 'base', 'are', 'belong', 'to', 'us'], | |
43 | function(item, cb) { | |
44 | db.run("INSERT INTO data (t) VALUES (?)", item, cb); | |
45 | }, | |
46 | function(err) { | |
47 | // all done | |
48 | db.exec("ROLLBACK;", function(e) { | |
49 | //console.log('insertData -> commit'); | |
50 | callback(); | |
51 | }); | |
52 | } | |
53 | ); | |
54 | }); | |
55 | } | |
56 | ||
57 | init(function() { | |
58 | // insert with transaction | |
59 | function doTransactionInsert(e) { | |
60 | if (e) return console.log(e); | |
61 | setTimeout(_.partial(insertData, doTransactionInsert), 10); | |
62 | } | |
63 | doTransactionInsert(); | |
64 | ||
65 | // Insert increasing integers 0, 1, 2, ... | |
66 | var i=0; | |
67 | function doIntegerInsert() { | |
68 | //console.log('integer insert'); | |
69 | db.exec("INSERT INTO data (t) VALUES ('"+(i++)+"')", function(e) { | |
70 | if (e) return console.log(e); | |
71 | setTimeout(doIntegerInsert, 9); | |
72 | }); | |
73 | } | |
74 | doIntegerInsert(); | |
75 | ||
76 | // Check if any inserted integer has disappeared. | |
77 | function checkConsistent() { | |
78 | db.all("SELECT * FROM data WHERE t-1 NOT IN (SELECT t FROM data)", function(err, rows) { | |
79 | for (var i=1; i<rows.length; ++i) { // skip first record - 0 has no predecessor | |
80 | var missingValue = rows[i].t-1; | |
81 | if (_.isNaN(missingValue)) | |
82 | console.log("That shouldn't be here", rows[i].t); | |
83 | else | |
84 | console.log("Not consistent - missing "+missingValue); | |
85 | } | |
86 | console.log("------------"); | |
87 | }); | |
88 | } | |
89 | setInterval(checkConsistent, 2000); | |
90 | ||
91 | ||
92 | }); |