package com.gettingmobile.google.reader.sync; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import com.gettingmobile.google.reader.ElementId; import com.gettingmobile.google.reader.db.AbstractDatabaseAdapter; import com.gettingmobile.google.reader.db.ItemTagTable; import com.gettingmobile.google.reader.rest.ItemReference; import com.gettingmobile.util.StringUtils; import java.util.*; import static com.gettingmobile.google.reader.sync.TmpItemReferenceTable.*; public class ItemReferenceDatabaseAdapter extends AbstractDatabaseAdapter<ItemReference> { public ItemReferenceDatabaseAdapter() { super(TABLE_NAME); } public void updateItemReadMarks(SQLiteDatabase db) { db.execSQL("UPDATE item SET read=1, syncedRead=1"); db.execSQL("UPDATE item SET read=0, syncedRead=0 WHERE refId IN (SELECT r.refId FROM tmpItemReference r)"); } public void updateItemTags(SQLiteDatabase db) { /* * delete all assignments */ db.execSQL("DELETE FROM " + ItemTagTable.TABLE_NAME); /* * ensure that no feed folders are attached to items */ db.execSQL("DELETE FROM itemTag WHERE tagKey IN (SELECT t._id FROM tag t WHERE t.isFeedFolder<>0)"); /* * update from item references received during sync */ db.execSQL("INSERT INTO " + ItemTagTable.TABLE_NAME + " (itemKey, tagKey) " + "SELECT i._id, t._id FROM tmpItemReference tir " + "INNER JOIN item i ON i.refId=tir.refId " + "INNER JOIN tag t ON t.id=tir.tag " + "WHERE tir.tag IS NOT NULL"); } public void deleteKnown(SQLiteDatabase db) { db.execSQL("DELETE FROM tmpItemReference WHERE refId IN (SELECT i.refId FROM item i)"); } public void deleteOlder(SQLiteDatabase db, Calendar minTimestamp) { db.execSQL("DELETE FROM tmpItemReference WHERE timestamp<?", new Object[] {ItemReference.getTimestampUSecByDate(minTimestamp)}); } public void deleteBlacklisted(SQLiteDatabase db) { db.execSQL("DELETE FROM tmpItemReference WHERE refId IN (SELECT b.refId FROM itemBlacklist b)"); } public void keepNewest(SQLiteDatabase db, int numberToKeep) { db.execSQL("DELETE FROM tmpItemReference WHERE " + "refId NOT IN (SELECT r.refId FROM tmpItemReference r ORDER BY r.timestamp DESC LIMIT ?)", new String[] {Integer.toString(numberToKeep)}); } public Calendar getMaxTimestamp(SQLiteDatabase db) { final Cursor c = db.rawQuery("SELECT MAX(timestamp) FROM tmpItemReference", null); try { return ItemReference.getDateByTimestampUSec(c.moveToFirst() ? c.getLong(0) : 0); } finally { c.close(); } } public int readCount(SQLiteDatabase db) { final Cursor c = db.rawQuery("SELECT COUNT(*) FROM tmpItemReference", null); try { return c.moveToFirst() ? c.getInt(0) : 0; } finally { c.close(); } } public long[] readAllReferenceIds(SQLiteDatabase db) { final Cursor c = db.rawQuery("SELECT refId FROM tmpItemReference", null); try { final long[] refIds = new long[c.getCount()]; if (c.moveToFirst()) { for (int i = 0; i < refIds.length; ++i) { refIds[i] = c.getLong(0); if (!c.moveToNext()) break; } } return refIds; } finally { c.close(); } } public List<ItemReference> readAll(SQLiteDatabase db) { return readList(db.query(TABLE_NAME, null, null, null, null, null, null)); } public Set<ElementId> readTagIds(SQLiteDatabase db) { final Cursor c = db.rawQuery("SELECT DISTINCT tag FROM tmpItemReference WHERE tag IS NOT NULL", null); try { final Set<ElementId> tagIds = new HashSet<ElementId>(c.getCount()); if (c.moveToFirst()) { do { tagIds.add(new ElementId(c.getString(0))); } while (c.moveToNext()); } return tagIds; } finally { c.close(); } } public void deleteByTagIds(SQLiteDatabase db, Set<ElementId> tagIds) { if (!tagIds.isEmpty()) { db.execSQL("DELETE FROM tmpItemReference WHERE tag IN (" + StringUtils.explode(tagIds, ",", "'") + ")"); } } @Override protected void setRowValues(SQLiteDatabase db, ContentValues columns, ItemReference entity, Bundle parameters) { columns.put(REF_ID, entity.getId()); columns.put(TAG, !entity.getDirectStreamIds().isEmpty() ? entity.getDirectStreamIds().get(0).getId() : null); columns.put(TIMESTAMP, entity.getTimestampUSec()); } @Override protected void attachRowId(ItemReference entity, long id) { // nothing to be done } @Override protected ItemReference create() { return new ItemReference(); } @Override public ItemReference readCurrent(Cursor c) { final ItemReference ref = super.readCurrent(c); ref.setId(c.getLong(c.getColumnIndex(REF_ID))); final String tag = c.getString(c.getColumnIndex(TAG)); if (tag != null) { final List<ElementId> tags = new ArrayList<ElementId>(1); tags.add(new ElementId(tag)); ref.setDirectStreamIds(tags); } ref.setTimestampUSec(c.getLong(c.getColumnIndex(TIMESTAMP))); return ref; } @Override public long getRowKey(Cursor c) { return c.getInt(c.getColumnIndex(KEY)); } }