/* * Copyright 2010 Arthur Zaczek <arthur@dasz.at>, dasz.at OG; All rights reserved. * Copyright 2010 David Schmitt <david@dasz.at>, dasz.at OG; All rights reserved. * * This file is part of Kolab Sync for Android. * Kolab Sync for Android 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. * Kolab Sync for Android 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 Kolab Sync for Android. * If not, see <http://www.gnu.org/licenses/>. */ package at.dasz.KolabDroid.Provider; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import at.dasz.KolabDroid.Sync.CacheEntry; public abstract class LocalCacheProvider { public final static String CONTACT_TABLE_NAME = "Contacts"; public final static String CALENDAR_TABLE_NAME = "CalendarEntries"; public final static String COL_LOCAL_ID = "localid"; public final static String COL_LOCAL_HASH = "localhash"; public final static String COL_REMOTE_ID = "remoteid"; public final static String COL_REMOTE_IMAP_UID = "remoteimapuid"; public final static String COL_REMOTE_CHANGEDDATE = "remotechangeddate"; public final static String COL_REMOTE_SIZE = "remotesize"; public final static String COL_REMOTE_HASH = "remotehash"; public final static int COL_IDX_LOCAL_ID = 1; public final static int COL_IDX_LOCAL_HASH = 2; public final static int COL_IDX_REMOTE_ID = 3; public final static int COL_IDX_REMOTE_IMAP_UID = 4; public final static int COL_IDX_REMOTE_CHANGEDDATE = 5; public final static int COL_IDX_REMOTE_SIZE = 6; public final static int COL_IDX_REMOTE_HASH = 7; public static final String[] DEFAULT_PROJECTION = new String[] { DatabaseHelper.COL_ID, // 0 COL_LOCAL_ID, // 1 COL_LOCAL_HASH, // 2 COL_REMOTE_ID, // 3 COL_REMOTE_IMAP_UID, // 4 COL_REMOTE_CHANGEDDATE, // 5 COL_REMOTE_SIZE, // 6 COL_REMOTE_HASH, // 7 }; public static class CalendarCacheProvider extends LocalCacheProvider { public CalendarCacheProvider(Context ctx) { super(ctx, LocalCacheProvider.CALENDAR_TABLE_NAME); } } public static class ContactsCacheProvider extends LocalCacheProvider { public ContactsCacheProvider(Context ctx) { super(ctx, LocalCacheProvider.CONTACT_TABLE_NAME); } } private DatabaseHelper dbHelper; private final String tableName; protected LocalCacheProvider(Context ctx, String tableName) { dbHelper = new DatabaseHelper(ctx); this.tableName = tableName; } private Cursor getCursor(SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(tableName); return qb.query(db, projectionIn, selection, selectionArgs, groupBy, having, sortOrder); } public static void resetDatabase(Context ctx) { DatabaseHelper dbHelper = new DatabaseHelper(ctx); SQLiteDatabase db = dbHelper.getWritableDatabase(); try { dbHelper.cleanDb(db); } finally { if (db != null) db.close(); } } public CacheEntry getEntryFromRemoteId(String remoteId) { return getEntry(COL_REMOTE_ID + " = ?", new String[] { remoteId }); } public CacheEntry getEntryFromLocalId(int localId) { return getEntry(COL_LOCAL_ID + " = " + Integer.toString(localId), null); } private CacheEntry getEntry(String selection, String[] selectionArgs) { SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor c = null; try { c = getCursor(db, DEFAULT_PROJECTION, selection, selectionArgs // COL_REMOTE_ID // + " = ?", /* new String[] { id } */, null, null, null); switch (c.getCount()) { case 0: return null; case 1: c.moveToFirst(); return new CacheEntry(c); default: throw new RuntimeException( "Multiple cache entries for the same remote ID found"); } } finally { if (c != null) c.close(); if (db != null) db.close(); } } public void deleteEntry(CacheEntry entry) { SQLiteDatabase db = dbHelper.getWritableDatabase(); try { db.delete(this.tableName, DatabaseHelper.COL_ID + " = " + entry.getId(), null); } finally { if (db != null) db.close(); } } public void saveEntry(CacheEntry newlyCreated) { SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor c = null; try { c = getCursor(db, DatabaseHelper.ID_PROJECTION, COL_LOCAL_ID + " = " + newlyCreated.getLocalId(), null, null, null, null); if (c.moveToFirst()) { newlyCreated.setId(c.getInt(DatabaseHelper.COL_IDX_ID)); db.update(tableName, newlyCreated.toContentValues(), DatabaseHelper.COL_ID + " = " + newlyCreated.getId(), null); } else { long rowId = db.insertOrThrow(tableName, null, newlyCreated .toContentValues()); newlyCreated.setId(rowId); } } finally { if (c != null) c.close(); if (db != null) db.close(); } } }