Skip to content

Commit a0e101e

Browse files
authored
Merge pull request #1810 from groue/dev/persistable-views
Persistable Database Views
2 parents aab2664 + 9ef5e2c commit a0e101e

33 files changed

+2795
-276
lines changed

GRDB.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
56256ED025D1ACD0008C2BDD /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56256ECF25D1ACD0008C2BDD /* Table.swift */; };
8282
56256ED925D1B316008C2BDD /* ForeignKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56256ED825D1B316008C2BDD /* ForeignKey.swift */; };
8383
562756431E963AAC0035B653 /* DatabaseWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 562756421E963AAC0035B653 /* DatabaseWriterTests.swift */; };
84+
562822FA2E631F2100B5A627 /* DatabaseSchemaSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 562822F92E631F1E00B5A627 /* DatabaseSchemaSource.swift */; };
8485
562B58CB2A29BBEF00E8C75D /* Issue1383.sqlite in Resources */ = {isa = PBXBuildFile; fileRef = 562B58CA2A29BBEF00E8C75D /* Issue1383.sqlite */; };
8586
562EA8261F17B2AC00FA528C /* CompilationProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 562EA8251F17B2AC00FA528C /* CompilationProtocolTests.swift */; };
8687
562EA82F1F17B9EB00FA528C /* CompilationSubClassTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 562EA82E1F17B9EB00FA528C /* CompilationSubClassTests.swift */; };
@@ -223,6 +224,7 @@
223224
568068311EBBA26100EFB8AA /* SQLRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 568068301EBBA26100EFB8AA /* SQLRequestTests.swift */; };
224225
5682D721239582AA004B58C4 /* DatabaseSuspensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5682D71A239582AA004B58C4 /* DatabaseSuspensionTests.swift */; };
225226
56848973242DE36F002F9702 /* ValueObservationScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56848972242DE36F002F9702 /* ValueObservationScheduler.swift */; };
227+
568515A42E66C2A70082E9A1 /* RecordMappedOnMutableViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 568515A32E66C2A70082E9A1 /* RecordMappedOnMutableViewTests.swift */; };
226228
5685C1932AD52EE600DA4B7A /* ListDumpFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5685C1922AD52EE600DA4B7A /* ListDumpFormat.swift */; };
227229
56894F752606576600268F4D /* FoundationDecimalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56894F742606576600268F4D /* FoundationDecimalTests.swift */; };
228230
56894FB72606589700268F4D /* Decimal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56894F94260657D600268F4D /* Decimal.swift */; };
@@ -288,6 +290,7 @@
288290
56B964B11DA51D010002DA19 /* FTS5TokenizerDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56B964B01DA51D010002DA19 /* FTS5TokenizerDescriptor.swift */; };
289291
56B964B91DA51D0A0002DA19 /* FTS5Pattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56B964B81DA51D0A0002DA19 /* FTS5Pattern.swift */; };
290292
56BB6EA91D3009B100A1CA52 /* SchedulingWatchdog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56BB6EA81D3009B100A1CA52 /* SchedulingWatchdog.swift */; };
293+
56BCA2622E6C28F800E4F08D /* DatabaseSchemaSourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56BCA2612E6C28EF00E4F08D /* DatabaseSchemaSourceTests.swift */; };
291294
56BF2282241781C5003D86EB /* UtilsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56BF2281241781C5003D86EB /* UtilsTests.swift */; };
292295
56CC922C201DFFB900CB597E /* DropWhileCursorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56CC922B201DFFB900CB597E /* DropWhileCursorTests.swift */; };
293296
56CC9243201E034D00CB597E /* PrefixWhileCursorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56CC9242201E034D00CB597E /* PrefixWhileCursorTests.swift */; };
@@ -503,6 +506,7 @@
503506
56256ECF25D1ACD0008C2BDD /* Table.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Table.swift; sourceTree = "<group>"; };
504507
56256ED825D1B316008C2BDD /* ForeignKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForeignKey.swift; sourceTree = "<group>"; };
505508
562756421E963AAC0035B653 /* DatabaseWriterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseWriterTests.swift; sourceTree = "<group>"; };
509+
562822F92E631F1E00B5A627 /* DatabaseSchemaSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseSchemaSource.swift; sourceTree = "<group>"; };
506510
562B58CA2A29BBEF00E8C75D /* Issue1383.sqlite */ = {isa = PBXFileReference; lastKnownFileType = file; path = Issue1383.sqlite; sourceTree = "<group>"; };
507511
562EA8251F17B2AC00FA528C /* CompilationProtocolTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompilationProtocolTests.swift; sourceTree = "<group>"; };
508512
562EA82E1F17B9EB00FA528C /* CompilationSubClassTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompilationSubClassTests.swift; sourceTree = "<group>"; };
@@ -674,6 +678,7 @@
674678
568068301EBBA26100EFB8AA /* SQLRequestTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLRequestTests.swift; sourceTree = "<group>"; };
675679
5682D71A239582AA004B58C4 /* DatabaseSuspensionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseSuspensionTests.swift; sourceTree = "<group>"; };
676680
56848972242DE36F002F9702 /* ValueObservationScheduler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValueObservationScheduler.swift; sourceTree = "<group>"; };
681+
568515A32E66C2A70082E9A1 /* RecordMappedOnMutableViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordMappedOnMutableViewTests.swift; sourceTree = "<group>"; };
677682
5685C1922AD52EE600DA4B7A /* ListDumpFormat.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListDumpFormat.swift; sourceTree = "<group>"; };
678683
5687359E1CEDE16C009B9116 /* Betty.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Betty.jpeg; sourceTree = "<group>"; };
679684
56894F742606576600268F4D /* FoundationDecimalTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FoundationDecimalTests.swift; sourceTree = "<group>"; };
@@ -792,6 +797,7 @@
792797
56B964C11DA521450002DA19 /* FTS5RecordTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS5RecordTests.swift; sourceTree = "<group>"; };
793798
56B964C21DA521450002DA19 /* FTS5TableBuilderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS5TableBuilderTests.swift; sourceTree = "<group>"; };
794799
56BB6EA81D3009B100A1CA52 /* SchedulingWatchdog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchedulingWatchdog.swift; sourceTree = "<group>"; };
800+
56BCA2612E6C28EF00E4F08D /* DatabaseSchemaSourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseSchemaSourceTests.swift; sourceTree = "<group>"; };
795801
56BF2281241781C5003D86EB /* UtilsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilsTests.swift; sourceTree = "<group>"; };
796802
56C3F7521CF9F12400F6A361 /* DatabaseSavepointTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseSavepointTests.swift; sourceTree = "<group>"; };
797803
56C48E731C9A9923005DF1D9 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
@@ -997,6 +1003,7 @@
9971003
56B021C81D8C0D3900B239BB /* MutablePersistableRecordPersistenceConflictPolicyTests.swift */,
9981004
563363A91C933FF8000BE133 /* MutablePersistableRecordTests.swift */,
9991005
563363AA1C933FF8000BE133 /* PersistableRecordTests.swift */,
1006+
568515A32E66C2A70082E9A1 /* RecordMappedOnMutableViewTests.swift */,
10001007
);
10011008
name = PersistableRecord;
10021009
sourceTree = "<group>";
@@ -1486,6 +1493,7 @@
14861493
56EA86931C91DFE7002BB4DF /* DatabaseReaderTests.swift */,
14871494
564CE5BD21B8FFA300652B19 /* DatabaseRegionObservationTests.swift */,
14881495
56C3F7521CF9F12400F6A361 /* DatabaseSavepointTests.swift */,
1496+
56BCA2612E6C28EF00E4F08D /* DatabaseSchemaSourceTests.swift */,
14891497
568EB71D2921234800E59445 /* DatabaseSnapshotPoolTests.swift */,
14901498
566A8424204120B700E50BFD /* DatabaseSnapshotTests.swift */,
14911499
5682D71A239582AA004B58C4 /* DatabaseSuspensionTests.swift */,
@@ -1592,6 +1600,7 @@
15921600
569EF0E1200D2D8400A9FA45 /* DatabaseRegion.swift */,
15931601
564CE5AB21B8FAB400652B19 /* DatabaseRegionObservation.swift */,
15941602
5695311E1C907A8C00CF1A2B /* DatabaseSchemaCache.swift */,
1603+
562822F92E631F1E00B5A627 /* DatabaseSchemaSource.swift */,
15951604
566A84192041146100E50BFD /* DatabaseSnapshot.swift */,
15961605
568EB71829211E0700E59445 /* DatabaseSnapshotPool.swift */,
15971606
56A238751B9C75030082EB20 /* DatabaseValue.swift */,
@@ -2010,6 +2019,7 @@
20102019
56677C15241D14450050755D /* FailureTestCase.swift in Sources */,
20112020
5615B289222B17C000061C1C /* AssociationHasOneThroughDecodableRecordTests.swift in Sources */,
20122021
56D4968A1D81316E008276D7 /* DatabaseValueConvertibleSubclassTests.swift in Sources */,
2022+
568515A42E66C2A70082E9A1 /* RecordMappedOnMutableViewTests.swift in Sources */,
20132023
5682D721239582AA004B58C4 /* DatabaseSuspensionTests.swift in Sources */,
20142024
56D496601D81304E008276D7 /* FoundationNSUUIDTests.swift in Sources */,
20152025
567F45A81F888B2600030B59 /* TruncateOptimizationTests.swift in Sources */,
@@ -2114,6 +2124,7 @@
21142124
D263F40A26C613090038B07F /* DatabaseColumnEncodingStrategyTests.swift in Sources */,
21152125
5653EAEE20944B4F00F46237 /* AssociationParallelDecodableRecordTests.swift in Sources */,
21162126
56D496861D813147008276D7 /* UpdateStatementTests.swift in Sources */,
2127+
56BCA2622E6C28F800E4F08D /* DatabaseSchemaSourceTests.swift in Sources */,
21172128
56D4965D1D81304E008276D7 /* FoundationNSNumberTests.swift in Sources */,
21182129
56B021C91D8C0D3900B239BB /* MutablePersistableRecordPersistenceConflictPolicyTests.swift in Sources */,
21192130
56D496C11D81373A008276D7 /* DatabaseQueueBackupTests.swift in Sources */,
@@ -2208,6 +2219,7 @@
22082219
566B91331FA4D3810012D5B0 /* TransactionObserver.swift in Sources */,
22092220
566475D31D981D5E00FF74B8 /* SQLOperators.swift in Sources */,
22102221
56CEB4FA1EAA2F4D00BFAF62 /* FTS3.swift in Sources */,
2222+
562822FA2E631F2100B5A627 /* DatabaseSchemaSource.swift in Sources */,
22112223
56D110CE28AFC72100E64463 /* MutablePersistableRecord+Delete.swift in Sources */,
22122224
563082E42430B6BE00C14A05 /* DatabaseCancellable.swift in Sources */,
22132225
564CE59D21B7A8B500652B19 /* RemoveDuplicates.swift in Sources */,

GRDB/Core/Configuration.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,22 @@ public struct Configuration: Sendable {
421421
/// reveals that a lot of time is spent opening new SQLite connections.
422422
public var persistentReadOnlyConnections = false
423423

424+
// MARK: - Database Schema
425+
426+
/// A custom schema source.
427+
///
428+
/// The use case for a custom schema source is enabling GRDB features that
429+
/// would not work with the built-in schema introspection that is provided
430+
/// by SQLite. For example, a custom schema source can help record types
431+
/// that read or write in a database view.
432+
///
433+
/// The schema source is automatically disabled during database
434+
/// migrations performed by ``DatabaseMigrator``: those access the raw
435+
/// SQLite schema, unaltered. If a migration needs a schema source,
436+
/// you may call ``Database/withSchemaSource(_:execute:)`` from within
437+
/// the body of a migration.
438+
public var schemaSource: (any DatabaseSchemaSource)?
439+
424440
// MARK: - Factory Configuration
425441

426442
/// Creates a factory configuration.

0 commit comments

Comments
 (0)