package fr.lteconsulting.hexa.client.sql;
import java.util.List;
import com.google.gwt.core.client.JavaScriptObject;
import fr.lteconsulting.hexa.classinfo.ClassInfo;
import fr.lteconsulting.hexa.classinfo.Clazz;
import fr.lteconsulting.hexa.client.sql.SqlParser.SqlParseInfo;
import fr.lteconsulting.hexa.client.tools.Action;
import fr.lteconsulting.hexa.shared.dto.PagedResults;
public abstract class BaseSQLiteDAO<T>
{
protected Clazz<T> clazz;
protected SQLite db;
protected Action requestSaveAction;
protected abstract T recordFactory();
public BaseSQLiteDAO( Class<T> clazzz, SQLite db )
{
this( clazzz, db, null );
}
public BaseSQLiteDAO( Class<T> clazzz, SQLite db, Action requestSaveAction )
{
clazz = ClassInfo.Clazz( clazzz );
if( clazz == null )
throw new IllegalArgumentException( "Classe non prise en charge par ClassInfo : " + clazzz.getName() );
this.db = db;
this.requestSaveAction = requestSaveAction;
}
public List<T> getRecords()
{
String request = "select {" + clazz.getClassName() + "} from " + clazz.getClassName() + " order by id";
SqlParser parser = new SqlParser();
SqlParseInfo pi = parser.parse( request );
JavaScriptObject results = db.execute( parser.getSql( pi ) );
SQLiteResult sqliteR = new SQLiteResult( results );
List<T> records = parser.parseResults( pi, sqliteR, clazz.getReflectedClass() );
return records;
}
public PagedResults<T> getRecordsPaged( int offset, int pageSize )
{
String request = "select {" + clazz.getClassName() + "} from " + clazz.getClassName() + " order by id limit " + offset + "," + pageSize;
SqlParser parser = new SqlParser();
SqlParseInfo pi = parser.parse( request );
JavaScriptObject results = db.execute( parser.getSql( pi ) );
SQLiteResult sqliteR = new SQLiteResult( results );
List<T> customers = parser.parseResults( pi, sqliteR, clazz.getReflectedClass() );
results = db.execute( "select count(*) from " + clazz.getClassName() );
sqliteR = new SQLiteResult( results );
int count = 0;
try
{
for( SQLiteResult.Row row : sqliteR )
for( SQLiteResult.Cell cell : row )
{
count = Integer.parseInt( cell.value );
break;
}
}
catch( Exception e )
{
}
PagedResults<T> res = new PagedResults<T>();
res.results = customers;
res.offset = offset;
res.totalNumberResults = count;
return res;
}
public T getRecord( int id )
{
T record = SqlHelper.find( db, clazz.getReflectedClass(), id );
return record;
}
public T updateRecord( T record )
{
SqlHelper.update( db, record );
if( requestSaveAction != null )
requestSaveAction.exec();
return record;
}
public boolean deleteRecord( int id )
{
SqlHelper.delete( db, clazz.getReflectedClass(), id );
if( requestSaveAction != null )
requestSaveAction.exec();
return true;
}
public T createRecord()
{
T record = recordFactory();
SqlHelper.insert( db, record );
if( requestSaveAction != null )
requestSaveAction.exec();
return record;
}
}