diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java new file mode 100644 index 000000000..7144bdaab --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java @@ -0,0 +1,222 @@ +package org.wordpress.android.datasets; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteStatement; + +import org.wordpress.android.models.ReaderComment; +import org.wordpress.android.models.ReaderPost; +import org.wordpress.android.models.ReaderUserIdList; +import org.wordpress.android.models.AccountHelper; +import org.wordpress.android.util.SqlUtils; + +/** + * stores likes for Reader posts and comments + */ +public class ReaderLikeTable { + protected static void createTables(SQLiteDatabase db) { + db.execSQL("CREATE TABLE tbl_post_likes (" + + " post_id INTEGER DEFAULT 0," + + " blog_id INTEGER DEFAULT 0," + + " user_id INTEGER DEFAULT 0," + + " PRIMARY KEY (blog_id, post_id, user_id))"); + + db.execSQL("CREATE TABLE tbl_comment_likes (" + + " comment_id INTEGER DEFAULT 0," + + " blog_id INTEGER DEFAULT 0," + + " user_id INTEGER DEFAULT 0," + + " PRIMARY KEY (blog_id, comment_id, user_id))"); + } + + protected static void dropTables(SQLiteDatabase db) { + db.execSQL("DROP TABLE IF EXISTS tbl_post_likes"); + db.execSQL("DROP TABLE IF EXISTS tbl_comment_likes"); + } + + protected static void reset(SQLiteDatabase db) { + dropTables(db); + createTables(db); + } + + /* + * purge likes attached to posts/comments that no longer exist + */ + protected static int purge(SQLiteDatabase db) { + int numDeleted = db.delete("tbl_post_likes", "post_id NOT IN (SELECT DISTINCT post_id FROM tbl_posts)", null); + numDeleted += db.delete("tbl_comment_likes", "comment_id NOT IN (SELECT DISTINCT comment_id FROM tbl_comments)", null); + return numDeleted; + } + + /* + * returns userIds of users who like the passed post + */ + public static ReaderUserIdList getLikesForPost(ReaderPost post) { + ReaderUserIdList userIds = new ReaderUserIdList(); + if (post == null) { + return userIds; + } + + String[] args = {Long.toString(post.blogId), Long.toString(post.postId)}; + Cursor c = ReaderDatabase.getReadableDb().rawQuery("SELECT user_id FROM tbl_post_likes WHERE blog_id=? AND post_id=?", args); + try { + if (c.moveToFirst()) { + do { + userIds.add(c.getLong(0)); + } while (c.moveToNext()); + } + + return userIds; + } finally { + SqlUtils.closeCursor(c); + } + } + + public static int getNumLikesForPost(ReaderPost post) { + if (post == null) { + return 0; + } + String[] args = {Long.toString(post.blogId), Long.toString(post.postId)}; + return SqlUtils.intForQuery(ReaderDatabase.getReadableDb(), "SELECT count(*) FROM tbl_post_likes WHERE blog_id=? AND post_id=?", args); + } + + public static void setCurrentUserLikesPost(ReaderPost post, boolean isLiked) { + if (post == null) { + return; + } + long currentUserId = AccountHelper.getDefaultAccount().getUserId(); + if (isLiked) { + ContentValues values = new ContentValues(); + values.put("blog_id", post.blogId); + values.put("post_id", post.postId); + values.put("user_id", currentUserId); + ReaderDatabase.getWritableDb().insert("tbl_post_likes", null, values); + } else { + String args[] = {Long.toString(post.blogId), Long.toString(post.postId), Long.toString(currentUserId)}; + ReaderDatabase.getWritableDb().delete("tbl_post_likes", "blog_id=? AND post_id=? AND user_id=?", args); + } + } + + public static void setLikesForPost(ReaderPost post, ReaderUserIdList userIds) { + if (post == null) { + return; + } + + SQLiteDatabase db = ReaderDatabase.getWritableDb(); + db.beginTransaction(); + SQLiteStatement stmt = db.compileStatement("INSERT INTO tbl_post_likes (blog_id, post_id, user_id) VALUES (?1,?2,?3)"); + try { + // first delete all likes for this post + String[] args = {Long.toString(post.blogId), Long.toString(post.postId)}; + db.delete("tbl_post_likes", "blog_id=? AND post_id=?", args); + + // now insert the passed likes + if (userIds != null) { + stmt.bindLong(1, post.blogId); + stmt.bindLong(2, post.postId); + for (Long userId: userIds) { + stmt.bindLong(3, userId); + stmt.execute(); + } + } + + db.setTransactionSuccessful(); + + } finally { + db.endTransaction(); + SqlUtils.closeStatement(stmt); + } + } + + + /**** + * comment likes + */ + + public static ReaderUserIdList getLikesForComment(ReaderComment comment) { + ReaderUserIdList userIds = new ReaderUserIdList(); + if (comment == null) { + return userIds; + } + + String[] args = {Long.toString(comment.blogId), + Long.toString(comment.commentId)}; + Cursor c = ReaderDatabase.getReadableDb().rawQuery( + "SELECT user_id FROM tbl_comment_likes WHERE blog_id=? AND comment_id=?", args); + try { + if (c.moveToFirst()) { + do { + userIds.add(c.getLong(0)); + } while (c.moveToNext()); + } + + return userIds; + } finally { + SqlUtils.closeCursor(c); + } + } + + public static int getNumLikesForComment(ReaderComment comment) { + if (comment == null) { + return 0; + } + String[] args = {Long.toString(comment.blogId), + Long.toString(comment.commentId)}; + return SqlUtils.intForQuery(ReaderDatabase.getReadableDb(), + "SELECT count(*) FROM tbl_comment_likes WHERE blog_id=? AND comment_id=?", args); + } + + public static void setCurrentUserLikesComment(ReaderComment comment, boolean isLiked) { + if (comment == null) { + return; + } + + long currentUserId = AccountHelper.getDefaultAccount().getUserId(); + if (isLiked) { + ContentValues values = new ContentValues(); + values.put("blog_id", comment.blogId); + values.put("comment_id", comment.commentId); + values.put("user_id", currentUserId); + ReaderDatabase.getWritableDb().insert("tbl_comment_likes", null, values); + } else { + String args[] = {Long.toString(comment.blogId), + Long.toString(comment.commentId), + Long.toString(currentUserId)}; + ReaderDatabase.getWritableDb().delete("tbl_comment_likes", + "blog_id=? AND comment_id=? AND user_id=?", args); + } + } + + public static void setLikesForComment(ReaderComment comment, ReaderUserIdList userIds) { + if (comment == null) { + return; + } + + SQLiteDatabase db = ReaderDatabase.getWritableDb(); + db.beginTransaction(); + SQLiteStatement stmt = db.compileStatement( + "INSERT INTO tbl_comment_likes (blog_id, comment_id, user_id) VALUES (?1,?2,?3)"); + try { + String[] args = {Long.toString(comment.blogId), + Long.toString(comment.commentId)}; + db.delete("tbl_comment_likes", "blog_id=? AND comment_id=?", args); + + if (userIds != null) { + stmt.bindLong(1, comment.blogId); + stmt.bindLong(2, comment.commentId); + for (Long userId: userIds) { + stmt.bindLong(3, userId); + stmt.execute(); + } + } + + db.setTransactionSuccessful(); + + } finally { + db.endTransaction(); + SqlUtils.closeStatement(stmt); + } + } +} + + |