Yuvipanda has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/98590


Change subject: WIP: Add support for getting data in and out of SQLite
......................................................................

WIP: Add support for getting data in and out of SQLite

Change-Id: Ifac43dec5b29a7668f65b1f55a5caa1dd431ed1a
---
A wikipedia/src/main/java/org/wikimedia/wikipedia/data/ContentPersister.java
A wikipedia/src/main/java/org/wikimedia/wikipedia/data/DBOpenHelper.java
A wikipedia/src/main/java/org/wikimedia/wikipedia/data/PersistanceHelper.java
A 
wikipedia/src/main/java/org/wikimedia/wikipedia/data/SQLiteContentProvider.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
A 
wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryContentProvider.java
A 
wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersistanceHelper.java
A 
wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersister.java
8 files changed, 304 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/90/98590/1

diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/data/ContentPersister.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/ContentPersister.java
new file mode 100644
index 0000000..9d1fbe6
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/ContentPersister.java
@@ -0,0 +1,26 @@
+package org.wikimedia.wikipedia.data;
+
+import android.content.ContentProviderClient;
+import android.net.Uri;
+import android.os.RemoteException;
+
+abstract public class ContentPersister<T> {
+    private final ContentProviderClient client;
+    private final PersistanceHelper<T> persistanceHelper;
+
+    public ContentPersister(ContentProviderClient client, PersistanceHelper<T> 
persistanceHelper) {
+        this.client = client;
+        this.persistanceHelper = persistanceHelper;
+    }
+
+    public void persist(T obj) {
+        Uri uri = 
Uri.parse(SQLiteContentProvider.getAuthorityForTable(persistanceHelper.getTableName())
 + ":///");
+
+        try {
+            client.insert(uri, persistanceHelper.toContentValues(obj));
+        } catch (RemoteException e) {
+            // This shouldn't happen
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/data/DBOpenHelper.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/DBOpenHelper.java
new file mode 100644
index 0000000..1b1b727
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/DBOpenHelper.java
@@ -0,0 +1,23 @@
+package org.wikimedia.wikipedia.data;
+
+import android.content.*;
+import android.database.sqlite.*;
+
+public class DBOpenHelper  extends SQLiteOpenHelper{
+
+    private static final String DATABASE_NAME = "wikipedia.db";
+    private static final int DATABASE_VERSION = 1;
+
+    public DBOpenHelper(Context context) {
+        super(context, DATABASE_NAME, null, DATABASE_VERSION);
+    }
+
+
+    @Override
+    public void onCreate(SQLiteDatabase sqLiteDatabase) {
+    }
+
+    @Override
+    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int from, int to) {
+    }
+}
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/data/PersistanceHelper.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/PersistanceHelper.java
new file mode 100644
index 0000000..0f025a6
--- /dev/null
+++ 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/PersistanceHelper.java
@@ -0,0 +1,61 @@
+package org.wikimedia.wikipedia.data;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public abstract class PersistanceHelper<T> {
+
+    public static class Column{
+        private final String name;
+        private final String type;
+
+        public String getName() {
+            return name;
+        }
+
+        public String getType() {
+            return type;
+        }
+
+        public Column(String name, String type) {
+            this.name = name;
+            this.type = type;
+        }
+
+        @Override
+        public String toString() {
+            return getName() + " " + getType();
+        }
+    }
+
+    abstract public T fromCursor(Cursor c);
+
+    abstract protected ContentValues toContentValues(T obj);
+
+    abstract public String getTableName();
+
+    abstract public Column[] getColumnsAdded(int version);
+
+    public ArrayList<Column> getElements(int version) {
+         ArrayList<Column> columns = new ArrayList<Column>();
+         for (int i = 1; i <= version; i++) {
+             columns.addAll(Arrays.asList(getColumnsAdded(i)));
+         }
+         return columns;
+     }
+
+    private String getSchema(int version) {
+        String tableName = getTableName();
+        ArrayList<Column> columns = getElements(version);
+        StringBuilder builder = new StringBuilder();
+        builder.append("CREATE TABLE ").append(tableName).append(" ( ")
+                .append(TextUtils.join(", ", columns))
+                .append(" );");
+
+        return builder.toString();
+    }
+}
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/data/SQLiteContentProvider.java
 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/SQLiteContentProvider.java
new file mode 100644
index 0000000..01f2ea2
--- /dev/null
+++ 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/data/SQLiteContentProvider.java
@@ -0,0 +1,109 @@
+package org.wikimedia.wikipedia.data;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+
+abstract public class SQLiteContentProvider<T> extends ContentProvider {
+    private final PersistanceHelper<T> persistanceHelper;
+    private final DBOpenHelper dbOpenHelper;
+    protected SQLiteContentProvider(PersistanceHelper<T> persistanceHelper, 
DBOpenHelper dbOpenHelper) {
+        this.persistanceHelper = persistanceHelper;
+        this.dbOpenHelper = dbOpenHelper;
+    }
+
+    private final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+    private static final int MATCH_ALL = 1;
+
+    @Override
+    public boolean onCreate() {
+        uriMatcher.addURI(getAuthority(), persistanceHelper.getTableName(), 
MATCH_ALL);
+        return false;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection, 
String[] selectionArgs, String sortOrder) {
+        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
+        queryBuilder.setTables(persistanceHelper.getTableName());
+
+        int uriType = uriMatcher.match(uri);
+
+        SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
+        Cursor cursor;
+
+        switch (uriType) {
+            case MATCH_ALL:
+                cursor = queryBuilder.query(db, projection, selection, 
selectionArgs, null, null, sortOrder);
+                break;
+            default:
+                throw new IllegalArgumentException("Uri " + uri + " does not 
match any matcher!");
+        }
+
+        cursor.setNotificationUri(getContext().getContentResolver(), uri);
+
+        return cursor;
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        return null;
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        int uriType = uriMatcher.match(uri);
+        SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase();
+        switch (uriType) {
+            case MATCH_ALL:
+                sqlDB.insert(persistanceHelper.getTableName(), null, values);
+                break;
+            default:
+                throw new IllegalArgumentException("Unknown URI: " + uri);
+        }
+        getContext().getContentResolver().notifyChange(uri, null);
+        return uri;
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        throw new IllegalArgumentException("Delete functionality not 
implemented");
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, 
String[] selectionArgs) {
+        throw new IllegalArgumentException("Update functionality not 
implemented");
+    }
+
+    @Override
+    public int bulkInsert(Uri uri, ContentValues[] values) {
+        int uriType = uriMatcher.match(uri);
+        SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase();
+        sqlDB.beginTransaction();
+        switch (uriType) {
+            case MATCH_ALL:
+                for(ContentValues value: values) {
+                    sqlDB.insert(persistanceHelper.getTableName(), null, 
value);
+                }
+                break;
+            default:
+                throw new IllegalArgumentException("Unknown URI: " + uri);
+        }
+        sqlDB.setTransactionSuccessful();
+        sqlDB.endTransaction();
+        getContext().getContentResolver().notifyChange(uri, null);
+        return values.length;
+
+    }
+
+    protected String getAuthority() {
+        return getAuthorityForTable(persistanceHelper.getTableName());
+    }
+
+    public static final String getAuthorityForTable(String table) {
+        return "org.wikimedia.wikipedia." + table;
+    }
+}
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
index 06e5f96..e6bf4be 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntry.java
@@ -7,6 +7,8 @@
 import java.util.Date;
 
 public class HistoryEntry implements Parcelable {
+    public static final HistoryEntryPersistanceHelper persistanceHelper = new 
HistoryEntryPersistanceHelper();
+
     public static final int SOURCE_SEARCH = 1;
     public static final int SOURCE_INTERNAL_LINK = 2;
     public static final int SOURCE_EXTERNAL_LINK = 3;
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryContentProvider.java
 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryContentProvider.java
new file mode 100644
index 0000000..69ad685
--- /dev/null
+++ 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryContentProvider.java
@@ -0,0 +1,10 @@
+package org.wikimedia.wikipedia.history;
+
+import org.wikimedia.wikipedia.data.DBOpenHelper;
+import org.wikimedia.wikipedia.data.SQLiteContentProvider;
+
+public class HistoryEntryContentProvider extends 
SQLiteContentProvider<HistoryEntry> {
+    protected HistoryEntryContentProvider(DBOpenHelper dbOpenHelper) {
+        super(HistoryEntry.persistanceHelper, dbOpenHelper);
+    }
+}
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersistanceHelper.java
 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersistanceHelper.java
new file mode 100644
index 0000000..ab4b782
--- /dev/null
+++ 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersistanceHelper.java
@@ -0,0 +1,52 @@
+package org.wikimedia.wikipedia.history;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import org.wikimedia.wikipedia.PageTitle;
+import org.wikimedia.wikipedia.Site;
+import org.wikimedia.wikipedia.data.PersistanceHelper;
+
+import java.util.Date;
+
+public class HistoryEntryPersistanceHelper extends 
PersistanceHelper<HistoryEntry> {
+    @Override
+    public HistoryEntry fromCursor(Cursor c) {
+        // Carefully, get them back by using position only
+        Site site = new Site(c.getString(1));
+        // FIXME: Does not handle non mainspace pages
+        PageTitle title = new PageTitle(null, c.getString(2), site);
+        Date timestamp = new Date(c.getLong(3));
+        int source = c.getInt(4);
+        return new HistoryEntry(title, timestamp, source);
+    }
+
+    @Override
+    protected ContentValues toContentValues(HistoryEntry obj) {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put("title", obj.getTitle().getPrefixedText());
+        contentValues.put("timestamp", obj.getTimestamp().getTime());
+        contentValues.put("source", obj.getSource());
+        return contentValues;
+    }
+
+    @Override
+    public String getTableName() {
+        return "history";
+    }
+
+    @Override
+    public Column[] getColumnsAdded(int version) {
+        switch (version) {
+            case 1:
+                return new Column[] {
+                        new Column("_id", "integer primary key"),
+                        new Column("site", "string"),
+                        new Column("title", "string"),
+                        new Column("timestamp", "integer"),
+                        new Column("source", "integer"),
+                };
+            default:
+                return new Column[0];
+        }
+    }
+}
diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersister.java
 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersister.java
new file mode 100644
index 0000000..f77ad88
--- /dev/null
+++ 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/history/HistoryEntryPersister.java
@@ -0,0 +1,21 @@
+package org.wikimedia.wikipedia.history;
+
+import android.content.ContentProviderClient;
+import android.content.Context;
+import org.wikimedia.wikipedia.data.ContentPersister;
+import org.wikimedia.wikipedia.data.PersistanceHelper;
+import org.wikimedia.wikipedia.data.SQLiteContentProvider;
+
+public class HistoryEntryPersister extends ContentPersister<HistoryEntry> {
+    public HistoryEntryPersister(Context context) {
+        // lolJava
+        super(
+                context.getContentResolver().acquireContentProviderClient(
+                        SQLiteContentProvider.getAuthorityForTable(
+                                HistoryEntry.persistanceHelper.getTableName()
+                        )
+                ),
+                HistoryEntry.persistanceHelper
+        );
+    }
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/98590
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifac43dec5b29a7668f65b1f55a5caa1dd431ed1a
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to