package com.orgzly.android.provider.clients; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import com.orgzly.android.provider.ProviderContract; import com.orgzly.android.repos.MockRepo; import com.orgzly.android.repos.Rook; import com.orgzly.android.repos.VersionedRook; import com.orgzly.android.util.MiscUtils; import com.orgzly.android.util.UriUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * Used by tests. * * TODO: Remove, see {@link MockRepo}. */ public class LocalDbRepoClient { public static VersionedRook fromCursor(Cursor cursor) { Uri repoUri = Uri.parse(cursor.getString(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.REPO_URL))); Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.URL))); String revision = cursor.getString(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.REVISION)); long mtime = cursor.getLong(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.MTIME)); return new VersionedRook(repoUri, uri, revision, mtime); } public static void delete(Context context) { context.getContentResolver().delete(ProviderContract.LocalDbRepo.ContentUri.dbRepos(), null, null); } public static VersionedRook retrieveBook(Context context, Uri repoUri, Uri uri, File file) throws IOException { Cursor cursor = context.getContentResolver().query( ProviderContract.LocalDbRepo.ContentUri.dbRepos(), null, ProviderContract.LocalDbRepo.Param.URL + "=?", new String[] { uri.toString() }, null); try { if (!cursor.moveToFirst()) { throw new IOException("Book " + uri + " not found in repo"); } if (cursor.getCount() != 1) { throw new IOException("Found " + cursor.getCount() + " books matching name " + uri); } /* Get data from Cursor. */ String content = cursor.getString(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.CONTENT)); String revision = cursor.getString(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.REVISION)); long mtime = cursor.getLong(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.MTIME)); /* Write content to file. */ MiscUtils.writeStringToFile(content, file); /* Return book. */ return new VersionedRook(repoUri, uri, revision, mtime); } finally { cursor.close(); } } /** * Select only those belonging to this repo's name. */ public static List<VersionedRook> getAll(Context context, Uri repoUri) { Cursor cursor = context.getContentResolver().query( ProviderContract.LocalDbRepo.ContentUri.dbRepos(), null, ProviderContract.LocalDbRepo.Param.REPO_URL + "=?", new String[] { repoUri.toString() }, null); List<VersionedRook> result = new ArrayList<>(); try { for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.URL))); String revision = cursor.getString(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.REVISION)); long mtime = cursor.getLong(cursor.getColumnIndex(ProviderContract.LocalDbRepo.Param.MTIME)); result.add(new VersionedRook(repoUri, uri, revision, mtime)); } } finally { cursor.close(); } return result; } private static VersionedRook get(Context context, Uri uri) { Cursor cursor = context.getContentResolver().query( ProviderContract.LocalDbRepo.ContentUri.dbRepos(), null, ProviderContract.LocalDbRepo.Param.URL + " = ?", new String[] { uri.toString() }, null); try { if (cursor.moveToFirst()) { return fromCursor(cursor); } } finally { cursor.close(); } return null; } public static VersionedRook insert(Context context, VersionedRook vrook, String content) throws IOException { ContentValues values = new ContentValues(); values.put(ProviderContract.LocalDbRepo.Param.REPO_URL, vrook.getRepoUri().toString()); values.put(ProviderContract.LocalDbRepo.Param.URL, vrook.getUri().toString()); values.put(ProviderContract.LocalDbRepo.Param.CONTENT, content); values.put(ProviderContract.LocalDbRepo.Param.REVISION, vrook.getRevision()); values.put(ProviderContract.LocalDbRepo.Param.MTIME, vrook.getMtime()); values.put(ProviderContract.LocalDbRepo.Param.CREATED_AT, System.currentTimeMillis()); Uri uri = context.getContentResolver().insert(ProviderContract.LocalDbRepo.ContentUri.dbRepos(), values); if (uri == null) { throw new IOException("Inserting repo book to db failed"); } return vrook; } public static VersionedRook renameBook(Context context, Uri from, Uri to) throws IOException { ContentValues values = new ContentValues(); values.put(ProviderContract.LocalDbRepo.Param.URL, to.toString()); values.put(ProviderContract.LocalDbRepo.Param.MTIME, System.currentTimeMillis()); values.put(ProviderContract.LocalDbRepo.Param.REVISION, "MockedRenamedRevision-" + System.currentTimeMillis()); int updated = context.getContentResolver().update( ProviderContract.LocalDbRepo.ContentUri.dbRepos(), values, ProviderContract.LocalDbRepo.Param.URL + " = ?", new String[] { from.toString() } ); if (updated != 1) { throw new IOException("Failed moving notebook from " + UriUtils.friendlyUri(from) + " to " + UriUtils.friendlyUri(to)); } return get(context, to); } }