Skip to content

Commit 66ad925

Browse files
Engine DB 3.0.1 schema support (#166)
* Engine DB 3.1.0 schema support * Revert test changes and remove repeated code for 3_1_1 schema * Update README for new supported versions * Change 3.1.0 to 3.0.1 * Update include/djinterop/engine/engine_schema.hpp Co-authored-by: Adam Szmigin <[email protected]> --------- Co-authored-by: Adam Szmigin <[email protected]>
1 parent 8c53fd8 commit 66ad925

File tree

7 files changed

+289
-10
lines changed

7 files changed

+289
-10
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ add_library(
132132
src/djinterop/engine/schema/schema_2_21_2.hpp
133133
src/djinterop/engine/schema/schema_3_0_0.cpp
134134
src/djinterop/engine/schema/schema_3_0_0.hpp
135+
src/djinterop/engine/schema/schema_3_0_1.cpp
136+
src/djinterop/engine/schema/schema_3_0_1.hpp
135137
src/djinterop/engine/schema/schema.cpp
136138
src/djinterop/engine/schema/schema.hpp
137139
src/djinterop/engine/schema/schema_validate_utils.hpp

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ What is supported:
2828

2929
The library supports the following firmware and application versions:
3030

31-
* SC5000 Firmware from 1.0.3 to 4.1.0.
32-
* Other players (e.g. SC6000/M) may work, but this is currently untested.
33-
* Engine DJ Desktop (aka Engine Prime) from 1.0.1 to 4.1.0.
31+
* Engine DJ OS from 1.0.3 to 4.3.3.
32+
* Tested on Denon SC5000 and Numark Mixstream Pro. Other players (e.g. SC6000/M) may work, but this is currently untested.
33+
* Engine DJ Desktop (aka Engine Prime) from 1.0.1 to 4.3.0.
3434

3535
What is not supported (yet):
3636

include/djinterop/engine/engine_schema.hpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ enum class DJINTEROP_PUBLIC engine_schema
5151
schema_2_21_2,
5252

5353
schema_3_0_0,
54+
schema_3_0_1,
5455
};
5556

5657
/// Set of supported schema versions.
@@ -64,7 +65,7 @@ constexpr std::array supported_schemas{
6465
engine_schema::schema_2_20_1, engine_schema::schema_2_20_2,
6566
engine_schema::schema_2_20_3, engine_schema::schema_2_21_0,
6667
engine_schema::schema_2_21_1, engine_schema::schema_2_21_2,
67-
engine_schema::schema_3_0_0};
68+
engine_schema::schema_3_0_0, engine_schema::schema_3_0_1};
6869

6970
/// Set of supported schema 1.x versions.
7071
constexpr std::array supported_v1_schemas{
@@ -84,10 +85,10 @@ constexpr std::array supported_v2_schemas{
8485

8586
/// Set of supported schema 3.x versions.
8687
constexpr std::array supported_v3_schemas{
87-
engine_schema::schema_3_0_0};
88+
engine_schema::schema_3_0_0, engine_schema::schema_3_0_1};
8889

8990
/// The most recent schema version supported by the library.
90-
constexpr engine_schema latest_schema = engine_schema::schema_3_0_0;
91+
constexpr engine_schema latest_schema = engine_schema::schema_3_0_1;
9192

9293
/// The most recent schema 1.x version supported by the library.
9394
constexpr engine_schema latest_v1_schema = engine_schema::schema_1_18_0_os;
@@ -96,7 +97,7 @@ constexpr engine_schema latest_v1_schema = engine_schema::schema_1_18_0_os;
9697
constexpr engine_schema latest_v2_schema = engine_schema::schema_2_21_2;
9798

9899
/// The most recent schema 3.x version supported by the library.
99-
constexpr engine_schema latest_v3_schema = engine_schema::schema_3_0_0;
100+
constexpr engine_schema latest_v3_schema = engine_schema::schema_3_0_1;
100101

101102
/// Get a string representation of the schema.
102103
inline std::string to_string(const engine_schema& v)
@@ -122,6 +123,7 @@ inline std::string to_string(const engine_schema& v)
122123
case engine_schema::schema_2_21_1: return "2.21.1";
123124
case engine_schema::schema_2_21_2: return "2.21.2";
124125
case engine_schema::schema_3_0_0: return "3.0.0";
126+
case engine_schema::schema_3_0_1: return "3.0.1";
125127
}
126128

