Files
EhViewer/app/src/main/java/com/hippo/ehviewer/EhDB.java
T
2016-02-26 17:01:40 +08:00

418 lines
15 KiB
Java

/*
* Copyright 2016 Hippo Seven
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hippo.ehviewer;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.hippo.ehviewer.client.data.GalleryInfo;
import com.hippo.ehviewer.client.data.ListUrlBuilder;
import com.hippo.ehviewer.dao.DaoMaster;
import com.hippo.ehviewer.dao.DaoSession;
import com.hippo.ehviewer.dao.DownloadDirnameDao;
import com.hippo.ehviewer.dao.DownloadDirnameRaw;
import com.hippo.ehviewer.dao.DownloadInfoDao;
import com.hippo.ehviewer.dao.DownloadInfoRaw;
import com.hippo.ehviewer.dao.DownloadLabelDao;
import com.hippo.ehviewer.dao.DownloadLabelRaw;
import com.hippo.ehviewer.dao.GalleryInfoDao;
import com.hippo.ehviewer.dao.GalleryInfoRaw;
import com.hippo.ehviewer.dao.HistoryInfoDao;
import com.hippo.ehviewer.dao.HistoryInfoRaw;
import com.hippo.ehviewer.dao.LocalFavoriteDao;
import com.hippo.ehviewer.dao.LocalFavoriteRaw;
import com.hippo.ehviewer.dao.QuickSearchDao;
import com.hippo.ehviewer.dao.QuickSearchRaw;
import com.hippo.ehviewer.download.DownloadInfo;
import java.util.ArrayList;
import java.util.List;
import de.greenrobot.dao.query.LazyList;
public class EhDB {
private static DaoSession sDaoSession;
private static boolean sHasOldDB;
private static boolean sNewDB;
private static class DBOpenHelper extends DaoMaster.OpenHelper {
public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onCreate(SQLiteDatabase db) {
super.onCreate(db);
sNewDB = true;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
private static class OldDBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "data";
private static final int VERSION = 4;
private static final String TABLE_GALLERY = "gallery";
private static final String TABLE_LOCAL_FAVOURITE = "local_favourite";
private static final String TABLE_TAG = "tag";
private static final String TABLE_DOWNLOAD = "download";
private static final String TABLE_HISTORY = "history";
public OldDBHelper(Context context) {
super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public static void initialize(Context context) {
sHasOldDB = context.getDatabasePath("data").exists();
DBOpenHelper helper = new DBOpenHelper(
context.getApplicationContext(), "eh.db", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
sDaoSession = daoMaster.newSession();
}
public static boolean needMerge() {
return sNewDB && sHasOldDB;
}
public static void mergeOldDB(Context context) {
sNewDB = false;
OldDBHelper oldDBHelper = new OldDBHelper(context);
SQLiteDatabase oldDB;
try {
oldDB = oldDBHelper.getReadableDatabase();
} catch (Exception e) {
return;
}
// Merge gallery info
try {
Cursor cursor = oldDB.rawQuery("select * from " + OldDBHelper.TABLE_GALLERY, null);
if (cursor != null) {
GalleryInfoDao dao = sDaoSession.getGalleryInfoDao();
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
GalleryInfoRaw raw = new GalleryInfoRaw();
raw.setGid((long) cursor.getInt(0));
raw.setToken(cursor.getString(1));
raw.setTitle(cursor.getString(2));
raw.setPosted(cursor.getString(3));
raw.setCategory(cursor.getInt(4));
raw.setThumb(cursor.getString(5));
raw.setUploader(cursor.getString(6));
raw.setRating(cursor.getFloat(7));
raw.setReference(cursor.getInt(8));
dao.insert(raw);
cursor.moveToNext();
}
}
cursor.close();
}
} catch (Exception e) {
// Ignore
}
// Merge local favorite
try {
Cursor cursor = oldDB.rawQuery("select * from " + OldDBHelper.TABLE_LOCAL_FAVOURITE, null);
if (cursor != null) {
LocalFavoriteDao dao = sDaoSession.getLocalFavoriteDao();
if (cursor.moveToFirst()) {
long i = 0L;
while (!cursor.isAfterLast()) {
LocalFavoriteRaw raw = new LocalFavoriteRaw();
raw.setGid((long) cursor.getInt(0));
raw.setDate(i);
dao.insert(raw);
cursor.moveToNext();
i++;
}
}
cursor.close();
}
} catch (Exception e) {
// Ignore
}
// Merge quick search
try {
Cursor cursor = oldDB.rawQuery("select * from " + OldDBHelper.TABLE_TAG, null);
if (cursor != null) {
QuickSearchDao dao = sDaoSession.getQuickSearchDao();
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
QuickSearchRaw raw = new QuickSearchRaw();
int mode = cursor.getInt(2);
String search = cursor.getString(4);
String tag = cursor.getString(7);
if (mode == ListUrlBuilder.MODE_UPLOADER && search != null &&
search.startsWith("uploader:")) {
search = search.substring("uploader:".length());
}
raw.setDate((long) cursor.getInt(0));
raw.setName(cursor.getString(1));
raw.setMode(mode);
raw.setCategory(cursor.getInt(3));
raw.setKeyword(mode == ListUrlBuilder.MODE_TAG ? tag : search);
raw.setAdvanceSearch(cursor.getInt(5));
raw.setMinRating(cursor.getInt(6));
dao.insert(raw);
cursor.moveToNext();
}
}
cursor.close();
}
} catch (Exception e) {
// Ignore
}
// Merge download info
try {
Cursor cursor = oldDB.rawQuery("select * from " + OldDBHelper.TABLE_DOWNLOAD, null);
if (cursor != null) {
DownloadInfoDao dao = sDaoSession.getDownloadInfoDao();
if (cursor.moveToFirst()) {
long i = 0L;
while (!cursor.isAfterLast()) {
DownloadInfoRaw raw = new DownloadInfoRaw();
int state = cursor.getInt(2);
int legacy = cursor.getInt(3);
if (state == DownloadInfo.STATE_FINISH && legacy > 0) {
state = DownloadInfo.STATE_FAILED;
}
raw.setGid((long) cursor.getInt(0));
raw.setState(state);
raw.setLegacy(legacy);
if (cursor.getColumnCount() == 5) {
raw.setDate(cursor.getLong(4));
} else {
raw.setDate(i);
}
dao.insert(raw);
cursor.moveToNext();
i++;
}
}
cursor.close();
}
} catch (Exception e) {
// Ignore
}
try {
// Merge history info
Cursor cursor = oldDB.rawQuery("select * from " + OldDBHelper.TABLE_HISTORY, null);
if (cursor != null) {
HistoryInfoDao dao = sDaoSession.getHistoryInfoDao();
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
HistoryInfoRaw raw = new HistoryInfoRaw();
raw.setGid((long) cursor.getInt(0));
raw.setMode(cursor.getInt(1));
raw.setDate(cursor.getLong(2));
dao.insert(raw);
cursor.moveToNext();
}
}
cursor.close();
}
} catch (Exception e) {
// Ignore
}
try {
oldDBHelper.close();
} catch (Exception e) {
// Ignore
}
}
private static synchronized void addGalleryInfo(GalleryInfo galleryInfo) {
GalleryInfoDao dao = sDaoSession.getGalleryInfoDao();
GalleryInfoRaw raw = dao.load((long) galleryInfo.gid);
if (raw == null) {
// add new item, set reference 1
raw = new GalleryInfoRaw();
raw.setGid((long) galleryInfo.gid);
raw.setToken(galleryInfo.token);
raw.setTitle(galleryInfo.title);
raw.setThumb(galleryInfo.thumb);
raw.setCategory(galleryInfo.category);
raw.setPosted(galleryInfo.posted);
raw.setUploader(galleryInfo.uploader);
raw.setRating(galleryInfo.rating);
raw.setReference(1);
dao.insert(raw);
} else {
// already in db, add reference
raw.setReference(raw.getReference() + 1);
dao.update(raw);
}
}
private static synchronized void removeGalleryInfo(int gid) {
GalleryInfoDao dao = sDaoSession.getGalleryInfoDao();
GalleryInfoRaw raw = dao.load((long) gid);
int reference = raw.getReference();
if (reference <= 1) {
// No reference, delete it
dao.deleteByKey((long) gid);
} else {
// Still has reference, sub reference
raw.setReference(reference - 1);
dao.update(raw);
}
}
public static synchronized GalleryInfo getGalleryInfo(int gid) {
GalleryInfoDao dao = sDaoSession.getGalleryInfoDao();
GalleryInfoRaw raw = dao.load((long) gid);
if (raw != null) {
GalleryInfo gi = new GalleryInfo();
gi.gid = (int) (long) raw.getGid();
gi.token = raw.getToken();
gi.title = raw.getTitle();
gi.thumb = raw.getThumb();
gi.category = raw.getCategory();
gi.posted = raw.getPosted();
gi.uploader = raw.getUploader();
gi.rating = raw.getRating();
gi.generateSLang();
return gi;
} else {
return null;
}
}
@NonNull
public static synchronized List<String> getAllDownloadLabelList() {
DownloadLabelDao dao = sDaoSession.getDownloadLabelDao();
List<DownloadLabelRaw> list = dao.queryBuilder().orderAsc(DownloadLabelDao.Properties.Time).list();
List<String> result = new ArrayList<>(list.size());
for (int i = 0, n = list.size(); i < n; i++) {
result.add(list.get(i).getLabel());
}
return result;
}
public static synchronized LazyList<DownloadInfoRaw> getDownloadInfoLazyList() {
return sDaoSession.getDownloadInfoDao().queryBuilder()
.orderAsc(DownloadInfoDao.Properties.Date).listLazy();
}
public static synchronized void addDownloadInfo(DownloadInfo info) {
// Add gallery info first
addGalleryInfo(info.galleryInfo);
// Add download info
DownloadInfoDao dao = sDaoSession.getDownloadInfoDao();
DownloadInfoRaw raw = new DownloadInfoRaw();
raw.setGid((long) info.galleryInfo.gid);
raw.setState(info.state);
raw.setLegacy(info.legacy);
raw.setDate(info.date);
raw.setLabel(info.label);
dao.insert(raw);
}
public static synchronized void updateDownloadInfo(DownloadInfo info) {
DownloadInfoDao dao = sDaoSession.getDownloadInfoDao();
DownloadInfoRaw raw = dao.load((long) info.galleryInfo.gid);
if (raw == null) {
Log.e("TAG", "Can't find download info: " + info.galleryInfo.gid);
addDownloadInfo(info);
} else {
raw.setState(info.state);
raw.setLegacy(info.legacy);
raw.setDate(info.date);
raw.setLabel(info.label);
dao.update(raw);
}
}
public static synchronized void removeDownloadInfo(int gid) {
DownloadInfoDao dao = sDaoSession.getDownloadInfoDao();
if (null != dao.load((long) gid)) {
removeGalleryInfo(gid);
dao.deleteByKey((long) gid);
}
}
@Nullable
public static synchronized String getDownloadDirname(int gid) {
DownloadDirnameDao dao = sDaoSession.getDownloadDirnameDao();
DownloadDirnameRaw raw = dao.load((long) gid);
if (raw != null) {
return raw.getDirname();
} else {
return null;
}
}
/**
* Insert or update
*/
public static synchronized void putDownloadDirname(int gid, String dirname) {
DownloadDirnameDao dao = sDaoSession.getDownloadDirnameDao();
DownloadDirnameRaw raw = dao.load((long) gid);
if (raw != null) { // Update
raw.setDirname(dirname);
dao.update(raw);
} else { // Insert
raw = new DownloadDirnameRaw();
raw.setGid((long) gid);
raw.setDirname(dirname);
dao.insert(raw);
}
}
public static synchronized void removeDownloadDirname(int gid) {
DownloadDirnameDao dao = sDaoSession.getDownloadDirnameDao();
dao.deleteByKey((long) gid);
}
}