AppDatabase.kt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package io.legato.kazusa.data
  2. import android.content.ContentValues
  3. import android.database.sqlite.SQLiteDatabase
  4. import androidx.room.AutoMigration
  5. import androidx.room.Database
  6. import androidx.room.Room
  7. import androidx.room.RoomDatabase
  8. import androidx.sqlite.db.SupportSQLiteDatabase
  9. import io.legato.kazusa.data.dao.BookChapterDao
  10. import io.legato.kazusa.data.dao.BookDao
  11. import io.legato.kazusa.data.dao.BookGroupDao
  12. import io.legato.kazusa.data.dao.BookSourceDao
  13. import io.legato.kazusa.data.dao.BookmarkDao
  14. import io.legato.kazusa.data.dao.CacheDao
  15. import io.legato.kazusa.data.dao.CookieDao
  16. import io.legato.kazusa.data.dao.DictRuleDao
  17. import io.legato.kazusa.data.dao.HttpTTSDao
  18. import io.legato.kazusa.data.dao.KeyboardAssistsDao
  19. import io.legato.kazusa.data.dao.ReadRecordDao
  20. import io.legato.kazusa.data.dao.ReplaceRuleDao
  21. import io.legato.kazusa.data.dao.RssArticleDao
  22. import io.legato.kazusa.data.dao.RssReadRecordDao
  23. import io.legato.kazusa.data.dao.RssSourceDao
  24. import io.legato.kazusa.data.dao.RssStarDao
  25. import io.legato.kazusa.data.dao.RuleSubDao
  26. import io.legato.kazusa.data.dao.SearchBookDao
  27. import io.legato.kazusa.data.dao.SearchKeywordDao
  28. import io.legato.kazusa.data.dao.ServerDao
  29. import io.legato.kazusa.data.dao.TxtTocRuleDao
  30. import io.legato.kazusa.data.entities.Book
  31. import io.legato.kazusa.data.entities.BookChapter
  32. import io.legato.kazusa.data.entities.BookGroup
  33. import io.legato.kazusa.data.entities.BookSource
  34. import io.legato.kazusa.data.entities.BookSourcePart
  35. import io.legato.kazusa.data.entities.Bookmark
  36. import io.legato.kazusa.data.entities.Cache
  37. import io.legato.kazusa.data.entities.Cookie
  38. import io.legato.kazusa.data.entities.DictRule
  39. import io.legato.kazusa.data.entities.HttpTTS
  40. import io.legato.kazusa.data.entities.KeyboardAssist
  41. import io.legato.kazusa.data.entities.ReadRecord
  42. import io.legato.kazusa.data.entities.ReplaceRule
  43. import io.legato.kazusa.data.entities.RssArticle
  44. import io.legato.kazusa.data.entities.RssReadRecord
  45. import io.legato.kazusa.data.entities.RssSource
  46. import io.legato.kazusa.data.entities.RssStar
  47. import io.legato.kazusa.data.entities.RuleSub
  48. import io.legato.kazusa.data.entities.SearchBook
  49. import io.legato.kazusa.data.entities.SearchKeyword
  50. import io.legato.kazusa.data.entities.Server
  51. import io.legato.kazusa.data.entities.TxtTocRule
  52. import io.legato.kazusa.help.DefaultData
  53. import org.intellij.lang.annotations.Language
  54. import splitties.init.appCtx
  55. import java.util.Locale
  56. val appDb by lazy {
  57. Room.databaseBuilder(appCtx, AppDatabase::class.java, AppDatabase.DATABASE_NAME)
  58. .fallbackToDestructiveMigrationFrom(false, 1, 2, 3, 4, 5, 6, 7, 8, 9)
  59. .addMigrations(*DatabaseMigrations.migrations)
  60. .allowMainThreadQueries()
  61. .addCallback(AppDatabase.dbCallback)
  62. .build()
  63. }
  64. @Database(
  65. version = 76,
  66. exportSchema = true,
  67. entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class,
  68. ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
  69. RssSource::class, Bookmark::class, RssArticle::class, RssReadRecord::class,
  70. RssStar::class, TxtTocRule::class, ReadRecord::class, HttpTTS::class, Cache::class,
  71. RuleSub::class, DictRule::class, KeyboardAssist::class, Server::class],
  72. views = [BookSourcePart::class],
  73. autoMigrations = [
  74. AutoMigration(from = 43, to = 44),
  75. AutoMigration(from = 44, to = 45),
  76. AutoMigration(from = 45, to = 46),
  77. AutoMigration(from = 46, to = 47),
  78. AutoMigration(from = 47, to = 48),
  79. AutoMigration(from = 48, to = 49),
  80. AutoMigration(from = 49, to = 50),
  81. AutoMigration(from = 50, to = 51),
  82. AutoMigration(from = 51, to = 52),
  83. AutoMigration(from = 52, to = 53),
  84. AutoMigration(from = 53, to = 54),
  85. AutoMigration(from = 54, to = 55, spec = DatabaseMigrations.Migration_54_55::class),
  86. AutoMigration(from = 55, to = 56),
  87. AutoMigration(from = 56, to = 57),
  88. AutoMigration(from = 57, to = 58),
  89. AutoMigration(from = 58, to = 59),
  90. AutoMigration(from = 59, to = 60),
  91. AutoMigration(from = 60, to = 61),
  92. AutoMigration(from = 61, to = 62),
  93. AutoMigration(from = 62, to = 63),
  94. AutoMigration(from = 63, to = 64),
  95. AutoMigration(from = 64, to = 65, spec = DatabaseMigrations.Migration_64_65::class),
  96. AutoMigration(from = 65, to = 66),
  97. AutoMigration(from = 66, to = 67),
  98. AutoMigration(from = 67, to = 68),
  99. AutoMigration(from = 68, to = 69),
  100. AutoMigration(from = 69, to = 70),
  101. AutoMigration(from = 70, to = 71),
  102. AutoMigration(from = 71, to = 72),
  103. AutoMigration(from = 72, to = 73),
  104. AutoMigration(from = 73, to = 74),
  105. AutoMigration(from = 74, to = 75),
  106. AutoMigration(from = 75, to = 76)
  107. ]
  108. )
  109. abstract class AppDatabase : RoomDatabase() {
  110. abstract val bookDao: BookDao
  111. abstract val bookGroupDao: BookGroupDao
  112. abstract val bookSourceDao: BookSourceDao
  113. abstract val bookChapterDao: BookChapterDao
  114. abstract val replaceRuleDao: ReplaceRuleDao
  115. abstract val searchBookDao: SearchBookDao
  116. abstract val searchKeywordDao: SearchKeywordDao
  117. abstract val rssSourceDao: RssSourceDao
  118. abstract val bookmarkDao: BookmarkDao
  119. abstract val rssArticleDao: RssArticleDao
  120. abstract val rssStarDao: RssStarDao
  121. abstract val rssReadRecordDao: RssReadRecordDao
  122. abstract val cookieDao: CookieDao
  123. abstract val txtTocRuleDao: TxtTocRuleDao
  124. abstract val readRecordDao: ReadRecordDao
  125. abstract val httpTTSDao: HttpTTSDao
  126. abstract val cacheDao: CacheDao
  127. abstract val ruleSubDao: RuleSubDao
  128. abstract val dictRuleDao: DictRuleDao
  129. abstract val keyboardAssistsDao: KeyboardAssistsDao
  130. abstract val serverDao: ServerDao
  131. companion object {
  132. const val DATABASE_NAME = "legado.db"
  133. const val BOOK_TABLE_NAME = "books"
  134. const val BOOK_SOURCE_TABLE_NAME = "book_sources"
  135. const val RSS_SOURCE_TABLE_NAME = "rssSources"
  136. val dbCallback = object : Callback() {
  137. override fun onCreate(db: SupportSQLiteDatabase) {
  138. db.setLocale(Locale.CHINESE)
  139. }
  140. override fun onOpen(db: SupportSQLiteDatabase) {
  141. @Language("sql")
  142. val insertBookGroupAllSql = """
  143. insert into book_groups(groupId, groupName, 'order', show)
  144. select ${BookGroup.IdAll}, '全部', -10, 1
  145. where not exists (select * from book_groups where groupId = ${BookGroup.IdAll})
  146. """.trimIndent()
  147. db.execSQL(insertBookGroupAllSql)
  148. @Language("sql")
  149. val insertBookGroupLocalSql = """
  150. insert into book_groups(groupId, groupName, 'order', enableRefresh, show)
  151. select ${BookGroup.IdLocal}, '本地', -9, 0, 1
  152. where not exists (select * from book_groups where groupId = ${BookGroup.IdLocal})
  153. """.trimIndent()
  154. db.execSQL(insertBookGroupLocalSql)
  155. @Language("sql")
  156. val insertBookGroupMusicSql = """
  157. insert into book_groups(groupId, groupName, 'order', show)
  158. select ${BookGroup.IdAudio}, '音频', -8, 1
  159. where not exists (select * from book_groups where groupId = ${BookGroup.IdAudio})
  160. """.trimIndent()
  161. db.execSQL(insertBookGroupMusicSql)
  162. @Language("sql")
  163. val insertBookGroupNetNoneGroupSql = """
  164. insert into book_groups(groupId, groupName, 'order', show)
  165. select ${BookGroup.IdNetNone}, '网络未分组', -7, 1
  166. where not exists (select * from book_groups where groupId = ${BookGroup.IdNetNone})
  167. """.trimIndent()
  168. db.execSQL(insertBookGroupNetNoneGroupSql)
  169. @Language("sql")
  170. val insertBookGroupLocalNoneGroupSql = """
  171. insert into book_groups(groupId, groupName, 'order', show)
  172. select ${BookGroup.IdLocalNone}, '本地未分组', -6, 0
  173. where not exists (select * from book_groups where groupId = ${BookGroup.IdLocalNone})
  174. """.trimIndent()
  175. db.execSQL(insertBookGroupLocalNoneGroupSql)
  176. @Language("sql")
  177. val insertBookGroupErrorSql = """
  178. insert into book_groups(groupId, groupName, 'order', show)
  179. select ${BookGroup.IdError}, '更新失败', -1, 1
  180. where not exists (select * from book_groups where groupId = ${BookGroup.IdError})
  181. """.trimIndent()
  182. db.execSQL(insertBookGroupErrorSql)
  183. @Language("sql")
  184. val upBookSourceLoginUiSql =
  185. "update book_sources set loginUi = null where loginUi = 'null'"
  186. db.execSQL(upBookSourceLoginUiSql)
  187. @Language("sql")
  188. val upRssSourceLoginUiSql =
  189. "update rssSources set loginUi = null where loginUi = 'null'"
  190. db.execSQL(upRssSourceLoginUiSql)
  191. @Language("sql")
  192. val upHttpTtsLoginUiSql =
  193. "update httpTTS set loginUi = null where loginUi = 'null'"
  194. db.execSQL(upHttpTtsLoginUiSql)
  195. @Language("sql")
  196. val upHttpTtsConcurrentRateSql =
  197. "update httpTTS set concurrentRate = '0' where concurrentRate is null"
  198. db.execSQL(upHttpTtsConcurrentRateSql)
  199. db.query("select * from keyboardAssists order by serialNo").use {
  200. if (it.count == 0) {
  201. DefaultData.keyboardAssists.forEach { keyboardAssist ->
  202. val contentValues = ContentValues().apply {
  203. put("type", keyboardAssist.type)
  204. put("key", keyboardAssist.key)
  205. put("value", keyboardAssist.value)
  206. put("serialNo", keyboardAssist.serialNo)
  207. }
  208. db.insert(
  209. "keyboardAssists",
  210. SQLiteDatabase.CONFLICT_REPLACE,
  211. contentValues
  212. )
  213. }
  214. }
  215. }
  216. }
  217. }
  218. }
  219. }