package com.vgmlr.shim import android.content.ContentValues import android.content.Context import android.net.Uri import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import java.io.File class ShimDatabase(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { companion object { private const val DATABASE_NAME = "shim.db" private const val DATABASE_VERSION = 5 const val TABLE_SHIMS = "shims" const val COLUMN_ID = "id" const val COLUMN_TEXT = "shimtext" const val COLUMN_HASH = "shimhash" const val COLUMN_TIME = "shimtime" } override fun onCreate(db: SQLiteDatabase) { val createTable = ("CREATE TABLE $TABLE_SHIMS (" + "$COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "$COLUMN_TEXT TEXT, " + "$COLUMN_HASH TEXT, " + "$COLUMN_TIME TEXT)") db.execSQL(createTable) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { db.execSQL("DROP TABLE IF EXISTS $TABLE_SHIMS") onCreate(db) } fun addShim(text: String, hash: String, time: String): Long { val db = this.writableDatabase val values = ContentValues().apply { put(COLUMN_TEXT, text) put(COLUMN_HASH, hash) put(COLUMN_TIME, time) } return db.insert(TABLE_SHIMS, null, values) } fun getAllShims(): List { val shimList = mutableListOf() val db = this.readableDatabase val cursor = db.rawQuery("SELECT * FROM $TABLE_SHIMS ORDER BY $COLUMN_ID DESC", null) if (cursor.moveToFirst()) { do { shimList.add(ShimClass( cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID)), cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TEXT)), cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HASH)), cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TIME)) )) } while (cursor.moveToNext()) } cursor.close() return shimList } fun searchShims(query: String): List { val shimList = mutableListOf() val db = this.readableDatabase val (sql, selectionArgs) = when { query.startsWith("#") -> { "SELECT * FROM $TABLE_SHIMS WHERE $COLUMN_HASH LIKE ? ORDER BY $COLUMN_ID DESC" to arrayOf("%${query.substring(1)}%") } query.startsWith("\"") && query.endsWith("\"") && query.length >= 2 -> { "SELECT * FROM $TABLE_SHIMS WHERE $COLUMN_TEXT LIKE ? ORDER BY $COLUMN_ID DESC" to arrayOf("%${query.substring(1, query.length - 1)}%") } else -> { "SELECT * FROM $TABLE_SHIMS WHERE $COLUMN_TEXT LIKE ? OR $COLUMN_HASH LIKE ? ORDER BY $COLUMN_ID DESC" to arrayOf("%$query%", "%$query%") } } val cursor = db.rawQuery(sql, selectionArgs) if (cursor.moveToFirst()) { do { shimList.add(ShimClass( cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID)), cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TEXT)), cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HASH)), cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TIME)) )) } while (cursor.moveToNext()) } cursor.close() return shimList } fun deleteShim(id: Int) { val db = this.writableDatabase db.delete(TABLE_SHIMS, "$COLUMN_ID = ?", arrayOf(id.toString())) db.close() } fun importDatabase(context: Context, uri: Uri) { val tempFile = File(context.cacheDir, "import_temp.db") context.contentResolver.openInputStream(uri)?.use { input -> tempFile.outputStream().use { output -> input.copyTo(output) } } val importDb = SQLiteDatabase.openDatabase(tempFile.absolutePath, null, SQLiteDatabase.OPEN_READONLY) val cursor = importDb.rawQuery("SELECT * FROM $TABLE_SHIMS", null) if (cursor.moveToFirst()) { val mainDb = this.writableDatabase do { val values = ContentValues().apply { put(COLUMN_TEXT, cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TEXT))) put(COLUMN_HASH, cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HASH))) put(COLUMN_TIME, cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_TIME))) } mainDb.insert(TABLE_SHIMS, null, values) } while (cursor.moveToNext()) } cursor.close() importDb.close() tempFile.delete() } }