package com.erakk.lnreader.helper.db;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.erakk.lnreader.helper.DBHelper;
import com.erakk.lnreader.helper.Util;
import com.erakk.lnreader.model.ImageModel;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
public class ImageModelHelper {
// New column should be appended as the last column
public static final String DATABASE_CREATE_IMAGES = "create table if not exists " + DBHelper.TABLE_IMAGE + "(" + DBHelper.COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " // 0
+ DBHelper.COLUMN_IMAGE_NAME + " text unique not null, " // 1
+ DBHelper.COLUMN_FILEPATH + " text not null, " // 2
+ DBHelper.COLUMN_URL + " text not null, " // 3
+ DBHelper.COLUMN_REFERER + " text, " // 4
+ DBHelper.COLUMN_LAST_UPDATE + " integer, " // 5
+ DBHelper.COLUMN_LAST_CHECK + " integer, " // 6
+ DBHelper.COLUMN_IS_BIG_IMAGE + " boolean, " // 7
+ DBHelper.COLUMN_PARENT + " text);"; // 8
private static final String TAG = ImageModelHelper.class.toString();
public static ImageModel cursorToImage(Cursor cursor) {
ImageModel image = new ImageModel();
image.setId(cursor.getInt(0));
image.setName(cursor.getString(1));
image.setPath(cursor.getString(2));
try {
image.setUrl(new URL(cursor.getString(3)));
} catch (MalformedURLException ex) {
Log.e(TAG, "Invalid URL: " + cursor.getString(3), ex);
}
image.setReferer(cursor.getString(4));
image.setLastUpdate(new Date(cursor.getInt(5) * 1000));
image.setLastCheck(new Date(cursor.getInt(6) * 1000));
image.setBigImage(cursor.getInt(7) == 1);
image.setParent(cursor.getString(8));
return image;
}
/*
* Query Stuff
*/
public static ImageModel getImageByReferer(DBHelper helper, SQLiteDatabase db, ImageModel image) {
return getImageByReferer(helper, db, image.getReferer());
}
public static ImageModel getImageByReferer(DBHelper helper, SQLiteDatabase db, String url) {
// Log.d(TAG, "Selecting Image by Referer: " + url);
ImageModel image = null;
String nameAlt = "";
if (url.startsWith("https")) {
nameAlt = url.replace("https://", "http://");
} else {
nameAlt = url.replace("http://", "https://");
}
Cursor cursor = helper.rawQuery(db, "select * from " + DBHelper.TABLE_IMAGE + " where " + DBHelper.COLUMN_REFERER + " = ? or " + DBHelper.COLUMN_REFERER + " = ? ", new String[]{url, nameAlt});
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
image = cursorToImage(cursor);
Log.d(TAG, "Found by Ref: " + image.getReferer() + " name: " + image.getName() + " id: " + image.getId());
break;
}
} finally {
if (cursor != null)
cursor.close();
}
if (image == null) {
Log.w(TAG, "Not Found Image by Referer: " + url);
}
return image;
}
public static ImageModel getImage(DBHelper helper, SQLiteDatabase db, ImageModel image) {
return getImage(helper, db, image.getName());
}
public static ImageModel getImage(DBHelper helper, SQLiteDatabase db, String name) {
// Log.d(TAG, "Selecting Image: " + name);
ImageModel image = null;
String nameAlt = "";
if (name.startsWith("https")) {
nameAlt = name.replace("https://", "http://");
} else {
nameAlt = name.replace("http://", "https://");
}
Cursor cursor = helper.rawQuery(db, "select * from " + DBHelper.TABLE_IMAGE + " where " + DBHelper.COLUMN_IMAGE_NAME + " = ? or " + DBHelper.COLUMN_IMAGE_NAME + " = ? ", new String[]{name, nameAlt});
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
image = cursorToImage(cursor);
// Log.d(TAG, "Found: " + image.getName() + " id: " + image.getId());
break;
}
} finally {
if (cursor != null)
cursor.close();
}
if (image == null) {
Log.w(TAG, "Not Found Image: " + name);
}
return image;
}
/*
* Insert Stuff
*/
public static ImageModel insertImage(DBHelper helper, SQLiteDatabase db, ImageModel image) {
ImageModel temp = getImage(helper, db, image.getName());
ContentValues cv = new ContentValues();
cv.put(DBHelper.COLUMN_IMAGE_NAME, image.getName());
cv.put(DBHelper.COLUMN_FILEPATH, image.getPath());
cv.put(DBHelper.COLUMN_URL, image.getUrl().toString());
cv.put(DBHelper.COLUMN_REFERER, image.getReferer());
cv.put(DBHelper.COLUMN_IS_BIG_IMAGE, image.isBigImage());
cv.put(DBHelper.COLUMN_PARENT, image.getParent());
if (temp == null) {
cv.put(DBHelper.COLUMN_LAST_UPDATE, "" + (int) (new Date().getTime() / 1000));
cv.put(DBHelper.COLUMN_LAST_CHECK, "" + (int) (new Date().getTime() / 1000));
helper.insertOrThrow(db, DBHelper.TABLE_IMAGE, null, cv);
Log.i(TAG, "Complete Insert Images: " + image.getName() + " Ref: " + image.getReferer());
} else {
cv.put(DBHelper.COLUMN_LAST_UPDATE, "" + (int) (temp.getLastUpdate().getTime() / 1000));
cv.put(DBHelper.COLUMN_LAST_CHECK, "" + (int) (new Date().getTime() / 1000));
helper.update(db, DBHelper.TABLE_IMAGE, cv, DBHelper.COLUMN_ID + " = ?", new String[]{"" + temp.getId()});
Log.i(TAG, "Complete Update Images: " + image.getName() + " Ref: " + image.getReferer());
}
// get updated data
image = getImage(helper, db, image.getName());
// Log.d(TAG, "Complete Insert Images: " + image.getName() + " id: " + image.getId());
return image;
}
public static ArrayList<ImageModel> getAllImages(DBHelper helper, SQLiteDatabase db) {
ArrayList<ImageModel> result = new ArrayList<ImageModel>();
Cursor cursor = helper.rawQuery(db, "select * from " + DBHelper.TABLE_IMAGE, null);
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
ImageModel image = cursorToImage(cursor);
result.add(image);
cursor.moveToNext();
}
} finally {
if (cursor != null)
cursor.close();
}
return result;
}
public static ArrayList<ImageModel> getAllImagesByParent(DBHelper helper, SQLiteDatabase db, String parent) {
ArrayList<ImageModel> result = new ArrayList<ImageModel>();
Cursor cursor = helper.rawQuery(db, "select * from " + DBHelper.TABLE_IMAGE + " where " + DBHelper.COLUMN_PARENT + " = ? " , new String[] {parent} );
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
ImageModel image = cursorToImage(cursor);
result.add(image);
cursor.moveToNext();
}
} finally {
if (cursor != null)
cursor.close();
}
return result;
}
/*
* Delete Stuff
*/
public static int deleteImageByParent(DBHelper helper, SQLiteDatabase db, String parent) {
Log.d(TAG, "Start deleting images for parent: " + parent);
int result = 0;
if (!Util.isStringNullOrEmpty(parent)) {
// get the files to delete
ArrayList<ImageModel> imagesToDelete = getAllImagesByParent(helper, db, parent);
for( ImageModel image : imagesToDelete) {
String path = image.getPath().replace("?", "_");
File f = new File(path);
try {
if(f.exists()) {
boolean del = f.delete();
if (!del)
del = f.getCanonicalFile().delete();
if (!del) {
Log.w(TAG, "Failed to delete image file: " + path);
} else {
Log.i(TAG, "Deleted: " + path);
}
}
else {
Log.w(TAG, "File doesn't exists: " + path);
}
}catch (IOException ex) {
Log.e(TAG, ex.getMessage(), ex);
}
}
// delete from DB
result = helper.delete(db, DBHelper.TABLE_IMAGE, DBHelper.COLUMN_PARENT + " = ?", new String[]{parent});
}
Log.w(TAG, "Images Deleted: " + result);
return result;
}
}