package com.gettingmobile.goodnews.download; 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.Item; import com.gettingmobile.google.reader.Resource; import com.gettingmobile.google.reader.Tag; import com.gettingmobile.google.reader.db.AbstractDatabaseAdapter; import com.gettingmobile.google.reader.db.TagDatabaseAdapter; import java.util.ArrayList; import java.util.List; import static com.gettingmobile.google.reader.db.ItemTable.*; final class ItemDownloadInfoDatabaseAdapter extends AbstractDatabaseAdapter<Item> { private static final TagDatabaseAdapter tagAdapter = new TagDatabaseAdapter(); public ItemDownloadInfoDatabaseAdapter() { super(TABLE_NAME); } public List<Item> readItemDownloadInfosRequiringDownloads(SQLiteDatabase db) { return readList(db.query(TABLE_NAME, new String[] { KEY, ID, FEED_ID, ALTERNATE_HREF, ALTERNATE_MIME_TYPE, HAS_CONTENT, HAS_SUMMARY, HAS_IMAGES, IS_EXTERNAL_CONTENT }, "(hasContent=0 AND NOT alternateHref IS NULL AND alternateHref<>'') OR " + "(hasImages=0 AND (hasContent<>0 OR hasSummary<>0))", null, null, null, null)); } public List<Item> readItemDownloadInfosRequiringDownloads(SQLiteDatabase db, ElementId tagId) { final Tag tag = tagAdapter.readById(db, tagId); if (tag == null) return new ArrayList<Item>(0); return readList(db.rawQuery( "SELECT i._id _id, i.id id, feedId, alternateHref, alternateMimeType, hasContent, hasSummary, hasImages, " + "isExternalContent " + "FROM item i " + "LEFT JOIN itemTag it ON it.itemKey=i._id " + "WHERE it.tagKey=? AND " + " ((hasContent=0 AND NOT alternateHref IS NULL AND alternateHref<>'') OR " + " (hasImages=0 AND (hasContent<>0 OR hasSummary<>0)))", new String[] { Long.toString(tag.getKey()) })); } public int readItemDownloadInfosRequiringDownloadCount(SQLiteDatabase db, ElementId tagId) { final Tag tag = tagAdapter.readById(db, tagId); if (tag == null) return 0; final Cursor c = db.rawQuery( "SELECT COUNT(*) " + "FROM item i " + "LEFT JOIN itemTag it ON it.itemKey=i._id " + "WHERE it.tagKey=? AND " + " ((hasContent=0 AND NOT alternateHref IS NULL AND alternateHref<>'') OR " + " (hasImages=0 AND (hasContent<>0 OR hasSummary<>0)))", new String[] { Long.toString(tag.getKey()) }); try { return c.moveToFirst() ? c.getInt(0) : 0; } finally { c.close(); } } public void writeContent(SQLiteDatabase db, Item item, boolean ignoreSummaryAndContent) { final ContentValues values = new ContentValues(); values.put(HAS_CONTENT, item.hasContent()); values.put(HAS_SUMMARY, item.hasSummary()); values.put(IS_EXTERNAL_CONTENT, item.isExternalContent()); values.put(HAS_IMAGES, item.hasImages()); if (!ignoreSummaryAndContent) { values.put(SUMMARY, item.canStoreSummaryInDb() ? item.getSummary() : null); values.put(CONTENT, item.canStoreContentInDb() ? item.getContent() : null); } db.update(TABLE_NAME, values, KEY + "=" + Long.toString(item.getKey()), null); } public void clearSummarysAndContent(SQLiteDatabase db) { final ContentValues values = new ContentValues(); values.put(HAS_CONTENT, false); values.put(HAS_SUMMARY, false); db.update(TABLE_NAME, values, null, null); } @Override protected void setRowValues(SQLiteDatabase db, ContentValues columns, Item entity, Bundle parameters) { // we will not write complete entities -- so we can leave this empty } @Override protected void attachRowId(Item entity, long id) { entity.setKey(id); } @Override protected Item create() { return new Item(); } @Override public long getRowKey(Cursor c) { return getRowKey(c, KEY); } @Override public Item readCurrent(Cursor c) { final Item item = super.readCurrent(c); item.setKey(getRowKey(c)); item.setId(new ElementId(c.getString(c.getColumnIndex(ID)))); item.setFeedId(new ElementId(c.getString(c.getColumnIndex(FEED_ID)))); final int contentCol = c.getColumnIndex(CONTENT); if (contentCol >= 0) { item.setContent(c.getString(contentCol)); } item.setHasContent(c.getInt(c.getColumnIndex(HAS_CONTENT)) > 0); final int summaryCol = c.getColumnIndex(SUMMARY); if (summaryCol >= 0) { item.setSummary(c.getString(summaryCol)); } item.setHasSummary(c.getInt(c.getColumnIndex(HAS_SUMMARY)) > 0); item.setIsExternalContent(c.getInt(c.getColumnIndex(IS_EXTERNAL_CONTENT)) > 0); item.setHasImages(c.getInt(c.getColumnIndex(HAS_IMAGES)) > 0); final String alternateHref = c.getString(c.getColumnIndex(ALTERNATE_HREF)); if (alternateHref != null) { final Resource alternate = new Resource(); alternate.setHref(alternateHref); alternate.setMimeType(c.getString(c.getColumnIndex(ALTERNATE_MIME_TYPE))); item.setAlternate(alternate); } return item; } }