Advertisement
Guest User

Transactions + async = problem

a guest
Oct 9th, 2013
472
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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 = "./async_transaction.sqlite3";
  12.  
  13.     db = new sqlite3.Database(
  14.         file,
  15.         sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE,
  16.         function(err) {
  17.             if (err) return callback(err);
  18.             initDatabase(callback);
  19.         }
  20.     );
  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.     );
  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. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement