package agzam.vyatsu.data.local import androidx.room.Database import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase @Database( entities = [ GroupEntity::class, GroupPeriodEntity::class, ScheduleEntity::class, DayEntity::class, LessonEntity::class, PreferenceEntity::class, DepartmentEntity::class, DepartmentPeriodEntity::class, TeacherScheduleEntity::class, TeacherDayEntity::class, TeacherLessonEntity::class ], version = 4, exportSchema = true ) @TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun groupDao(): GroupDao abstract fun scheduleDao(): ScheduleDao abstract fun preferencesDao(): PreferencesDao abstract fun teacherDao(): TeacherDao abstract fun teacherScheduleDao(): TeacherScheduleDao companion object { val MIGRATION_3_4 = object : Migration(3, 4) { override fun migrate(db: SupportSQLiteDatabase) { db.execSQL( "CREATE TABLE IF NOT EXISTS `departments` (" + "`departmentId` TEXT NOT NULL, `name` TEXT NOT NULL, " + "`faculty` TEXT NOT NULL, `lastSyncedAt` INTEGER NOT NULL, " + "PRIMARY KEY(`departmentId`))" ) db.execSQL( "CREATE TABLE IF NOT EXISTS `department_periods` (" + "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`departmentId` TEXT NOT NULL, `season` TEXT NOT NULL, " + "`weekStart` INTEGER NOT NULL, `weekEnd` INTEGER NOT NULL, " + "FOREIGN KEY(`departmentId`) REFERENCES `departments`(`departmentId`) " + "ON UPDATE NO ACTION ON DELETE CASCADE )" ) db.execSQL( "CREATE INDEX IF NOT EXISTS `index_department_periods_departmentId` " + "ON `department_periods` (`departmentId`)" ) db.execSQL( "CREATE TABLE IF NOT EXISTS `teacher_schedules` (" + "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`departmentId` TEXT NOT NULL, `season` TEXT NOT NULL, " + "`weekStart` INTEGER NOT NULL, `weekEnd` INTEGER NOT NULL, " + "`lastSyncedAt` INTEGER NOT NULL, " + "FOREIGN KEY(`departmentId`) REFERENCES `departments`(`departmentId`) " + "ON UPDATE NO ACTION ON DELETE CASCADE )" ) db.execSQL( "CREATE INDEX IF NOT EXISTS `index_teacher_schedules_departmentId` " + "ON `teacher_schedules` (`departmentId`)" ) db.execSQL( "CREATE UNIQUE INDEX IF NOT EXISTS `index_teacher_schedules_departmentId_season_weekStart` " + "ON `teacher_schedules` (`departmentId`, `season`, `weekStart`)" ) db.execSQL( "CREATE TABLE IF NOT EXISTS `teacher_days` (" + "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`scheduleId` INTEGER NOT NULL, `date` INTEGER NOT NULL, " + "FOREIGN KEY(`scheduleId`) REFERENCES `teacher_schedules`(`id`) " + "ON UPDATE NO ACTION ON DELETE CASCADE )" ) db.execSQL( "CREATE INDEX IF NOT EXISTS `index_teacher_days_scheduleId` " + "ON `teacher_days` (`scheduleId`)" ) db.execSQL( "CREATE INDEX IF NOT EXISTS `index_teacher_days_date` " + "ON `teacher_days` (`date`)" ) db.execSQL( "CREATE TABLE IF NOT EXISTS `teacher_lessons` (" + "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`dayId` INTEGER NOT NULL, `date` INTEGER NOT NULL, " + "`slotIndex` INTEGER NOT NULL, `start` INTEGER NOT NULL, " + "`end` INTEGER NOT NULL, `lessonIndex` INTEGER NOT NULL, " + "`raw` TEXT NOT NULL, `room` TEXT, `groupName` TEXT, " + "`subgroup` TEXT, `subject` TEXT, `type` TEXT NOT NULL, " + "`teacher` TEXT NOT NULL, " + "FOREIGN KEY(`dayId`) REFERENCES `teacher_days`(`id`) " + "ON UPDATE NO ACTION ON DELETE CASCADE )" ) db.execSQL( "CREATE INDEX IF NOT EXISTS `index_teacher_lessons_dayId` " + "ON `teacher_lessons` (`dayId`)" ) db.execSQL( "CREATE INDEX IF NOT EXISTS `index_teacher_lessons_teacher` " + "ON `teacher_lessons` (`teacher`)" ) db.execSQL( "CREATE INDEX IF NOT EXISTS `index_teacher_lessons_room` " + "ON `teacher_lessons` (`room`)" ) db.execSQL( "CREATE INDEX IF NOT EXISTS `index_teacher_lessons_subject` " + "ON `teacher_lessons` (`subject`)" ) } } } }