Signal-iOS/SignalServiceKit/Storage/Database/SDSTableMetadata.swift
2024-03-27 12:22:52 -05:00

89 lines
1.9 KiB
Swift

//
// 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 }
}
}