607
691
albumLibraryPath);
608
692
m_LastErrorMessage=errorMsg;
609
693
m_setError = true;
612
697
m_observer->error(errorMsg);
613
698
m_observer->finishedSchemaUpdate(InitializationObserver::UpdateErrorMustAbort);
620
706
if (!m_observer->continueQuery())
622
711
m_observer->schemaUpdateProgress(i18n("Configured one album root"));
624
714
kDebug() << "Inserted album root";
626
716
// --- With the album root, populate albums ---
628
718
if (!m_Backend->execSql(QString(
629
"REPLACE INTO Albums "
630
" (id, albumRoot, relativePath, date, caption, collection, icon) "
631
"SELECT id, ?, url, date, caption, collection, icon "
719
"REPLACE INTO Albums "
720
" (id, albumRoot, relativePath, date, caption, collection, icon) "
721
"SELECT id, ?, url, date, caption, collection, icon "
640
732
if (!m_observer->continueQuery())
642
737
m_observer->schemaUpdateProgress(i18n("Imported albums"));
644
740
kDebug() << "Populated albums";
646
742
// --- Add images ---
648
744
if (!m_Backend->execSql(QString(
649
"REPLACE INTO Images "
650
" (id, album, name, status, category, modificationDate, fileSize, uniqueHash) "
651
"SELECT id, dirid, name, ?, ?, NULL, NULL, NULL"
654
DatabaseItem::Visible, DatabaseItem::UndefinedCategory)
745
"REPLACE INTO Images "
746
" (id, album, name, status, category, modificationDate, fileSize, uniqueHash) "
747
"SELECT id, dirid, name, ?, ?, NULL, NULL, NULL"
750
DatabaseItem::Visible, DatabaseItem::UndefinedCategory)
658
756
if (!m_access->backend()->execSql(QString(
659
"REPLACE INTO ImageInformation (imageId) SELECT id FROM Images;"))
757
"REPLACE INTO ImageInformation (imageId) SELECT id FROM Images;"))
663
763
// remove orphan images that would not be removed by CollectionScanner
664
764
m_Backend->execSql(QString("DELETE FROM Images WHERE album NOT IN (SELECT id FROM Albums);"));
788
912
// An author of NULL will inhibt the UNIQUE restriction to take effect (but #189080). Work around.
789
913
m_Backend->execSql(QString(
790
"DELETE FROM ImageComments WHERE "
791
"type=? AND language=? AND author IS NULL "
792
"AND imageid IN ( SELECT id FROM ImagesV3 ); "),
793
(int)DatabaseComment::Comment, QString("x-default"));
914
"DELETE FROM ImageComments WHERE "
915
"type=? AND language=? AND author IS NULL "
916
"AND imageid IN ( SELECT id FROM ImagesV3 ); "),
917
(int)DatabaseComment::Comment, QString("x-default"));
795
919
if (!m_Backend->execSql(QString(
796
"REPLACE INTO ImageComments "
797
" (imageid, type, language, comment) "
798
"SELECT id, ?, ?, caption FROM ImagesV3;"
800
(int)DatabaseComment::Comment, QString("x-default"))
920
"REPLACE INTO ImageComments "
921
" (imageid, type, language, comment) "
922
"SELECT id, ?, ?, caption FROM ImagesV3;"
924
(int)DatabaseComment::Comment, QString("x-default"))
806
932
if (!m_observer->continueQuery())
808
937
m_observer->schemaUpdateProgress(i18n("Imported comments"));
811
940
// Port rating storage in ImageProperties to ImageInformation
812
941
if (!m_Backend->execSql(QString(
813
"UPDATE ImageInformation SET "
814
" rating=(SELECT value FROM ImageProperties "
815
" WHERE ImageInformation.imageid=ImageProperties.imageid AND ImageProperties.property=?) "
816
"WHERE imageid IN (SELECT imageid FROM ImageProperties WHERE property=?);"
818
QString("Rating"), QString("Rating"))
942
"UPDATE ImageInformation SET "
943
" rating=(SELECT value FROM ImageProperties "
944
" WHERE ImageInformation.imageid=ImageProperties.imageid AND ImageProperties.property=?) "
945
"WHERE imageid IN (SELECT imageid FROM ImageProperties WHERE property=?);"
947
QString("Rating"), QString("Rating"))
822
953
m_Backend->execSql(QString("DELETE FROM ImageProperties WHERE property=?;"), QString("Rating"));
823
954
m_Backend->execSql(QString("UPDATE ImageInformation SET rating=0 WHERE rating<0;"));
846
982
void SchemaUpdater::preAlpha010Update1()
848
984
QString hasUpdate = m_AlbumDB->getSetting("preAlpha010Update1");
849
986
if (!hasUpdate.isNull())
852
991
if (!m_Backend->execSql(QString("ALTER TABLE Searches RENAME TO SearchesV3;")))
855
996
if ( !m_Backend->execSql(
856
QString( "CREATE TABLE IF NOT EXISTS Searches \n"
857
" (id INTEGER PRIMARY KEY, \n"
859
" name TEXT NOT NULL, \n"
860
" query TEXT NOT NULL);" ) ))
997
QString( "CREATE TABLE IF NOT EXISTS Searches \n"
998
" (id INTEGER PRIMARY KEY, \n"
1000
" name TEXT NOT NULL, \n"
1001
" query TEXT NOT NULL);" ) ))
863
1006
if (!m_Backend->execSql(QString(
864
"REPLACE INTO Searches "
865
" (id, type, name, query) "
866
"SELECT id, ?, name, url"
867
" FROM SearchesV3;"),
868
DatabaseSearch::LegacyUrlSearch)
1007
"REPLACE INTO Searches "
1008
" (id, type, name, query) "
1009
"SELECT id, ?, name, url"
1010
" FROM SearchesV3;"),
1011
DatabaseSearch::LegacyUrlSearch)
872
1017
SearchInfo::List sList = m_AlbumDB->scanSearches();
900
1045
void SchemaUpdater::preAlpha010Update2()
902
1047
QString hasUpdate = m_AlbumDB->getSetting("preAlpha010Update2");
903
1049
if (!hasUpdate.isNull())
906
1054
if (!m_Backend->execSql(QString("ALTER TABLE ImagePositions RENAME TO ImagePositionsTemp;")))
908
1059
if (!m_Backend->execSql(QString("ALTER TABLE ImageMetadata RENAME TO ImageMetadataTemp;")))
911
1064
m_Backend->execSql(
912
QString("CREATE TABLE ImagePositions\n"
913
" (imageid INTEGER PRIMARY KEY,\n"
915
" latitudeNumber REAL,\n"
917
" longitudeNumber REAL,\n"
919
" orientation REAL,\n"
923
" description TEXT);") );
1065
QString("CREATE TABLE ImagePositions\n"
1066
" (imageid INTEGER PRIMARY KEY,\n"
1068
" latitudeNumber REAL,\n"
1069
" longitude TEXT,\n"
1070
" longitudeNumber REAL,\n"
1072
" orientation REAL,\n"
1076
" description TEXT);") );
925
1078
m_Backend->execSql(QString(
926
"REPLACE INTO ImagePositions "
927
" (imageid, latitude, latitudeNumber, longitude, longitudeNumber, "
928
" altitude, orientation, tilt, roll, accuracy, description) "
929
"SELECT imageid, latitude, latitudeNumber, longitude, longitudeNumber, "
930
" altitude, orientation, tilt, roll, 0, description "
931
" FROM ImagePositionsTemp;"));
1079
"REPLACE INTO ImagePositions "
1080
" (imageid, latitude, latitudeNumber, longitude, longitudeNumber, "
1081
" altitude, orientation, tilt, roll, accuracy, description) "
1082
"SELECT imageid, latitude, latitudeNumber, longitude, longitudeNumber, "
1083
" altitude, orientation, tilt, roll, 0, description "
1084
" FROM ImagePositionsTemp;"));
933
1086
m_Backend->execSql(
934
QString("CREATE TABLE ImageMetadata\n"
935
" (imageid INTEGER PRIMARY KEY,\n"
940
" focalLength REAL,\n"
941
" focalLength35 REAL,\n"
942
" exposureTime REAL,\n"
943
" exposureProgram INTEGER,\n"
944
" exposureMode INTEGER,\n"
945
" sensitivity INTEGER,\n"
947
" whiteBalance INTEGER,\n"
948
" whiteBalanceColorTemperature INTEGER,\n"
949
" meteringMode INTEGER,\n"
950
" subjectDistance REAL,\n"
951
" subjectDistanceCategory INTEGER);") );
1087
QString("CREATE TABLE ImageMetadata\n"
1088
" (imageid INTEGER PRIMARY KEY,\n"
1093
" focalLength REAL,\n"
1094
" focalLength35 REAL,\n"
1095
" exposureTime REAL,\n"
1096
" exposureProgram INTEGER,\n"
1097
" exposureMode INTEGER,\n"
1098
" sensitivity INTEGER,\n"
1100
" whiteBalance INTEGER,\n"
1101
" whiteBalanceColorTemperature INTEGER,\n"
1102
" meteringMode INTEGER,\n"
1103
" subjectDistance REAL,\n"
1104
" subjectDistanceCategory INTEGER);") );
953
1106
m_Backend->execSql( QString("INSERT INTO ImageMetadata "
954
" (imageid, make, model, lens, aperture, focalLength, focalLength35, "
955
" exposureTime, exposureProgram, exposureMode, sensitivity, flash, whiteBalance, "
956
" whiteBalanceColorTemperature, meteringMode, subjectDistance, subjectDistanceCategory) "
957
"SELECT imageid, make, model, NULL, aperture, focalLength, focalLength35, "
958
" exposureTime, exposureProgram, exposureMode, sensitivity, flash, whiteBalance, "
959
" whiteBalanceColorTemperature, meteringMode, subjectDistance, subjectDistanceCategory "
960
"FROM ImageMetadataTemp;"));
1107
" (imageid, make, model, lens, aperture, focalLength, focalLength35, "
1108
" exposureTime, exposureProgram, exposureMode, sensitivity, flash, whiteBalance, "
1109
" whiteBalanceColorTemperature, meteringMode, subjectDistance, subjectDistanceCategory) "
1110
"SELECT imageid, make, model, NULL, aperture, focalLength, focalLength35, "
1111
" exposureTime, exposureProgram, exposureMode, sensitivity, flash, whiteBalance, "
1112
" whiteBalanceColorTemperature, meteringMode, subjectDistance, subjectDistanceCategory "
1113
"FROM ImageMetadataTemp;"));
962
1115
m_Backend->execSql(QString("DROP TABLE ImagePositionsTemp;"));
963
1116
m_Backend->execSql(QString("DROP TABLE ImageMetadataTemp;"));
987
1143
void SchemaUpdater::beta010Update1()
989
1145
QString hasUpdate = m_AlbumDB->getSetting("beta010Update1");
990
1147
if (!hasUpdate.isNull())
993
1152
// if Image has been deleted
994
1153
m_Backend->execSql("DROP TRIGGER delete_image;");
995
1154
m_Backend->execSql(
996
"CREATE TRIGGER delete_image DELETE ON Images\n"
998
" DELETE FROM ImageTags\n"
999
" WHERE imageid=OLD.id;\n"
1000
" DELETE From ImageHaarMatrix\n "
1001
" WHERE imageid=OLD.id;\n"
1002
" DELETE From ImageInformation\n "
1003
" WHERE imageid=OLD.id;\n"
1004
" DELETE From ImageMetadata\n "
1005
" WHERE imageid=OLD.id;\n"
1006
" DELETE From ImagePositions\n "
1007
" WHERE imageid=OLD.id;\n"
1008
" DELETE From ImageComments\n "
1009
" WHERE imageid=OLD.id;\n"
1010
" DELETE From ImageCopyright\n "
1011
" WHERE imageid=OLD.id;\n"
1012
" DELETE From ImageProperties\n "
1013
" WHERE imageid=OLD.id;\n"
1014
" UPDATE Albums SET icon=null \n "
1015
" WHERE icon=OLD.id;\n"
1016
" UPDATE Tags SET icon=null \n "
1017
" WHERE icon=OLD.id;\n"
1155
"CREATE TRIGGER delete_image DELETE ON Images\n"
1157
" DELETE FROM ImageTags\n"
1158
" WHERE imageid=OLD.id;\n"
1159
" DELETE From ImageHaarMatrix\n "
1160
" WHERE imageid=OLD.id;\n"
1161
" DELETE From ImageInformation\n "
1162
" WHERE imageid=OLD.id;\n"
1163
" DELETE From ImageMetadata\n "
1164
" WHERE imageid=OLD.id;\n"
1165
" DELETE From ImagePositions\n "
1166
" WHERE imageid=OLD.id;\n"
1167
" DELETE From ImageComments\n "
1168
" WHERE imageid=OLD.id;\n"
1169
" DELETE From ImageCopyright\n "
1170
" WHERE imageid=OLD.id;\n"
1171
" DELETE From ImageProperties\n "
1172
" WHERE imageid=OLD.id;\n"
1173
" UPDATE Albums SET icon=null \n "
1174
" WHERE icon=OLD.id;\n"
1175
" UPDATE Tags SET icon=null \n "
1176
" WHERE icon=OLD.id;\n"
1021
1180
m_AlbumDB->setSetting("beta010Update1", "true");
1039
1201
bool SchemaUpdater::createTablesV3()
1041
1203
if (!m_Backend->execSql( QString("CREATE TABLE Albums\n"
1042
" (id INTEGER PRIMARY KEY,\n"
1043
" url TEXT NOT NULL UNIQUE,\n"
1044
" date DATE NOT NULL,\n"
1046
" collection TEXT,\n"
1047
" icon INTEGER);") ))
1204
" (id INTEGER PRIMARY KEY,\n"
1205
" url TEXT NOT NULL UNIQUE,\n"
1206
" date DATE NOT NULL,\n"
1208
" collection TEXT,\n"
1209
" icon INTEGER);") ))
1052
1214
if (!m_Backend->execSql( QString("CREATE TABLE Tags\n"
1053
" (id INTEGER PRIMARY KEY,\n"
1055
" name TEXT NOT NULL,\n"
1058
" UNIQUE (name, pid));") ))
1215
" (id INTEGER PRIMARY KEY,\n"
1217
" name TEXT NOT NULL,\n"
1220
" UNIQUE (name, pid));") ))
1063
1225
if (!m_Backend->execSql( QString("CREATE TABLE TagsTree\n"
1064
" (id INTEGER NOT NULL,\n"
1065
" pid INTEGER NOT NULL,\n"
1066
" UNIQUE (id, pid));") ))
1226
" (id INTEGER NOT NULL,\n"
1227
" pid INTEGER NOT NULL,\n"
1228
" UNIQUE (id, pid));") ))
1071
1233
if (!m_Backend->execSql( QString("CREATE TABLE Images\n"
1072
" (id INTEGER PRIMARY KEY,\n"
1073
" name TEXT NOT NULL,\n"
1074
" dirid INTEGER NOT NULL,\n"
1076
" datetime DATETIME,\n"
1077
" UNIQUE (name, dirid));") ))
1234
" (id INTEGER PRIMARY KEY,\n"
1235
" name TEXT NOT NULL,\n"
1236
" dirid INTEGER NOT NULL,\n"
1238
" datetime DATETIME,\n"
1239
" UNIQUE (name, dirid));") ))
1083
1245
if (!m_Backend->execSql( QString("CREATE TABLE ImageTags\n"
1084
" (imageid INTEGER NOT NULL,\n"
1085
" tagid INTEGER NOT NULL,\n"
1086
" UNIQUE (imageid, tagid));") ))
1246
" (imageid INTEGER NOT NULL,\n"
1247
" tagid INTEGER NOT NULL,\n"
1248
" UNIQUE (imageid, tagid));") ))
1091
1253
if (!m_Backend->execSql( QString("CREATE TABLE ImageProperties\n"
1092
" (imageid INTEGER NOT NULL,\n"
1093
" property TEXT NOT NULL,\n"
1094
" value TEXT NOT NULL,\n"
1095
" UNIQUE (imageid, property));") ))
1254
" (imageid INTEGER NOT NULL,\n"
1255
" property TEXT NOT NULL,\n"
1256
" value TEXT NOT NULL,\n"
1257
" UNIQUE (imageid, property));") ))
1100
1262
if ( !m_Backend->execSql( QString( "CREATE TABLE Searches \n"
1101
" (id INTEGER PRIMARY KEY, \n"
1102
" name TEXT NOT NULL UNIQUE, \n"
1103
" url TEXT NOT NULL);" ) ) )
1263
" (id INTEGER PRIMARY KEY, \n"
1264
" name TEXT NOT NULL UNIQUE, \n"
1265
" url TEXT NOT NULL);" ) ) )
1108
1270
if (!m_Backend->execSql( QString("CREATE TABLE Settings \n"
1109
"(keyword TEXT NOT NULL UNIQUE,\n"
1271
"(keyword TEXT NOT NULL UNIQUE,\n"
1122
1284
// trigger: delete from Images/ImageTags/ImageProperties
1123
1285
// if Album has been deleted
1124
1286
m_Backend->execSql("CREATE TRIGGER delete_album DELETE ON Albums\n"
1126
" DELETE FROM ImageTags\n"
1127
" WHERE imageid IN (SELECT id FROM Images WHERE dirid=OLD.id);\n"
1128
" DELETE From ImageProperties\n"
1129
" WHERE imageid IN (SELECT id FROM Images WHERE dirid=OLD.id);\n"
1130
" DELETE FROM Images\n"
1131
" WHERE dirid = OLD.id;\n"
1288
" DELETE FROM ImageTags\n"
1289
" WHERE imageid IN (SELECT id FROM Images WHERE dirid=OLD.id);\n"
1290
" DELETE From ImageProperties\n"
1291
" WHERE imageid IN (SELECT id FROM Images WHERE dirid=OLD.id);\n"
1292
" DELETE FROM Images\n"
1293
" WHERE dirid = OLD.id;\n"
1134
1296
// trigger: delete from ImageTags/ImageProperties
1135
1297
// if Image has been deleted
1136
1298
m_Backend->execSql("CREATE TRIGGER delete_image DELETE ON Images\n"
1138
" DELETE FROM ImageTags\n"
1139
" WHERE imageid=OLD.id;\n"
1140
" DELETE From ImageProperties\n "
1141
" WHERE imageid=OLD.id;\n"
1142
" UPDATE Albums SET icon=null \n "
1143
" WHERE icon=OLD.id;\n"
1144
" UPDATE Tags SET icon=null \n "
1145
" WHERE icon=OLD.id;\n"
1300
" DELETE FROM ImageTags\n"
1301
" WHERE imageid=OLD.id;\n"
1302
" DELETE From ImageProperties\n "
1303
" WHERE imageid=OLD.id;\n"
1304
" UPDATE Albums SET icon=null \n "
1305
" WHERE icon=OLD.id;\n"
1306
" UPDATE Tags SET icon=null \n "
1307
" WHERE icon=OLD.id;\n"
1148
1310
// trigger: delete from ImageTags if Tag has been deleted
1149
1311
m_Backend->execSql("CREATE TRIGGER delete_tag DELETE ON Tags\n"
1151
" DELETE FROM ImageTags WHERE tagid=OLD.id;\n"
1313
" DELETE FROM ImageTags WHERE tagid=OLD.id;\n"
1154
1316
// trigger: insert into TagsTree if Tag has been added
1155
1317
m_Backend->execSql("CREATE TRIGGER insert_tagstree AFTER INSERT ON Tags\n"
1157
" INSERT INTO TagsTree\n"
1158
" SELECT NEW.id, NEW.pid\n"
1160
" SELECT NEW.id, pid FROM TagsTree WHERE id=NEW.pid;\n"
1319
" INSERT INTO TagsTree\n"
1320
" SELECT NEW.id, NEW.pid\n"
1322
" SELECT NEW.id, pid FROM TagsTree WHERE id=NEW.pid;\n"
1163
1325
// trigger: delete from TagsTree if Tag has been deleted
1164
1326
m_Backend->execSql("CREATE TRIGGER delete_tagstree DELETE ON Tags\n"
1166
" DELETE FROM Tags\n"
1167
" WHERE id IN (SELECT id FROM TagsTree WHERE pid=OLD.id);\n"
1168
" DELETE FROM TagsTree\n"
1169
" WHERE id IN (SELECT id FROM TagsTree WHERE pid=OLD.id);\n"
1170
" DELETE FROM TagsTree\n"
1171
" WHERE id=OLD.id;\n"
1328
" DELETE FROM Tags\n"
1329
" WHERE id IN (SELECT id FROM TagsTree WHERE pid=OLD.id);\n"
1330
" DELETE FROM TagsTree\n"
1331
" WHERE id IN (SELECT id FROM TagsTree WHERE pid=OLD.id);\n"
1332
" DELETE FROM TagsTree\n"
1333
" WHERE id=OLD.id;\n"
1174
1336
// trigger: delete from TagsTree if Tag has been deleted
1175
1337
m_Backend->execSql("CREATE TRIGGER move_tagstree UPDATE OF pid ON Tags\n"
1177
" DELETE FROM TagsTree\n"
1181
" id IN (SELECT id FROM TagsTree WHERE pid=OLD.id))\n"
1183
" pid IN (SELECT pid FROM TagsTree WHERE id=OLD.id);\n"
1184
" INSERT INTO TagsTree\n"
1185
" SELECT NEW.id, NEW.pid\n"
1187
" SELECT NEW.id, pid FROM TagsTree WHERE id=NEW.pid\n"
1189
" SELECT id, NEW.pid FROM TagsTree WHERE pid=NEW.id\n"
1191
" SELECT A.id, B.pid FROM TagsTree A, TagsTree B\n"
1193
" A.pid = NEW.id AND B.id = NEW.pid;\n"
1339
" DELETE FROM TagsTree\n"
1343
" id IN (SELECT id FROM TagsTree WHERE pid=OLD.id))\n"
1345
" pid IN (SELECT pid FROM TagsTree WHERE id=OLD.id);\n"
1346
" INSERT INTO TagsTree\n"
1347
" SELECT NEW.id, NEW.pid\n"
1349
" SELECT NEW.id, pid FROM TagsTree WHERE id=NEW.pid\n"
1351
" SELECT id, NEW.pid FROM TagsTree WHERE pid=NEW.id\n"
1353
" SELECT A.id, B.pid FROM TagsTree A, TagsTree B\n"
1355
" A.pid = NEW.id AND B.id = NEW.pid;\n"