code: function(tx) {
        // sniff current table info in the database.
        me.getSchema(function(existing_schema) {
          executed = true;
          for (var i = 0; i < schema.count(); i++) {
            var counter = function(ok) {
              if (ok) {
                updated_count++;
              }
            };
            var table_info = existing_schema.getStore(schema.store(i).getName());
            // hint to sniffed schema, so that some lost info are recovered.
            var hinted_store_schema = table_info ?
                table_info.hintForWebSql(schema.store(i)) : null;
  
            me.update_store_with_info_(tx, schema.store(i), counter,
                hinted_store_schema);
          }
  
          for (var j = 0; j < existing_schema.count(); j++) {
            var info_store = existing_schema.store(j);
            if (!schema.hasStore(info_store.getName())) {
              if (schema instanceof ydn.db.schema.EditableDatabase) {
                var edited_schema = schema;
                edited_schema.addStore(info_store);
              } else {
                var sqls = me.prepareDropTable_(info_store);
                for (var i = 0; i < sqls.length; i++) {
                  var sql = sqls[i];
                  goog.log.finer(me.logger, sql);
                  tx.executeSql(sql, [],
                      function(tr) {
                        // ok
                      }, function(tx, e) {
                        throw e;
                      });
                }
              }
            }
          }
  
        }, tx, db);
      }
docs: SQLTransactionCallback
  @param {!SQLTransaction} tx transaction object.