18
18
package net.bible.service.sword.epub
19
19
20
20
import android.content.ContentValues
21
+ import android.database.sqlite.SQLiteCantOpenDatabaseException
22
+ import android.util.Log
21
23
import io.requery.android.database.sqlite.SQLiteDatabase
22
24
import io.requery.android.database.sqlite.SQLiteDatabase.CONFLICT_IGNORE
23
25
import java.io.File
@@ -26,30 +28,35 @@ import java.io.File
26
28
data class EpubSearchResult (val fragId : Long , val ordinal : Int , val text : String )
27
29
28
30
class EpubSearch (val file : File ) {
29
- private val db = SQLiteDatabase .openDatabase(file.path, null , SQLiteDatabase .OPEN_READWRITE or SQLiteDatabase .CREATE_IF_NECESSARY )
30
- val isIndexed: Boolean get() = db.run {
31
- ! query(" SELECT name FROM sqlite_master WHERE type='table' AND name=?" , arrayOf(" SearchIndex" )).isAfterLast
31
+ private val db = try {
32
+ SQLiteDatabase .openDatabase(file.path, null , SQLiteDatabase .OPEN_READWRITE or SQLiteDatabase .CREATE_IF_NECESSARY )
33
+ } catch (e: SQLiteCantOpenDatabaseException ) {
34
+ Log .e(" EpubSearch" , " Could not open database ${file.path} " )
35
+ null
32
36
}
37
+ val isIndexed: Boolean get() = db?.run {
38
+ ! query(" SELECT name FROM sqlite_master WHERE type='table' AND name=?" , arrayOf(" SearchIndex" )).isAfterLast
39
+ }? : false
33
40
34
- fun deleteIndex () = db.run {
41
+ fun deleteIndex () = db? .run {
35
42
execSQL(""" DROP TABLE IF EXISTS SearchIndex""" )
36
43
}
37
44
38
- fun createTable () = db.run {
45
+ fun createTable () = db? .run {
39
46
execSQL("""
40
47
CREATE VIRTUAL TABLE SearchIndex USING FTS5(contentText, frag_id UNINDEXED, ordinal UNINDEXED);
41
48
""" .trimIndent())
42
49
}
43
50
44
- fun addContent (content : String , fragId : Long , ordinal : Int ) = db.run {
51
+ fun addContent (content : String , fragId : Long , ordinal : Int ) = db? .run {
45
52
insert(" SearchIndex" , CONFLICT_IGNORE , ContentValues ().apply {
46
53
put(" contentText" , content)
47
54
put(" frag_id" , fragId)
48
55
put(" ordinal" , ordinal)
49
56
})
50
57
}
51
58
52
- fun search (text : String ): List <EpubSearchResult > = db.run {
59
+ fun search (text : String ): List <EpubSearchResult > = db? .run {
53
60
query(" SELECT frag_id, ordinal, highlight(SearchIndex, 0, '<b>', '</b>') FROM SearchIndex WHERE contentText MATCH ?" , bindArgs = arrayOf(text)).let { c ->
54
61
c.moveToFirst()
55
62
val list = mutableListOf<EpubSearchResult >()
@@ -62,5 +69,5 @@ class EpubSearch(val file: File) {
62
69
}
63
70
list
64
71
}
65
- }
72
+ }? : emptyList()
66
73
}
0 commit comments