127129
return "(unknown schema with ordinal " +
@@ -159,6 +161,7 @@ inline std::string to_application_version_string(const engine_schema& v)
159161
case engine_schema::schema_2_21_1: return "Engine DJ Desktop/OS 4.0.0";
160162
case engine_schema::schema_2_21_2: return "Engine DJ Desktop/OS 4.0.1";
161163
case engine_schema::schema_3_0_0: return "Engine DJ Desktop/OS 4.1.0 to 4.2.1";
164+
case engine_schema::schema_3_0_1: return "Engine DJ Desktop/OS 4.3.x";
162165
}
163166

164167
return "Engine versions unknown (" + to_string(v) + ")";

src/djinterop/engine/schema/schema.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "schema_2_21_1.hpp"
4141
#include "schema_2_21_2.hpp"
4242
#include "schema_3_0_0.hpp"
43+
#include "schema_3_0_1.hpp"
4344

4445
namespace djinterop::engine::schema
4546
{
@@ -110,6 +111,8 @@ std::unique_ptr<schema_creator_validator> make_schema_creator_validator(
110111
return std::make_unique<schema_2_21_2>();
111112
case engine_schema::schema_3_0_0:
112113
return std::make_unique<schema_3_0_0>();
114+
case engine_schema::schema_3_0_1:
115+
return std::make_unique<schema_3_0_1>();
113116
}
114117

115118
throw unsupported_operation{
@@ -233,9 +236,12 @@ engine_schema detect_schema(
233236
case 3:
234237
switch (version.min)
235238
{
236-
case 0:
237-
REQUIRE_PATCH_VERSION(version, 0);
238-
return engine_schema::schema_3_0_0;
239+
case 0:
240+
switch (version.pat)
241+
{
242+
case 0: return engine_schema::schema_3_0_0;
243+
case 1: return engine_schema::schema_3_0_1;
244+
}
239245
default: throw unsupported_database{make_err_message(version)};
240246
}
241247
default: throw unsupported_database{make_err_message(version)};
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
/*
2+
This file is part of libdjinterop.
3+
4+
libdjinterop is free software: you can redistribute it and/or modify
5+
it under the terms of the GNU Lesser General Public License as published by
6+
the Free Software Foundation, either version 3 of the License, or
7+
(at your option) any later version.
8+
9+
libdjinterop is distributed in the hope that it will be useful,
10+
but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
GNU Lesser General Public License for more details.
13+
14+
You should have received a copy of the GNU Lesser General Public License
15+
along with libdjinterop. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
#include <sqlite_modern_cpp.h>
19+
20+
#include "../../util/random.hpp"
21+
#include "schema_3_0_1.hpp"
22+
23+
namespace djinterop::engine::schema
24+
{
25+
void schema_3_0_1::create(sqlite::database& db)
26+
{
27+
// Schema 3.0.1 modifies trigger definitions on the Track and
28+
// PerformanceData tables.
29+
db << "CREATE TABLE Information ( id INTEGER PRIMARY KEY AUTOINCREMENT, "
30+
" uuid TEXT, schemaVersionMajor INTEGER, schemaVersionMinor "
31+
"INTEGER, schemaVersionPatch INTEGER, "
32+
"currentPlayedIndiciator INTEGER, "
33+
"lastRekordBoxLibraryImportReadCounter INTEGER);";
34+
db << "CREATE TABLE AlbumArt ( id INTEGER PRIMARY KEY AUTOINCREMENT, "
35+
"hash TEXT, albumArt BLOB );";
36+
db << "CREATE TABLE Pack ( id INTEGER PRIMARY KEY AUTOINCREMENT, packId "
37+
"TEXT, changeLogDatabaseUuid TEXT, changeLogId INTEGER, "
38+
"lastPackTime DATETIME );";
39+
db << "CREATE TABLE Playlist ( id INTEGER PRIMARY KEY AUTOINCREMENT, "
40+
"title TEXT, parentListId INTEGER, isPersisted BOOLEAN, "
41+
"nextListId INTEGER, lastEditTime DATETIME, isExplicitlyExported "
42+
"BOOLEAN, CONSTRAINT C_NAME_UNIQUE_FOR_PARENT UNIQUE (title, "
43+
"parentListId), CONSTRAINT C_NEXT_LIST_ID_UNIQUE_FOR_PARENT UNIQUE "
44+
"(parentListId, nextListId) );";
45+
db << "CREATE TABLE PlaylistEntity ( id INTEGER PRIMARY KEY "
46+
"AUTOINCREMENT, listId INTEGER, trackId INTEGER, "
47+
"databaseUuid TEXT, nextEntityId INTEGER, membershipReference "
48+
"INTEGER, CONSTRAINT C_NAME_UNIQUE_FOR_LIST UNIQUE (listId, "
49+
"databaseUuid, trackId), FOREIGN KEY (listId) REFERENCES Playlist "
50+
"(id) ON DELETE CASCADE );";
51+
db << "CREATE TABLE Smartlist ( listUuid TEXT NOT NULL PRIMARY KEY, "
52+
" title TEXT, parentPlaylistPath TEXT, nextPlaylistPath TEXT, "
53+
" nextListUuid TEXT, rules TEXT, lastEditTime DATETIME, "
54+
"CONSTRAINT C_NAME_UNIQUE_FOR_PARENT UNIQUE (title, "
55+
"parentPlaylistPath), CONSTRAINT C_NEXT_LIST_UNIQUE_FOR_PARENT "
56+
"UNIQUE (parentPlaylistPath, nextPlaylistPath, nextListUuid) );";
57+
db << "CREATE TABLE Track ( id INTEGER PRIMARY KEY AUTOINCREMENT, "
58+
"playOrder INTEGER, length INTEGER, bpm INTEGER, year "
59+
"INTEGER, path TEXT, filename TEXT, bitrate INTEGER, "
60+
"bpmAnalyzed REAL, albumArtId INTEGER, fileBytes INTEGER, "
61+
"title TEXT, artist TEXT, album TEXT, genre TEXT, "
62+
"comment TEXT, label TEXT, composer TEXT, remixer TEXT, "
63+
"key INTEGER, rating INTEGER, albumArt TEXT, timeLastPlayed "
64+
"DATETIME, isPlayed BOOLEAN, fileType TEXT, isAnalyzed "
65+
"BOOLEAN, dateCreated DATETIME, dateAdded DATETIME, "
66+
"isAvailable BOOLEAN, isMetadataOfPackedTrackChanged BOOLEAN, "
67+
" isPerfomanceDataOfPackedTrackChanged BOOLEAN, playedIndicator "
68+
"INTEGER, isMetadataImported BOOLEAN, pdbImportKey INTEGER, "
69+
" streamingSource TEXT, uri TEXT, isBeatGridLocked BOOLEAN, "
70+
"originDatabaseUuid TEXT, originTrackId INTEGER, streamingFlags "
71+
"INTEGER, explicitLyrics BOOLEAN, lastEditTime DATETIME, "
72+
"CONSTRAINT C_originDatabaseUuid_originTrackId UNIQUE "
73+
"(originDatabaseUuid, originTrackId), CONSTRAINT C_path UNIQUE "
74+
"(path), FOREIGN KEY (albumArtId) REFERENCES AlbumArt (id) ON "
75+
"DELETE RESTRICT );";
76+
db << "CREATE TABLE PerformanceData ( trackId INTEGER PRIMARY KEY, "
77+
"trackData BLOB, overviewWaveFormData BLOB, beatData BLOB, "
78+
"quickCues BLOB, loops BLOB, thirdPartySourceId INTEGER, "
79+
"activeOnLoadLoops INTEGER, FOREIGN KEY(trackId) REFERENCES "
80+
"Track(id) ON DELETE CASCADE ON UPDATE CASCADE );";
81+
db << "CREATE TABLE PreparelistEntity ( id INTEGER PRIMARY KEY "
82+
"AUTOINCREMENT, trackId INTEGER, trackNumber INTEGER, "
83+
"FOREIGN KEY (trackId) REFERENCES Track (id) ON DELETE CASCADE );";
84+
db << "DELETE FROM sqlite_sequence;";
85+
db << "CREATE INDEX index_AlbumArt_hash ON AlbumArt (hash);";
86+
db << "CREATE INDEX index_PlaylistEntity_nextEntityId_listId ON "
87+
"PlaylistEntity(nextEntityId, listId);";
88+
db << "CREATE TRIGGER trigger_after_insert_Pack_timestamp AFTER INSERT ON "
89+
"Pack FOR EACH ROW WHEN NEW.lastPackTime IS NULL BEGIN UPDATE "
90+
"Pack SET lastPackTime = strftime('%s') WHERE ROWID = NEW.ROWID; "
91+
"END;";
92+
db << "CREATE TRIGGER trigger_after_insert_Pack_changeLogId AFTER INSERT "
93+
"ON Pack FOR EACH ROW WHEN NEW.changeLogId = 0 BEGIN UPDATE Pack "
94+
"SET changeLogId = 1 WHERE ROWID = NEW.ROWID; END;";
95+
db << "CREATE VIEW ChangeLog (id, trackId) AS SELECT 0, 0 WHERE FALSE;";
96+
db << "CREATE TRIGGER trigger_before_insert_List BEFORE INSERT ON Playlist "
97+
"FOR EACH ROW BEGIN UPDATE Playlist SET nextListId = -(1 + "
98+
"nextListId) WHERE nextListId = NEW.nextListId AND parentListId = "
99+
"NEW.parentListId; END;";
100+
db << "CREATE TRIGGER trigger_after_insert_List AFTER INSERT ON Playlist "
101+
"FOR EACH ROW BEGIN UPDATE Playlist SET nextListId = "
102+
"NEW.id WHERE nextListId = -(1 + NEW.nextListId) AND "
103+
"parentListId = NEW.parentListId; END;";
104+
db << "CREATE TRIGGER trigger_after_delete_List AFTER DELETE ON Playlist "
105+
"FOR EACH ROW BEGIN UPDATE Playlist SET nextListId = "
106+
"OLD.nextListId WHERE nextListId = OLD.id; DELETE FROM Playlist "
107+
" WHERE parentListId = OLD.id; END;";
108+
db << "CREATE TRIGGER trigger_after_update_isPersistParent AFTER UPDATE ON "
109+
"Playlist WHEN (old.isPersisted = 0 AND new.isPersisted = 1) "
110+
" OR (old.parentListId != new.parentListId AND new.isPersisted = "
111+
"1) BEGIN UPDATE Playlist SET isPersisted = 1 WHERE "
112+
"id IN (SELECT parentListId FROM PlaylistAllParent WHERE id=new.id); "
113+
"END;";
114+
db << "CREATE TRIGGER trigger_after_update_isPersistChild AFTER UPDATE ON "
115+
"Playlist WHEN old.isPersisted = 1 AND new.isPersisted = 0 "
116+
"BEGIN UPDATE Playlist SET isPersisted = 0 WHERE id "
117+
"IN (SELECT childListId FROM PlaylistAllChildren WHERE id=new.id); "
118+
"END;";
119+
db << "CREATE TRIGGER trigger_after_insert_isPersist AFTER INSERT ON "
120+
"Playlist WHEN new.isPersisted = 1 BEGIN UPDATE Playlist SET "
121+
" isPersisted = 1 WHERE id IN (SELECT parentListId FROM "
122+
"PlaylistAllParent WHERE id=new.id); END;";
123+
db << "CREATE VIEW PlaylistAllParent AS WITH FindAllParent AS ( SELECT "
124+
"id, parentListId FROM Playlist UNION ALL SELECT "
125+
"recursiveCTE.id, Plist.parentListId FROM Playlist Plist INNER JOIN "
126+
"FindAllParent recursiveCTE ON recursiveCTE.parentListId = "
127+
"Plist.id ) SELECT * FROM FindAllParent;";
128+
db << "CREATE VIEW PlaylistAllChildren AS WITH FindAllChild AS ( SELECT "
129+
"id, id as childListId FROM Playlist UNION ALL SELECT "
130+
"recursiveCTE.id, Plist.id FROM Playlist Plist INNER JOIN "
131+
"FindAllChild recursiveCTE ON recursiveCTE.childListId = "
132+
"Plist.parentListId ) SELECT * FROM FindAllChild WHERE id <> "
133+
"childListId;";
134+
db << "CREATE VIEW PlaylistPath AS WITH RECURSIVE Heirarchy AS ( SELECT "
135+
"id AS child, parentListId AS parent, title AS name, 1 AS depth FROM "
136+
"Playlist UNION ALL SELECT child, parentListId AS parent, "
137+
"title AS name, h.depth + 1 AS depth FROM Playlist c JOIN Heirarchy "
138+
"h ON h.parent = c.id ORDER BY depth DESC ), OrderedList AS ( "
139+
" SELECT id , nextListId, 1 AS position FROM Playlist WHERE "
140+
"nextListId = 0 UNION ALL SELECT c.id , c.nextListId , "
141+
"l.position + 1 FROM Playlist c INNER JOIN OrderedList l ON "
142+
"c.nextListId = l.id ), NameConcat AS ( SELECT child AS id, "
143+
" GROUP_CONCAT(name ,';') || ';' AS path FROM ( SELECT "
144+
"child, name FROM Heirarchy ORDER BY depth DESC ) "
145+
"GROUP BY child ) SELECT id, path, ROW_NUMBER() OVER ( "
146+
" ORDER BY (SELECT COUNT(*) FROM (SELECT * FROM Heirarchy "
147+
"WHERE child = id) ) DESC, (SELECT position FROM OrderedList "
148+
"ol WHERE ol.id = c.id) ASC ) AS position FROM Playlist c LEFT "
149+
"JOIN NameConcat g USING (id);";
150+
db << "CREATE TRIGGER trigger_before_delete_PlaylistEntity BEFORE DELETE "
151+
"ON PlaylistEntity WHEN OLD.trackId > 0 BEGIN UPDATE "
152+
"PlaylistEntity SET nextEntityId = OLD.nextEntityId WHERE "
153+
"nextEntityId = OLD.id AND listId = OLD.listId; END;";
154+
db << "CREATE INDEX index_Track_filename ON Track (filename);";
155+
db << "CREATE INDEX index_Track_albumArtId ON Track (albumArtId);";
156+
db << "CREATE INDEX index_Track_uri ON Track (uri);";
157+
db << "CREATE INDEX index_Track_title ON Track(title);";
158+
db << "CREATE INDEX index_Track_length ON Track(length);";
159+
db << "CREATE INDEX index_Track_rating ON Track(rating);";
160+
db << "CREATE INDEX index_Track_year ON Track(year);";
161+
db << "CREATE INDEX index_Track_dateAdded ON Track(dateAdded);";
162+
db << "CREATE INDEX index_Track_genre ON Track(genre);";
163+
db << "CREATE INDEX index_Track_artist ON Track(artist);";
164+
db << "CREATE INDEX index_Track_album ON Track(album);";
165+
db << "CREATE INDEX index_Track_key ON Track(key);";
166+
db << "CREATE INDEX index_Track_bpmAnalyzed ON Track(CAST(bpmAnalyzed + "
167+
"0.5 AS int));";
168+
db << "CREATE TRIGGER trigger_after_insert_Track_check_id AFTER INSERT ON "
169+
"Track WHEN NEW.id <= (SELECT seq FROM sqlite_sequence WHERE name "
170+
"= 'Track') BEGIN SELECT RAISE(ABORT, 'Recycling deleted track "
171+
"id''s are not allowed'); END;";
172+
db << "CREATE TRIGGER trigger_after_update_Track_check_Id BEFORE UPDATE ON "
173+
"Track WHEN NEW.id <> OLD.id BEGIN SELECT RAISE(ABORT, "
174+
"'Changing track id''s are not allowed'); END;";
175+
db << "CREATE TRIGGER trigger_after_insert_Track_fix_origin AFTER INSERT "
176+
"ON Track WHEN IFNULL(NEW.originTrackId, 0) = 0 OR "
177+
"IFNULL(NEW.originDatabaseUuid, '') = '' BEGIN UPDATE Track SET "
178+
" originTrackId = NEW.id, originDatabaseUuid = (SELECT "
179+
"uuid FROM Information) WHERE track.id = NEW.id; END;";
180+
db << "CREATE TRIGGER trigger_after_update_Track_fix_origin AFTER UPDATE "
181+
"ON Track WHEN IFNULL(NEW.originTrackId, 0) = 0 OR "
182+
"IFNULL(NEW.originDatabaseUuid, '') = '' BEGIN UPDATE Track SET "
183+
" originTrackId = NEW.id, originDatabaseUuid = (SELECT "
184+
"uuid FROM Information) WHERE track.id = NEW.id; END;";
185+
db << "CREATE TRIGGER trigger_after_update_only_Track_timestamp "
186+
"AFTER UPDATE OF length,"
187+
"bpm, year, filename, bitrate, bpmAnalyzed, albumArtId, title, "
188+
"artist,"
189+
"album, genre, comment, label, composer, remixer, key, rating, "
190+
"albumArt,"
191+
"fileType, isAnalyzed, isBeatgridLocked,"
192+
"explicitLyrics ON Track FOR EACH ROW BEGIN UPDATE Track SET"
193+
" lastEditTime = strftime('%s') WHERE ROWID = NEW.ROWID;"
194+
"END;";
195+
db << "CREATE TRIGGER trigger_PerformanceData_after_update_Track_timestamp "
196+
"AFTER UPDATE OF trackData, isAnalyzed, overviewWaveFormData, "
197+
"beatData, quickCues, loops, activeOnLoadLoops ON PerformanceData "
198+
"FOR EACH ROW BEGIN UPDATE Track SET lastEditTime = strftime('%s') "
199+
"WHERE id = NEW.trackId; "
200+
"END;";
201+
db << "CREATE TRIGGER trigger_after_insert_Track_insert_performance_data "
202+
"AFTER INSERT ON Track BEGIN INSERT INTO "
203+
"PerformanceData(trackId) "
204+
"VALUES(NEW.id); END;";
205+
db << "CREATE INDEX index_PreparelistEntity_trackId ON PreparelistEntity "
206+
"(trackId);";
207+
208+
// Generate UUID for the Information table.
209+
auto uuid_str = djinterop::util::generate_random_uuid();
210+
211+
// Not yet sure how the "currentPlayedIndiciator" (typo deliberate) value
212+
// is formed.
213+
auto current_played_indicator_fake_value =
214+
djinterop::util::generate_random_int64();
215+
216+
// Insert row into Information
217+
db << "INSERT INTO Information ([uuid], [schemaVersionMajor], "
218+
"[schemaVersionMinor], [schemaVersionPatch], "
219+
"[currentPlayedIndiciator], [lastRekordBoxLibraryImportReadCounter]) "
220+
"VALUES (?, ?, ?, ?, ?, ?)"
221+
<< uuid_str << schema_version.maj << schema_version.min
222+
<< schema_version.pat << current_played_indicator_fake_value << 0;
223+
224+
// Insert default album art entry
225+
db << "INSERT INTO AlbumArt VALUES (1, '', NULL)";
226+
}
227+
228+
} // namespace djinterop::engine::schema
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
This file is part of libdjinterop.
3+
4+
libdjinterop is free software: you can redistribute it and/or modify
5+
it under the terms of the GNU Lesser General Public License as published by
6+
the Free Software Foundation, either version 3 of the License, or
7+
(at your option) any later version.
8+
9+
libdjinterop is distributed in the hope that it will be useful,
10+
but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
GNU Lesser General Public License for more details.
13+
14+
You should have received a copy of the GNU Lesser General Public License
15+
along with libdjinterop. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
#pragma once
19+
20+
#include <sqlite_modern_cpp.h>
21+
22+
#include <djinterop/semantic_version.hpp>
23+
24+
#include "schema_3_0_0.hpp"
25+
26+
namespace djinterop::engine::schema
27+
{
28+
class schema_3_0_1 : public schema_3_0_0
29+
{
30+
public:
31+
static constexpr const semantic_version schema_version{3, 1, 0};
32+
33+
void create(sqlite::database& db) override;
34+
};
35+
36+
} // namespace djinterop::engine::schema

test/djinterop/engine/database_reference_test.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ const std::vector<std::string> ref_script_dirs{
100100
"/ref/engine/desktop/desktop-4.2.0",
101101
"/ref/engine/sc5000/firmware-4.2.0",
102102
"/ref/engine/desktop/desktop-4.2.1",
103+
"/ref/engine/desktop/desktop-4.3.0",
104+
"/ref/engine/sc5000/firmware-4.3.0",
105+
"/ref/engine/sc5000/firmware-4.3.1",
106+
"/ref/engine/sc5000/firmware-4.3.2",
103107
};
104108
} // anonymous namespace
105109

0 commit comments

Comments
 (0)