<!DOCTYPE HTML>
<html>
<title>Pseudo-random transactions</title>
<script src="../head.js"></script>
<script src="../common.js"></script>
<script>
var SELECT_STATEMENT_IN_READ_TRANSACTION = 0;
var SELECT_STATEMENT_IN_TRANSACTION = 1;
var INSERT_STATEMENT = 2;
var UPDATE_STATEMENT = 3;
var DELETE_STATEMENT = 4;
var STATEMENTS =
  [2, 0, 4, 2, 2, 2, 2, 2, 1, 4, 1, 1, 0, 2, 0, 0, 2, 1, 2, 0,
   4, 4, 2, 3, 3, 4, 3, 1, 3, 3, 2, 4, 3, 3, 2, 3, 1, 1, 4, 2,
   4, 1, 4, 2, 3, 0, 4, 2, 4, 0, 4, 3, 3, 2, 0, 2, 1, 4, 4, 4,
   4, 2, 3, 2, 0, 3, 3, 0, 4, 4, 4, 2, 3, 1, 4, 2, 4, 2, 3, 0,
   2, 4, 0, 4, 2, 2, 4, 0, 3, 2, 3, 2, 3, 2, 0, 0, 4, 0, 2, 0];

var transactionsCompleted = 0;
var startTime = 0;

function statementSuccessCallback(tx, data) {}
function statementErrorCallback(tx, error) {}

function transactionSuccessCallback() {
  if (++transactionsCompleted == TRANSACTIONS)
    testComplete(Date.now() - startTime);
}

function transactionErrorCallback(error) {
  testComplete(TEST_FAILED);
}

function customRunTransactions(db) {
  var selectIDCounter = 0;
  var insertIDCounter = 0;
  var updateIDCounter = 0;
  var deleteIDCounter = 0;
  var randomString = getRandomString();
  var randomStringForUpdates = getRandomString();
  startTime = Date.now();
  for (var i = 0; i < TRANSACTIONS; i++) {
    switch (STATEMENTS[i % STATEMENTS.length]) {
      case SELECT_STATEMENT_IN_READ_TRANSACTION:
        db.readTransaction(
            function(tx) {
              tx.executeSql('SELECT * FROM Test WHERE ID = ?',
                            [selectIDCounter++],
                            statementSuccessCallback, statementErrorCallback);
            }, transactionErrorCallback, transactionSuccessCallback);
        break;
      case SELECT_STATEMENT_IN_TRANSACTION:
        db.transaction(
            function(tx) {
              tx.executeSql('SELECT * FROM Test WHERE ID = ?',
                            [selectIDCounter++],
                            statementSuccessCallback, statementErrorCallback);
            }, transactionErrorCallback, transactionSuccessCallback);
        break;
      case INSERT_STATEMENT:
        db.transaction(
            function(tx) {
              tx.executeSql('INSERT INTO Test VALUES (?, ?)',
                            [insertIDCounter++, randomString],
                            statementSuccessCallback, statementErrorCallback);
            }, transactionErrorCallback, transactionSuccessCallback);
        break;
      case UPDATE_STATEMENT:
        db.transaction(
            function(tx) {
              tx.executeSql('UPDATE Test SET Foo = ? WHERE ID = ?',
                            [randomStringForUpdates, updateIDCounter++],
                            statementSuccessCallback, statementErrorCallback);
            }, transactionErrorCallback, transactionSuccessCallback);
        break;
      case DELETE_STATEMENT:
        db.transaction(
            function(tx) {
              tx.executeSql('DELETE FROM Test WHERE ID = ?',
                            [deleteIDCounter++],
                            statementSuccessCallback, statementErrorCallback);
            }, transactionErrorCallback, transactionSuccessCallback);
        break;
      default:
        testComplete(TEST_FAILED);
        return;
    }
  }
}
</script>

<body>
<script>
  runPerformanceTest({
    dbName: "PseudoRandomTransactions",
    readOnly: false,
    insertRowsAtSetup: true,
    transactionCallback: null,
    customRunTransactions: customRunTransactions
  });
</script>
</body>
</html>
