package org.sigmah.offline.indexeddb;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayString;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;
/**
* IndexedDB database.
*
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
* @param <S> Enum type defining the stores contained in the database?
*/
public class Database<S extends Enum<S> & Schema> {
/**
* Native JavaScript instance of this database.
*/
private final IDBDatabase nativeDatabase;
/**
* Enum type containing the store list of this database.
*/
private final Class<S> schema;
Database(IDBDatabase database, Class<S> schema) {
this.nativeDatabase = database;
this.schema = schema;
}
/**
* Retrieves the name of this database.
*
* @return Name of the database.
*/
public String getName() {
return nativeDatabase.getName();
}
/**
* Retrieves the version number of this database.
*
* @return Version number of the database.
*/
public int getVersion() {
return nativeDatabase.getVersion();
}
/**
* Retrieves the schema of this database.
*
* @return Schema of the database.
*/
public Class<S> getSchema() {
return schema;
}
/**
* Closes the database.
*/
public void close() {
nativeDatabase.close();
}
/**
* Retrieves the name of every object store in this database.
*
* @return A set of the object stores names.
*/
public Set<String> getObjectStoreNames() {
final JsArrayString names = nativeDatabase.getObjectStoreNames();
final HashSet<String> result = new HashSet<String>();
for(int index = 0; index < names.length(); index++) {
result.add(names.get(index));
}
return result;
}
/**
* Retrieves every object store in this database.
*
* @return A set of the object stores.
*/
public Set<S> getObjectStores() {
final JsArrayString names = nativeDatabase.getObjectStoreNames();
final EnumSet<S> result = EnumSet.noneOf(schema);
for(int index = 0; index < names.length(); index++) {
try {
final S store = Enum.valueOf(schema, names.get(index));
result.add(store);
} catch (IllegalArgumentException e) {
// Can happen if a store has been renamed or removed.
}
}
return result;
}
/**
* Creates a new object store with the given name.
*
* @param name Name of the store to create.
* @return A new object store.
*/
private ObjectStore createObjectStore(String name) {
return new ObjectStore(nativeDatabase.createObjectStore(name));
}
/**
* Creates a new object store.
*
* @param store Store to create.
* @return A new object store.
*/
public ObjectStore createObjectStore(S store) {
return createObjectStore(store.name());
}
/**
* Creates a new object store with the given name.
*
* @param name Name of the store to create.
* @param keyPath Path to the variable used as the key for the content of the new store.
* @param autoIncrement <code>true</code> to fill the key value with a sequence.
* @return A new object store.
*/
private ObjectStore createObjectStore(String name, String keyPath, boolean autoIncrement) {
return new ObjectStore(nativeDatabase.createObjectStore(name, keyPath, autoIncrement));
}
/**
* Creates a new object store.
*
* @param store Store to create.
* @param keyPath Path to the variable used as the key for the content of the new store.
* @param autoIncrement <code>true</code> to fill the key value with a sequence.
* @return A new object store.
*/
public ObjectStore createObjectStore(S store, String keyPath, boolean autoIncrement) {
return createObjectStore(store.name(), keyPath, autoIncrement);
}
/**
* Remove an object store by its name. Useful to remove an object store
* that was created in a previous version.
*
* @param name Name of the object store to remove.
*/
public void deleteObjectStore(String name) {
nativeDatabase.deleteObjectStore(name);
}
/**
* Remove the given object store.
*
* @param store Store to remove.
*/
public void deleteObjectStore(S store) {
deleteObjectStore(store.name());
}
/**
* Open a new transaction in the given mode.
*
* @param mode Write mode.
* @param stores Stores to access during the transaction.
* @return A new transaction.
* @throws IndexedDBException If an error occurs when opening the transaction.
*/
public Transaction<S> getTransaction(Transaction.Mode mode, Collection<S> stores) throws IndexedDBException {
final JsArrayString array = (JsArrayString) JavaScriptObject.createArray();
for(final S store : stores) {
array.push(store.name());
}
try {
return new Transaction<S>(nativeDatabase.getTransaction(array, mode.getArgument()), mode, stores);
} catch(JavaScriptException e) {
throw new IndexedDBException(e);
}
}
}