1 //  Copyright © 2021 650 Industries. All rights reserved.
2 
3 // swiftlint:disable line_length
4 
5 import Foundation
6 import sqlite3
7 
8 internal final class UpdatesDatabaseMigration4To5: UpdatesDatabaseMigration {
9   private(set) var filename: String = "expo-v4.db"
10 
11   func runMigration(onDatabase db: OpaquePointer) throws {
12     try db.withForeignKeysOff {
13       try db.withTransaction { trx in
14         try trx.safeExecOrRollback(sql: """
15           CREATE TABLE "new_assets" (
16             "id"  INTEGER PRIMARY KEY AUTOINCREMENT,
17             "url"  TEXT,
18             "key"  TEXT UNIQUE,
19             "headers"  TEXT,
20             "type"  TEXT NOT NULL,
21             "metadata"  TEXT,
22             "download_time"  INTEGER NOT NULL,
23             "relative_path"  TEXT NOT NULL,
24             "hash"  BLOB NOT NULL,
25             "hash_type"  INTEGER NOT NULL,
26             "marked_for_deletion"  INTEGER NOT NULL
27           )
28         """)
29 
30         try trx.safeExecOrRollback(sql: """
31           INSERT INTO `new_assets` (`id`, `url`, `key`, `headers`, `type`, `metadata`, `download_time`, `relative_path`, `hash`, `hash_type`, `marked_for_deletion`)
32             SELECT `id`, `url`, `key`, `headers`, `type`, `metadata`, `download_time`, `relative_path`, `hash`, `hash_type`, `marked_for_deletion` FROM `assets`
33         """)
34 
35         try trx.safeExecOrRollback(sql: "DROP TABLE `assets`")
36         try trx.safeExecOrRollback(sql: "ALTER TABLE `new_assets` RENAME TO `assets`")
37       }
38     }
39   }
40 }
41