package by.istin.android.xcore.db.impl;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import by.istin.android.xcore.db.IDBConnection;
import by.istin.android.xcore.db.IDBSupport;
import by.istin.android.xcore.db.entity.IBeforeArrayUpdate;
import by.istin.android.xcore.db.operation.IDBBatchOperationSupport;
import by.istin.android.xcore.source.DataSourceRequest;
import by.istin.android.xcore.source.DataSourceRequestEntity;
import by.istin.android.xcore.source.SyncDataSourceRequestEntity;
import by.istin.android.xcore.utils.ReflectUtils;
/**
* Created with IntelliJ IDEA.
* User: IstiN
* Date: 19.10.13
*/
public abstract class AbstractDBSupport implements IDBSupport {
//we need only one instance of helper
private static DBHelper sDbHelper;
private static final Object sLock = new Object();
private static volatile boolean isInit = false;
private Class<?>[] mEntities;
private void initTables() {
sDbHelper.createTablesForModels(DataSourceRequestEntity.class);
sDbHelper.createTablesForModels(SyncDataSourceRequestEntity.class);
sDbHelper.createTablesForModels(mEntities);
isInit = true;
}
@Override
public void create(Context context, Class<?>[] entities) {
getOrCreateDBHelper(context);
mEntities = entities;
}
public DBHelper getOrCreateDBHelper(Context context) {
synchronized (sLock) {
if (sDbHelper == null) {
sDbHelper = new DBHelper(createConnector(context));
}
}
return sDbHelper;
}
@Override
public IDBBatchOperationSupport getConnectionForBatchOperation() {
synchronized (sLock) {
if (!isInit) {
initTables();
}
}
final IDBConnection writableDatabase = sDbHelper.getWritableDbConnection();
return new IDBBatchOperationSupport() {
@Override
public int delete(String className, String where, String[] whereArgs) {
return sDbHelper.delete(writableDatabase, ReflectUtils.classForName(className), where, whereArgs);
}
@Override
public long updateOrInsert(DataSourceRequest dataSourceRequest, String className, ContentValues initialValues) {
Class<?> classOfModel = ReflectUtils.classForName(className);
IBeforeArrayUpdate beforeArrayUpdate = ReflectUtils.getInstanceInterface(classOfModel, IBeforeArrayUpdate.class);
if (beforeArrayUpdate != null) {
beforeArrayUpdate.onBeforeListUpdate(sDbHelper, writableDatabase, dataSourceRequest, 0, initialValues);
}
return sDbHelper.updateOrInsert(dataSourceRequest, writableDatabase, classOfModel, initialValues);
}
@Override
public void beginTransaction() {
sDbHelper.beginTransaction(writableDatabase);
}
@Override
public void setTransactionSuccessful() {
sDbHelper.setTransactionSuccessful(writableDatabase);
}
@Override
public void endTransaction() {
sDbHelper.endTransaction(writableDatabase);
}
};
}
@Override
public int delete(String className, String where, String[] whereArgs) {
synchronized (sLock) {
if (!isInit) {
initTables();
}
}
Class<?> clazz = ReflectUtils.classForName(className);
return sDbHelper.delete(clazz, where, whereArgs);
}
@Override
public long updateOrInsert(DataSourceRequest dataSourceRequest, String className, ContentValues initialValues) {
synchronized (sLock) {
if (!isInit) {
initTables();
}
}
Class<?> clazz = ReflectUtils.classForName(className);
return sDbHelper.updateOrInsert(dataSourceRequest, clazz, initialValues);
}
@Override
public int updateOrInsert(DataSourceRequest dataSourceRequest, String className, ContentValues[] values) {
synchronized (sLock) {
if (!isInit) {
initTables();
}
}
Class<?> clazz = ReflectUtils.classForName(className);
return sDbHelper.updateOrInsert(dataSourceRequest, clazz, values);
}
@Override
public Cursor rawQuery(String sql, String[] args) {
synchronized (sLock) {
if (!isInit) {
initTables();
}
}
return sDbHelper.rawQuery(sql, args);
}
@Override
public Cursor query(String className, String[] projection, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limitParam) {
synchronized (sLock) {
if (!isInit) {
initTables();
}
}
Class<?> clazz = ReflectUtils.classForName(className);
return sDbHelper.query(clazz, projection, selection, selectionArgs, groupBy, having, sortOrder, limitParam);
}
}