// // Copyright 2019 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only // import Foundation import GRDB import SignalCoreKit // TODO: We need to revise this. @objc public enum SDSColumnType: Int32 { case unicodeString case blob case bool case int case int64 case double case primaryKey } @objc public class SDSColumnMetadata: NSObject { @objc public let columnName: String @objc public let columnType: SDSColumnType @objc public let isOptional: Bool @objc public let isUnique: Bool // If true, this column isn't needed for deserialization and can be skipped in SELECT statements. @objc public let skipSelect: Bool @objc public init(columnName: String, columnType: SDSColumnType, isOptional: Bool = false, isUnique: Bool = false, skipSelect: Bool = false) { self.columnName = columnName self.columnType = columnType self.isOptional = isOptional self.isUnique = isUnique self.skipSelect = skipSelect } } // MARK: - // TODO: Consider adding uniqueIdColumn field. @objc public class SDSTableMetadata: NSObject { @objc public let collection: String @objc public let tableName: String @objc public let columns: [SDSColumnMetadata] public let databaseSelectionColumns: [Column] public let selectColumnNames: [String] @objc public init(collection: String, tableName: String, columns: [SDSColumnMetadata]) { self.collection = collection self.tableName = tableName self.columns = columns databaseSelectionColumns = columns.filter { (columMetaData) in return !columMetaData.skipSelect }.map { (columMetaData) in Column(columMetaData.columnName) } selectColumnNames = columns.filter { !$0.skipSelect }.map { $0.columnName } } public var columnNames: [String] { return columns.map { $0.columnName } } }