Updating bookmark database to handle optional trailing slashes
This commit is contained in:
parent
3ca34aa58e
commit
8f9a145e04
@ -105,6 +105,13 @@ public class BookmarkDatabase extends SQLiteOpenHelper implements BookmarkModel
|
|||||||
onCreate(db);
|
onCreate(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds a {@link HistoryItem} to {@link ContentValues}.
|
||||||
|
*
|
||||||
|
* @param bookmarkItem the bookmark to bind.
|
||||||
|
* @return a valid values object that can be inserted
|
||||||
|
* into the database.
|
||||||
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
private static ContentValues bindBookmarkToContentValues(@NonNull HistoryItem bookmarkItem) {
|
private static ContentValues bindBookmarkToContentValues(@NonNull HistoryItem bookmarkItem) {
|
||||||
ContentValues contentValues = new ContentValues(4);
|
ContentValues contentValues = new ContentValues(4);
|
||||||
@ -116,6 +123,15 @@ public class BookmarkDatabase extends SQLiteOpenHelper implements BookmarkModel
|
|||||||
return contentValues;
|
return contentValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds a cursor to a {@link HistoryItem}. This is
|
||||||
|
* a non consuming operation on the cursor. Note that
|
||||||
|
* this operation is not safe to perform on a cursor
|
||||||
|
* unless you know that the cursor is of history items.
|
||||||
|
*
|
||||||
|
* @param cursor the cursor to read from.
|
||||||
|
* @return a valid item containing all the pertinent information.
|
||||||
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
private static HistoryItem bindCursorToHistoryItem(@NonNull Cursor cursor) {
|
private static HistoryItem bindCursorToHistoryItem(@NonNull Cursor cursor) {
|
||||||
HistoryItem bookmark = new HistoryItem();
|
HistoryItem bookmark = new HistoryItem();
|
||||||
@ -129,6 +145,13 @@ public class BookmarkDatabase extends SQLiteOpenHelper implements BookmarkModel
|
|||||||
return bookmark;
|
return bookmark;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds a cursor to a list of {@link HistoryItem}.
|
||||||
|
* This operation consumes the cursor.
|
||||||
|
*
|
||||||
|
* @param cursor the cursor to bind.
|
||||||
|
* @return a valid list of history items, may be empty.
|
||||||
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
private static List<HistoryItem> bindCursorToHistoryItemList(@NonNull Cursor cursor) {
|
private static List<HistoryItem> bindCursorToHistoryItemList(@NonNull Cursor cursor) {
|
||||||
List<HistoryItem> bookmarks = new ArrayList<>();
|
List<HistoryItem> bookmarks = new ArrayList<>();
|
||||||
@ -142,13 +165,91 @@ public class BookmarkDatabase extends SQLiteOpenHelper implements BookmarkModel
|
|||||||
return bookmarks;
|
return bookmarks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URLs can represent the same thing with or without a trailing slash,
|
||||||
|
* for instance, google.com/ is the same page as google.com. Since these
|
||||||
|
* can be represented as different bookmarks within the bookmark database,
|
||||||
|
* it is important to be able to get the alternate version of a URL.
|
||||||
|
*
|
||||||
|
* @param url the string that might have a trailing slash.
|
||||||
|
* @return a string without a trailing slash if the original had one,
|
||||||
|
* or a string with a trailing slash if the original did not.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
private static String alternateSlashUrl(@NonNull String url) {
|
||||||
|
if (url.endsWith("/")) {
|
||||||
|
return url.substring(0, url.length() - 1);
|
||||||
|
} else {
|
||||||
|
return url + '/';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Queries the database for bookmarks with the provided URL. If it
|
||||||
|
* cannot find any bookmarks with the given URL, it will try to query
|
||||||
|
* for bookmarks with the {@link #alternateSlashUrl(String)} as its URL.
|
||||||
|
*
|
||||||
|
* @param url the URL to query for.
|
||||||
|
* @return a cursor with bookmarks matching the URL.
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
private Cursor queryWithOptionalEndSlash(@NonNull String url) {
|
||||||
|
Cursor cursor = lazyDatabase().query(TABLE_BOOKMARK, null, KEY_URL + "=?", new String[]{url}, null, null, null, "1");
|
||||||
|
|
||||||
|
if (cursor.getCount() == 0) {
|
||||||
|
String alternateUrl = alternateSlashUrl(url);
|
||||||
|
cursor = lazyDatabase().query(TABLE_BOOKMARK, null, KEY_URL + "=?", new String[]{alternateUrl}, null, null, null, "1");
|
||||||
|
}
|
||||||
|
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a bookmark from the database with the provided URL. If it
|
||||||
|
* cannot find any bookmark with the given URL, it will try to delete
|
||||||
|
* a bookmark with the {@link #alternateSlashUrl(String)} as its URL.
|
||||||
|
*
|
||||||
|
* @param url the URL to delete.
|
||||||
|
* @return the number of deleted rows.
|
||||||
|
*/
|
||||||
|
private int deleteWithOptionalEndSlash(@NonNull String url) {
|
||||||
|
int deletedRows = lazyDatabase().delete(TABLE_BOOKMARK, KEY_URL + "=?", new String[]{url});
|
||||||
|
|
||||||
|
if (deletedRows == 0) {
|
||||||
|
String alternateUrl = alternateSlashUrl(url);
|
||||||
|
deletedRows = lazyDatabase().delete(TABLE_BOOKMARK, KEY_URL + "=?", new String[]{alternateUrl});
|
||||||
|
}
|
||||||
|
|
||||||
|
return deletedRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a bookmark in the database with the provided URL. If it
|
||||||
|
* cannot find any bookmark with the given URL, it will try to update
|
||||||
|
* a bookmark with the {@link #alternateSlashUrl(String)} as its URL.
|
||||||
|
*
|
||||||
|
* @param url the URL to update.
|
||||||
|
* @param contentValues the new values to update to.
|
||||||
|
* @return the numebr of rows updated.
|
||||||
|
*/
|
||||||
|
private int updateWithOptionalEndSlash(@NonNull String url, @NonNull ContentValues contentValues) {
|
||||||
|
int updatedRows = lazyDatabase().update(TABLE_BOOKMARK, contentValues, KEY_URL + "=?", new String[]{url});
|
||||||
|
|
||||||
|
if (updatedRows == 0) {
|
||||||
|
String alternateUrl = alternateSlashUrl(url);
|
||||||
|
updatedRows = lazyDatabase().update(TABLE_BOOKMARK, contentValues, KEY_URL + "=?", new String[]{alternateUrl});
|
||||||
|
}
|
||||||
|
|
||||||
|
return updatedRows;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Single<HistoryItem> findBookmarkForUrl(@NonNull final String url) {
|
public Single<HistoryItem> findBookmarkForUrl(@NonNull final String url) {
|
||||||
return Single.create(new SingleAction<HistoryItem>() {
|
return Single.create(new SingleAction<HistoryItem>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSubscribe(@NonNull SingleSubscriber<HistoryItem> subscriber) {
|
public void onSubscribe(@NonNull SingleSubscriber<HistoryItem> subscriber) {
|
||||||
Cursor cursor = lazyDatabase().query(TABLE_BOOKMARK, null, KEY_URL + "=?", new String[]{url}, null, null, null, "1");
|
Cursor cursor = queryWithOptionalEndSlash(url);
|
||||||
|
|
||||||
if (cursor.moveToFirst()) {
|
if (cursor.moveToFirst()) {
|
||||||
subscriber.onItem(bindCursorToHistoryItem(cursor));
|
subscriber.onItem(bindCursorToHistoryItem(cursor));
|
||||||
@ -168,7 +269,7 @@ public class BookmarkDatabase extends SQLiteOpenHelper implements BookmarkModel
|
|||||||
return Single.create(new SingleAction<Boolean>() {
|
return Single.create(new SingleAction<Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSubscribe(@NonNull SingleSubscriber<Boolean> subscriber) {
|
public void onSubscribe(@NonNull SingleSubscriber<Boolean> subscriber) {
|
||||||
Cursor cursor = lazyDatabase().query(TABLE_BOOKMARK, null, KEY_URL + "=?", new String[]{url}, null, null, null, "1");
|
Cursor cursor = queryWithOptionalEndSlash(url);
|
||||||
|
|
||||||
subscriber.onItem(cursor.moveToFirst());
|
subscriber.onItem(cursor.moveToFirst());
|
||||||
|
|
||||||
@ -184,7 +285,7 @@ public class BookmarkDatabase extends SQLiteOpenHelper implements BookmarkModel
|
|||||||
return Single.create(new SingleAction<Boolean>() {
|
return Single.create(new SingleAction<Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSubscribe(@NonNull SingleSubscriber<Boolean> subscriber) {
|
public void onSubscribe(@NonNull SingleSubscriber<Boolean> subscriber) {
|
||||||
Cursor cursor = lazyDatabase().query(TABLE_BOOKMARK, null, KEY_URL + "=?", new String[]{item.getUrl()}, null, null, null, "1");
|
Cursor cursor = queryWithOptionalEndSlash(item.getUrl());
|
||||||
|
|
||||||
if (cursor.moveToFirst()) {
|
if (cursor.moveToFirst()) {
|
||||||
cursor.close();
|
cursor.close();
|
||||||
@ -229,7 +330,7 @@ public class BookmarkDatabase extends SQLiteOpenHelper implements BookmarkModel
|
|||||||
return Single.create(new SingleAction<Boolean>() {
|
return Single.create(new SingleAction<Boolean>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSubscribe(@NonNull SingleSubscriber<Boolean> subscriber) {
|
public void onSubscribe(@NonNull SingleSubscriber<Boolean> subscriber) {
|
||||||
int rows = lazyDatabase().delete(TABLE_BOOKMARK, KEY_URL + "=?", new String[]{bookmark.getUrl()});
|
int rows = deleteWithOptionalEndSlash(bookmark.getUrl());
|
||||||
|
|
||||||
subscriber.onItem(rows > 0);
|
subscriber.onItem(rows > 0);
|
||||||
subscriber.onComplete();
|
subscriber.onComplete();
|
||||||
@ -290,7 +391,7 @@ public class BookmarkDatabase extends SQLiteOpenHelper implements BookmarkModel
|
|||||||
}
|
}
|
||||||
ContentValues contentValues = bindBookmarkToContentValues(newBookmark);
|
ContentValues contentValues = bindBookmarkToContentValues(newBookmark);
|
||||||
|
|
||||||
lazyDatabase().update(TABLE_BOOKMARK, contentValues, KEY_URL + "=?", new String[]{oldBookmark.getUrl()});
|
updateWithOptionalEndSlash(oldBookmark.getUrl(), contentValues);
|
||||||
|
|
||||||
subscriber.onComplete();
|
subscriber.onComplete();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user