diff options
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/gears/basestore.js')
-rw-r--r-- | contexts/data/lib/closure-library/closure/goog/gears/basestore.js | 521 |
1 files changed, 0 insertions, 521 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/gears/basestore.js b/contexts/data/lib/closure-library/closure/goog/gears/basestore.js deleted file mode 100644 index 5db01fa..0000000 --- a/contexts/data/lib/closure-library/closure/goog/gears/basestore.js +++ /dev/null @@ -1,521 +0,0 @@ -// Copyright 2006 The Closure Library Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS-IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @fileoverview Definition of goog.gears.BaseStore which - * is a base class for the various database stores. It provides - * the basic structure for creating, updating and removing the store, as well - * as versioning. It also provides ways to interconnect stores. - * - */ - -goog.provide('goog.gears.BaseStore'); -goog.provide('goog.gears.BaseStore.SchemaType'); - -goog.require('goog.Disposable'); - - - -/** - * This class implements the common store functionality - * - * @param {goog.gears.Database} database The data base to store the data in. - * @constructor - * @extends {goog.Disposable} - */ -goog.gears.BaseStore = function(database) { - goog.Disposable.call(this); - - /** - * The underlying database that holds the message store. - * @private - * @type {goog.gears.Database} - */ - this.database_ = database; -}; -goog.inherits(goog.gears.BaseStore, goog.Disposable); - - -/** - * Schema definition types - * @enum {number} - */ -goog.gears.BaseStore.SchemaType = { - TABLE: 1, - VIRTUAL_TABLE: 2, - INDEX: 3, - BEFORE_INSERT_TRIGGER: 4, - AFTER_INSERT_TRIGGER: 5, - BEFORE_UPDATE_TRIGGER: 6, - AFTER_UPDATE_TRIGGER: 7, - BEFORE_DELETE_TRIGGER: 8, - AFTER_DELETE_TRIGGER: 9 -}; - - -/** - * The name of the store. Subclasses should override and choose their own - * name. That name is used for the maintaining the version string - * @protected - * @type {string} - */ -goog.gears.BaseStore.prototype.name = 'Base'; - - -/** - * The version number of the database schema. It is used to determine whether - * the store's portion of the database needs to be updated. Subclassses should - * override this value. - * @protected - * @type {number} - */ -goog.gears.BaseStore.prototype.version = 1; - - -/** - * The database schema for the store. This is an array of objects, where each - * object describes a database object (table, index, trigger). Documentation - * about the object's fields can be found in the #createSchema documentation. - * This is in the prototype so that it can be overriden by the subclass. This - * field is read only. - * @protected - * @type {Array.<Object>} - */ -goog.gears.BaseStore.prototype.schema = []; - - -/** - * Gets the underlying database. - * @return {goog.gears.Database} - * @protected - */ -goog.gears.BaseStore.prototype.getDatabaseInternal = function() { - return this.database_; -}; - - -/** - * Updates the tables for the message store in the case where - * they are out of date. - * - * @protected - * @param {number} persistedVersion the current version of the tables in the - * database. - */ -goog.gears.BaseStore.prototype.updateStore = function(persistedVersion) { - // TODO(user): Need to figure out how to handle updates - // where to store the version number and is it globale or per unit. -}; - - -/** - * Preloads any applicable data into the tables. - * - * @protected - */ -goog.gears.BaseStore.prototype.loadData = function() { -}; - - -/** - * Creates in memory cache of data that is stored in the tables. - * - * @protected - */ -goog.gears.BaseStore.prototype.getCachedData = function() { -}; - - -/** - * Informs other stores that this store exists . - * - * @protected - */ -goog.gears.BaseStore.prototype.informOtherStores = function() { -}; - - -/** - * Makes sure that tables needed for the store exist and are up to date. - */ -goog.gears.BaseStore.prototype.ensureStoreExists = function() { - var persistedVersion = this.getStoreVersion(); - - if (persistedVersion) { - if (persistedVersion != this.version) { - // update - this.database_.begin(); - try { - this.updateStore(persistedVersion); - this.setStoreVersion_(this.version); - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - throw Error('Could not update the ' + this.name + ' schema ' + - ' from version ' + persistedVersion + ' to ' + this.version + - ': ' + (ex.message || 'unknown exception')); - } - } - } else { - // create - this.database_.begin(); - try { - // This is rarely necessary, but it's possible if we rolled back a - // release and dropped the schema on version n-1 before installing - // again on version n. - this.dropSchema(this.schema); - - this.createSchema(this.schema); - - // Ensure that the version info schema exists. - this.createSchema([{ - type: goog.gears.BaseStore.SchemaType.TABLE, - name: 'StoreVersionInfo', - columns: [ - 'StoreName TEXT NOT NULL PRIMARY KEY', - 'Version INTEGER NOT NULL' - ]}], true); - this.loadData(); - this.setStoreVersion_(this.version); - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - throw Error('Could not create the ' + this.name + ' schema' + - ': ' + (ex.message || 'unknown exception')); - } - } - this.getCachedData(); - this.informOtherStores(); -}; - - -/** - * Removes the tables for the MessageStore - */ -goog.gears.BaseStore.prototype.removeStore = function() { - this.database_.begin(); - try { - this.removeStoreVersion(); - this.dropSchema(this.schema); - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - throw Error('Could not remove the ' + this.name + ' schema' + - ': ' + (ex.message || 'unknown exception')); - } -}; - - -/** - * Returns the name of the store. - * - * @return {string} The name of the store. - */ -goog.gears.BaseStore.prototype.getName = function() { - return this.name; -}; - - -/** - * Returns the version number for the specified store - * - * @return {number} The version number of the store. Returns 0 if the - * store does not exist. - */ -goog.gears.BaseStore.prototype.getStoreVersion = function() { - try { - return /** @type {number} */ (this.database_.queryValue( - 'SELECT Version FROM StoreVersionInfo WHERE StoreName=?', - this.name)) || 0; - } catch (ex) { - return 0; - } -}; - - -/** - * Sets the version number for the specified store - * - * @param {number} version The version number for the store. - * @private - */ -goog.gears.BaseStore.prototype.setStoreVersion_ = function(version) { - // TODO(user): Need to determine if we should enforce the fact - // that store versions are monotonically increasing. - this.database_.execute( - 'INSERT OR REPLACE INTO StoreVersionInfo ' + - '(StoreName, Version) VALUES(?,?)', - this.name, - version); -}; - - -/** - * Removes the version number for the specified store - */ -goog.gears.BaseStore.prototype.removeStoreVersion = function() { - try { - this.database_.execute( - 'DELETE FROM StoreVersionInfo WHERE StoreName=?', - this.name); - } catch (ex) { - // Ignore error - part of bootstrap process. - } -}; - - -/** - * Generates an SQLITE CREATE TRIGGER statement from a definition array. - * @param {string} onStr the type of trigger to create. - * @param {Object} def a schema statement definition. - * @param {string} notExistsStr string to be included in the create - * indicating what to do. - * @return {string} the statement. - * @private - */ -goog.gears.BaseStore.prototype.getCreateTriggerStatement_ = - function(onStr, def, notExistsStr) { - return 'CREATE TRIGGER ' + notExistsStr + def.name + ' ' + - onStr + ' ON ' + def.tableName + - (def.when ? (' WHEN ' + def.when) : '') + - ' BEGIN ' + def.actions.join('; ') + '; END'; -}; - - -/** - * Generates an SQLITE CREATE statement from a definition object. - * @param {Object} def a schema statement definition. - * @param {boolean=} opt_ifNotExists true if the table or index should be - * created only if it does not exist. Otherwise trying to create a table - * or index that already exists will result in an exception being thrown. - * @return {string} the statement. - * @private - */ -goog.gears.BaseStore.prototype.getCreateStatement_ = - function(def, opt_ifNotExists) { - var notExists = opt_ifNotExists ? 'IF NOT EXISTS ' : ''; - switch (def.type) { - case goog.gears.BaseStore.SchemaType.TABLE: - return 'CREATE TABLE ' + notExists + def.name + ' (\n' + - def.columns.join(',\n ') + - ')'; - case goog.gears.BaseStore.SchemaType.VIRTUAL_TABLE: - return 'CREATE VIRTUAL TABLE ' + notExists + def.name + - ' USING FTS2 (\n' + def.columns.join(',\n ') + ')'; - case goog.gears.BaseStore.SchemaType.INDEX: - return 'CREATE' + (def.isUnique ? ' UNIQUE' : '') + - ' INDEX ' + notExists + def.name + ' ON ' + - def.tableName + ' (\n' + def.columns.join(',\n ') + ')'; - case goog.gears.BaseStore.SchemaType.BEFORE_INSERT_TRIGGER: - return this.getCreateTriggerStatement_('BEFORE INSERT', def, notExists); - case goog.gears.BaseStore.SchemaType.AFTER_INSERT_TRIGGER: - return this.getCreateTriggerStatement_('AFTER INSERT', def, notExists); - case goog.gears.BaseStore.SchemaType.BEFORE_UPDATE_TRIGGER: - return this.getCreateTriggerStatement_('BEFORE UPDATE', def, notExists); - case goog.gears.BaseStore.SchemaType.AFTER_UPDATE_TRIGGER: - return this.getCreateTriggerStatement_('AFTER UPDATE', def, notExists); - case goog.gears.BaseStore.SchemaType.BEFORE_DELETE_TRIGGER: - return this.getCreateTriggerStatement_('BEFORE DELETE', def, notExists); - case goog.gears.BaseStore.SchemaType.AFTER_DELETE_TRIGGER: - return this.getCreateTriggerStatement_('AFTER DELETE', def, notExists); - } - return ''; -}; - - -/** - * Generates an SQLITE DROP statement from a definition array. - * @param {Object} def a schema statement definition. - * @return {string} the statement. - * @private - */ -goog.gears.BaseStore.prototype.getDropStatement_ = function(def) { - switch (def.type) { - case goog.gears.BaseStore.SchemaType.TABLE: - case goog.gears.BaseStore.SchemaType.VIRTUAL_TABLE: - return 'DROP TABLE IF EXISTS ' + def.name; - case goog.gears.BaseStore.SchemaType.INDEX: - return 'DROP INDEX IF EXISTS ' + def.name; - case goog.gears.BaseStore.SchemaType.BEFORE_INSERT_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_INSERT_TRIGGER: - case goog.gears.BaseStore.SchemaType.BEFORE_UPDATE_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_UPDATE_TRIGGER: - case goog.gears.BaseStore.SchemaType.BEFORE_DELETE_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_DELETE_TRIGGER: - return 'DROP TRIGGER IF EXISTS ' + def.name; - } - return ''; -}; - - -/** - * Creates tables and indicies in the target database. - * - * @param {Array} defs definition arrays. This is an array of objects - * where each object describes a database object to create and drop. - * each object contains a 'type' field which of type - * goog.gears.BaseStore.SchemaType. Each object also contains a - * 'name' which contains the name of the object to create. - * A table object contains a 'columns' field which is an array - * that contains the column definitions for the table. - * A virtual table object contains c 'columns' field which contains - * the name of the columns. They are assumed to be of type text. - * An index object contains a 'tableName' field which is the name - * of the table that the index is on. It contains an 'isUnique' - * field which is a boolean indicating whether the index is - * unqiue or not. It also contains a 'columns' field which is - * an array that contains the columns names (possibly along with the - * ordering) that form the index. - * The trigger objects contain a 'tableName' field indicating the - * table the trigger is on. The type indicates the type of trigger. - * The trigger object may include a 'when' field which contains - * the when clause for the trigger. The trigger object also contains - * an 'actions' field which is an array of strings containing - * the actions for this trigger. - * @param {boolean=} opt_ifNotExists true if the table or index should be - * created only if it does not exist. Otherwise trying to create a table - * or index that already exists will result in an exception being thrown. - */ -goog.gears.BaseStore.prototype.createSchema = function(defs, opt_ifNotExists) { - this.database_.begin(); - try { - for (var i = 0; i < defs.length; ++i) { - var sql = this.getCreateStatement_(defs[i], opt_ifNotExists); - this.database_.execute(sql); - } - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - } -}; - - -/** - * Drops tables and indicies in a target database. - * - * @param {Array} defs Definition arrays. - */ -goog.gears.BaseStore.prototype.dropSchema = function(defs) { - this.database_.begin(); - try { - for (var i = defs.length - 1; i >= 0; --i) { - this.database_.execute(this.getDropStatement_(defs[i])); - } - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - } -}; - - -/** - * Creates triggers specified in definitions. Will first attempt - * to drop the trigger with this name first. - * - * @param {Array} defs Definition arrays. - */ -goog.gears.BaseStore.prototype.createTriggers = function(defs) { - this.database_.begin(); - try { - for (var i = 0; i < defs.length; i++) { - var def = defs[i]; - switch (def.type) { - case goog.gears.BaseStore.SchemaType.BEFORE_INSERT_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_INSERT_TRIGGER: - case goog.gears.BaseStore.SchemaType.BEFORE_UPDATE_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_UPDATE_TRIGGER: - case goog.gears.BaseStore.SchemaType.BEFORE_DELETE_TRIGGER: - case goog.gears.BaseStore.SchemaType.AFTER_DELETE_TRIGGER: - this.database_.execute('DROP TRIGGER IF EXISTS ' + def.name); - this.database_.execute(this.getCreateStatement_(def)); - break; - } - } - this.database_.commit(); - } catch (ex) { - this.database_.rollback(ex); - } -}; - - -/** - * Returns true if the table exists in the database - * - * @param {string} name The table name. - * @return {boolean} Whether the table exists in the database. - */ -goog.gears.BaseStore.prototype.hasTable = function(name) { - return this.hasInSchema_('table', name); -}; - - -/** - * Returns true if the index exists in the database - * - * @param {string} name The index name. - * @return {boolean} Whether the index exists in the database. - */ -goog.gears.BaseStore.prototype.hasIndex = function(name) { - return this.hasInSchema_('index', name); -}; - - -/** - * @param {string} name The name of the trigger. - * @return {boolean} Whether the schema contains a trigger with the given name. - */ -goog.gears.BaseStore.prototype.hasTrigger = function(name) { - return this.hasInSchema_('trigger', name); -}; - - -/** - * Returns true if the database contains the index or table - * - * @private - * @param {string} type The type of object to test for, 'table' or 'index'. - * @param {string} name The table or index name. - * @return {boolean} Whether the database contains the index or table. - */ -goog.gears.BaseStore.prototype.hasInSchema_ = function(type, name) { - return this.database_.queryValue('SELECT 1 FROM SQLITE_MASTER ' + - 'WHERE TYPE=? AND NAME=?', - type, - name) != null; -}; - - -/** @override */ -goog.gears.BaseStore.prototype.disposeInternal = function() { - goog.gears.BaseStore.superClass_.disposeInternal.call(this); - this.database_ = null; -}; - - -/** - * HACK(arv): The JSCompiler check for undefined properties sees that these - * fields are never set and raises warnings. - * @type {Array.<Object>} - * @private - */ -goog.gears.schemaDefDummy_ = [ - { - type: '', - name: '', - when: '', - tableName: '', - actions: [], - isUnique: false - } -]; |