package com.jasonrobinson.racer.db; import android.util.Log; import com.j256.ormlite.dao.Dao.CreateOrUpdateStatus; import com.j256.ormlite.stmt.DeleteBuilder; import com.j256.ormlite.stmt.QueryBuilder; import com.jasonrobinson.racer.enumeration.RaceOptions; import com.jasonrobinson.racer.model.Race; import com.jasonrobinson.racer.model.Race.Rule; import java.sql.SQLException; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import javax.inject.Inject; import javax.inject.Singleton; @Singleton public class DatabaseManager { private static final String TAG = DatabaseManager.class.getSimpleName(); @Inject DatabaseHelper mHelper; public List<Race> getRaces(RaceOptions option) { switch (option) { case FINISHED: return getAllFinishedRaces(); case UNFINISHED: return getAllUnfinishedRaces(); case IN_PROGRESS: return getAllInProgressRaces(); case ALL: default: return getAllRaces(); } } private List<Race> getAllRaces() { try { return mHelper.getRaceDao().queryForAll(); } catch (SQLException e) { Log.e(TAG, "Failed to retrieve all races", e); return null; } } private List<Race> getAllFinishedRaces() { try { QueryBuilder<Race, String> queryBuilder = mHelper.getRaceDao().queryBuilder(); queryBuilder.where().le("endAt", new Date(System.currentTimeMillis())); queryBuilder.orderBy("startAt", false); return queryBuilder.query(); } catch (SQLException e) { Log.e(TAG, "Failed to retrieve all finished races", e); return null; } } private List<Race> getAllUnfinishedRaces() { try { QueryBuilder<Race, String> queryBuilder = mHelper.getRaceDao().queryBuilder(); queryBuilder.where().gt("endAt", new Date(System.currentTimeMillis())); queryBuilder.orderBy("startAt", true); return queryBuilder.query(); } catch (SQLException e) { Log.e(TAG, "Failed to retrieve all finished races", e); return null; } } private List<Race> getAllInProgressRaces() { Date now = new Date(System.currentTimeMillis()); try { QueryBuilder<Race, String> queryBuilder = mHelper.getRaceDao().queryBuilder(); queryBuilder.where().gt("endAt", now).and().lt("startAt", now); return queryBuilder.query(); } catch (SQLException e) { Log.e(TAG, "Failed to retrieve all finished races", e); return null; } } public Race getRace(String id) { try { return mHelper.getRaceDao().queryForId(id); } catch (SQLException e) { Log.e(TAG, "Failed to retrieve race with id " + id, e); return null; } } public boolean addOrUpdateRace(Race race) { try { CreateOrUpdateStatus status = mHelper.getRaceDao().createOrUpdate(race); for (Rule rule : race.getRules()) { rule.setRace(race); // Rules could have been added or removed, so remove persisted // rules and add current rules if (status.isUpdated()) { DeleteBuilder<Rule, Long> deleteBuilder = mHelper.getRuleDao().deleteBuilder(); deleteBuilder.where().eq("ruleId", rule.getRuleId()).and().eq("race_id", race.getRaceId()); deleteBuilder.delete(); } mHelper.getRuleDao().createOrUpdate(rule); } return true; } catch (SQLException e) { Log.e(TAG, "Failed to cache a race", e); return false; } } public int addOrUpdateRaceList(final List<Race> races) { try { return mHelper.getRaceDao().callBatchTasks(new Callable<Integer>() { @Override public Integer call() throws Exception { int counter = 0; for (Race race : races) { counter += addOrUpdateRace(race) ? 1 : 0; } return counter; } }); } catch (Exception e) { Log.e(TAG, "Failed to batch cache races", e); } return 0; } }