/*
* Copyright 2008 Jeff Dwyer
*
* 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.
*/
package com.apress.progwt.client.gears;
import java.util.ArrayList;
import java.util.List;
import com.allen_sauer.gwt.log.client.Log;
import com.apress.progwt.client.json.JSONSerializable;
import com.apress.progwt.client.json.JSONSerializer;
import com.google.gwt.gears.core.client.GearsException;
import com.google.gwt.gears.database.client.Database;
import com.google.gwt.gears.database.client.DatabaseException;
import com.google.gwt.gears.database.client.ResultSet;
/**
* SimpleGearsDatabase wraps a Gears Database with functionality to ease
* development. Features:
*
* GearsRowMapper for easier object unmarshalling, Exception wrapping,
* Vararg usage.
*
*
* @author Jeff Dwyer
*
*/
public class SimpleGearsDatabase extends Database implements ClientDB {
public SimpleGearsDatabase() throws GearsException {
super();
}
public SimpleGearsDatabase(String databaseName) throws GearsException {
super(databaseName);
}
/**
* Pass through for full SQL-Lite commands.
*/
public ResultSet execute(String statement) {
try {
return super.execute(statement);
} catch (DatabaseException e) {
Log.error(statement + " : " + e.getMessage());
throw new RuntimeException(e);
}
}
/**
* Varargs execute() translater var args into String[]
*
* NOTE: This just uses toString() on arguments, so be sure that the
* object arguments will query properly with their toString() value
*
* @param statement
* @param args
* @return
*/
public ResultSet execute(String statement, Object... args) {
String[] strs = new String[args.length];
int i = 0;
for (Object o : args) {
strs[i] = o.toString();
i++;
}
try {
return execute(statement, strs);
} catch (DatabaseException e) {
Log.error(statement + " : " + e.getMessage());
throw new RuntimeException(e);
}
}
/**
* Execute query, then translate rows using a GearsRowMapper.
*
* Note:Uses varargs execute() method, so all Objects arguments will
* have toString() called on them.
*
* @param <T>
* @param sql
* @param mapper
* @param args
* @return
*/
public <T> List<T> query(String sql, GearsRowMapper<T> mapper,
Object... args) {
try {
ResultSet rs = execute(sql, args);
List<T> rtn = new ArrayList<T>();
for (int i = 0; rs.isValidRow(); ++i, rs.next()) {
rtn.add(mapper.mapRow(rs, i));
}
rs.close();
return rtn;
} catch (DatabaseException e) {
Log.error(sql + " : " + e.getMessage());
throw new RuntimeException(e);
}
}
/**
* Helper method when all you want is a single List<String>
*
* @param sql
* @param args
* @return
*/
public List<String> queryForStringList(String sql, Object... args) {
return query(sql, new StringMapper(), args);
}
public void createKeyedStringStore(String tableName) {
execute("drop table if exists " + tableName);
execute("create table if not exists " + tableName
+ " (key varchar(255), json text )");
}
public void addToKeyedStringStore(String tableName, String key,
String value) {
execute("insert into " + tableName + " values (?, ?)", key, value);
}
public <T> List<T> getFromKeyedStringStore(String tableName,
String key, GearsRowMapper<T> mapper) {
return query("select json from " + tableName + " where key = ?",
mapper, key);
}
/**
* Perform serialization before going into the store. Your RowMapper
* should perform deserialization.
*
* @param tableName
* @param key
* @param object
*/
public void addToKeyedStringStore(String tableName, String key,
JSONSerializable object) {
String serialized = JSONSerializer.serialize(object);
execute("insert into " + tableName + " values (?, ?)", key,
serialized);
}
}