/**
 * Provides an API for storing data in databases that can be queried using an SQL.
 * This API is based on Asynchronous Web SQL Database API (http://www.w3.org/TR/webdatabase/)
 *
 * ## Examples
 *
 * #### Databases
 *
 * Creating and opening a database:
 *
 *     var db = Ext.device.SQLite.openDatabase({
 *         name: 'mydb',
 *         version: '1.0', // is ignored if `creationCallback` is provided
 *         displayName: 'My Database',
 *         estimatedSize: 2 * 1024 * 1024,
 *         creationCallback: function (db) { // optional
 *             // you can set database version here by calling `db.changeVersion(...)` method (see below)
 *         }
 *     });
 *
 * Getting version of a database:
 *
 *     var db = ...;
 *     var version = db.getVersion();
 *
 * Setting version of a database:
 *
 *     var db = ...;
 *     db.changeVersion({
 *         oldVersion: '',
 *         newVersion: '1.0',
 *         callback: function(tx) { // optional
 *             // you can execute SQL statements here by calling `tx.executeSql(...)` methods (see below)
 *         },
 *         success: function() { // optional
 *             console.log('success!');
 *         },
 *         failure: function(err) { // optional
 *             console.log('failed with error: ' + err);
 *         }
 *     });
 *
 * Performing a transaction:
 *
 *     var db = ...;
 *     db.transaction({
 *         callback: function(tx) {
 *             // you can execute SQL statements here by calling `tx.executeSql(...)` methods (see below)
 *         },
 *         success: function() { // optional
 *             console.log('transaction has been successfully commited!');
 *         },
 *         failure: function(err) { // optional
 *             console.log('transaction has been rolled back with error: ' + err);
 *         }
 *     });
 *
 * #### Transactions
 *
 * Executing SQL statements:
 *
 *     function(tx) { // next methods must be called within `db.transaction(...)` or `tx.executeSql(...)` callbacks
 *         tx.executeSql({
 *             sqlStatement: 'CREATE TABLE IF NOT EXISTS foo (id INTEGER PRIMARY KEY, name TEXT, value INTEGER)',
 *             arguments: [], // optional
 *             callback: function(tx, resultSet) { // optional
 *             },
 *             failure: function(tx, err) {
 *                 return true; // return `true` or do not provide `failure` callback to stop executing next SQL statement
 *             }
 *         });
 *         tx.executeSql({
 *             sqlStatement: 'INSERT INTO foo (name, value) VALUES (?, ?)',
 *             arguments: ['xxx', 1], // arguments to bind each `?` placeholder in SQL statement
 *             callback: function(tx, resultSet) { // optional
 *                 var rowId = esultSet.getInsertId(); // throws an exception if SQL statement did not insert a row
 *                 console.log('ID of inserted record: ' + rowId);
 *             },
 *             failure: function(tx, err) {
 *                 return false; // return `false` to continue executing next SQL statement
 *             }
 *         });
 *         tx.executeSql({
 *             sqlStatement: 'SELECT * FROM foo',
 *             callback: function(tx, resultSet) {
 *                 for (var i = 0; i < resultSet.rows.getLength(); ++i) {
 *                     console.log(resultSet.rows.item(i));
 *                 }
 *             },
 *             failure: function(tx, err) { // optional
 *             }
 *         });
 *     }
 *
 * @mixins Ext.device.sqlite.Sencha
 *
 * @aside guide native_apis
 */
Ext.define('Ext.device.SQLite', {
    singleton: true,

    requires: [
        'Ext.device.Communicator',
        'Ext.device.sqlite.Sencha'
    ],

    constructor: function() {
        var browserEnv = Ext.browser.is;
        if(browserEnv.Sencha) {
            return Ext.create('Ext.device.sqlite.Sencha');
        }

        return {};
    }
});