aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java
diff options
context:
space:
mode:
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.java222
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);
+ }
+ }
+}
+
+