You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
DISTINCT and UNION will remove duplicates, requiringa forced sort, unique and temporary table step. It can'tbe flattened or optimized in other ways. So they are removedto allow SQLite to do optimization of searches.
Copy file name to clipboardExpand all lines: Duplicati/Library/Main/Database/LocalBugReportDatabase.cs
+9-4Lines changed: 9 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -48,10 +48,15 @@ public void Fix()
48
48
{
49
49
50
50
upcmd.Transaction=tr;
51
-
upcmd.ExecuteNonQuery(string.Format(@"CREATE TEMPORARY TABLE ""{0}"" (""ID"" INTEGER PRIMARY KEY, ""RealPath"" TEXT NOT NULL, ""Obfuscated"" TEXT NULL)",tablename));
52
-
upcmd.ExecuteNonQuery(string.Format(@"INSERT INTO ""{0}"" (""RealPath"") SELECT DISTINCT ""Path"" FROM ""File"" ORDER BY ""Path"" ",tablename));
53
-
upcmd.ExecuteNonQuery(string.Format(@"UPDATE ""{0}"" SET ""Obfuscated"" = ? || length(""RealPath"") || ? || ""ID"" || (CASE WHEN substr(""RealPath"", length(""RealPath"")) = ? THEN ? ELSE ? END) ",tablename),Platform.IsClientPosix?"/":"X:\\",Util.DirectorySeparatorString,Util.DirectorySeparatorString,Util.DirectorySeparatorString,".bin");
54
-
51
+
52
+
varstartPath=;
53
+
54
+
upcmd.ExecuteNonQuery($@"CREATE TEMPORARY TABLE ""{tablename}"" AS
55
+
SELECT DISTINCT ""Path"" AS ""RealPath"",
56
+
? || length(""RealPath"") || ? || row_number() OVER () ||
57
+
CASE WHEN substr(""RealPath"", length(""RealPath"")) = ? THEN ? ELSE ? END) AS ""Obfuscated"" FROM ""File""",
m_selectremotevolumesCommand.CommandText=@"SELECT ""ID"", ""Name"", ""Type"", ""Size"", ""Hash"", ""State"", ""DeleteGraceTime"" FROM ""Remotevolume""";
130
130
131
131
m_selectremotevolumeCommand.CommandText=m_selectremotevolumesCommand.CommandText+@" WHERE ""Name"" = ?";
132
-
m_selectduplicateRemoteVolumesCommand.CommandText=string.Format(@"SELECTDISTINCT""Name"", ""State"" FROM ""Remotevolume"" WHERE ""Name"" IN (SELECT ""Name"" FROM ""Remotevolume"" WHERE ""State"" IN (""{0}"", ""{1}"")) AND NOT ""State"" IN (""{0}"", ""{1}"")",RemoteVolumeState.Deleted.ToString(),RemoteVolumeState.Deleting.ToString());
132
+
m_selectduplicateRemoteVolumesCommand.CommandText=string.Format(@"SELECT ""Name"", ""State"" FROM ""Remotevolume"" WHERE ""Name"" IN (SELECT ""Name"" FROM ""Remotevolume"" WHERE ""State"" IN (""{0}"", ""{1}"")) AND NOT ""State"" IN (""{0}"", ""{1}"")",RemoteVolumeState.Deleted.ToString(),RemoteVolumeState.Deleting.ToString());
133
133
134
134
m_selectremotevolumeCommand.AddParameter();
135
135
@@ -413,18 +413,18 @@ public void RemoveRemoteVolumes(IEnumerable<string> names, System.Data.IDbTransa
413
413
deletecmd.Parameters.Clear();
414
414
415
415
416
-
varbsIdsSubQuery=string.Format(
417
-
@"SELECTDISTINCT""BlocksetEntry"".""BlocksetID"" FROM ""BlocksetEntry"", ""Block"""
418
-
+@"WHERE ""BlocksetEntry"".""BlockID"" = ""Block"".""ID"" AND ""Block"".""VolumeID"" IN ({0}) "
419
-
+@"UNION ALL "
420
-
+@"SELECT DISTINCT""BlocksetID"" FROM ""BlocklistHash"""
421
-
+@"WHERE ""Hash"" IN (SELECT ""Hash"" FROM ""Block"" WHERE ""VolumeID"" IN ({0}))"
422
-
,volIdsSubQuery);
416
+
varbsIdsSubQuery=
417
+
$@"SELECT ""BlocksetEntry"".""BlocksetID"" FROM ""BlocksetEntry"", ""Block""
418
+
WHERE ""BlocksetEntry"".""BlockID"" = ""Block"".""ID"" AND ""Block"".""VolumeID"" IN ({0})
419
+
UNION ALL
420
+
SELECT""BlocksetID"" FROM ""BlocklistHash""
421
+
WHERE ""Hash"" IN (SELECT ""Hash"" FROM ""Block"" WHERE ""VolumeID"" IN ({volIdsSubQuery}))";
422
+
423
423
424
424
// Create a temporary table to cache subquery result, as it might take long (SQLite does not cache at all).
foreach(varfilesetidincmd.ExecuteReaderEnumerable(@"SELECT ""ID"" FROM ""Fileset"" ").Select(x=>x.ConvertValueToInt64(0,-1)))
801
801
{
802
-
varexpandedCmd=string.Format(@"SELECT COUNT(*) FROM (SELECTDISTINCT""Path"" FROM ({0}) UNIONSELECT DISTINCT ""Path"" FROM ({1}))",LocalDatabase.LIST_FILESETS,LocalDatabase.LIST_FOLDERS_AND_SYMLINKS);
802
+
varexpandedCmd=string.Format(@"SELECT COUNT(DISTINCT ""Path"") FROM (SELECT ""Path"" FROM ({0}) UNIONALL SELECT ""Path"" FROM ({1}))",LocalDatabase.LIST_FILESETS,LocalDatabase.LIST_FOLDERS_AND_SYMLINKS);
Copy file name to clipboardExpand all lines: Duplicati/Library/Main/Database/LocalDeleteDatabase.cs
+9-9Lines changed: 9 additions & 9 deletions
Original file line number
Diff line number
Diff line change
@@ -85,17 +85,17 @@ public IEnumerable<KeyValuePair<string, long>> DropFilesetsFromTable(DateTime[]
85
85
thrownewException(string.Format("Unexpected number of deleted filesets {0} vs {1}",deleted,toDelete.Length));
86
86
87
87
//Then we delete anything that is no longer being referenced
88
-
cmd.ExecuteNonQuery(@"DELETE FROM ""FilesetEntry"" WHERE ""FilesetID"" NOT IN (SELECTDISTINCT""ID"" FROM ""Fileset"")");
89
-
cmd.ExecuteNonQuery(@"DELETE FROM ""ChangeJournalData"" WHERE ""FilesetID"" NOT IN (SELECTDISTINCT""ID"" FROM ""Fileset"")");
90
-
cmd.ExecuteNonQuery(@"DELETE FROM ""FileLookup"" WHERE ""ID"" NOT IN (SELECTDISTINCT""FileID"" FROM ""FilesetEntry"") ");
91
-
cmd.ExecuteNonQuery(@"DELETE FROM ""Metadataset"" WHERE ""ID"" NOT IN (SELECTDISTINCT""MetadataID"" FROM ""FileLookup"") ");
92
-
cmd.ExecuteNonQuery(@"DELETE FROM ""Blockset"" WHERE ""ID"" NOT IN (SELECTDISTINCT""BlocksetID"" FROM ""FileLookup"" UNIONSELECT DISTINCT ""BlocksetID"" FROM ""Metadataset"") ");
93
-
cmd.ExecuteNonQuery(@"DELETE FROM ""BlocksetEntry"" WHERE ""BlocksetID"" NOT IN (SELECTDISTINCT""ID"" FROM ""Blockset"") ");
94
-
cmd.ExecuteNonQuery(@"DELETE FROM ""BlocklistHash"" WHERE ""BlocksetID"" NOT IN (SELECTDISTINCT""ID"" FROM ""Blockset"") ");
88
+
cmd.ExecuteNonQuery(@"DELETE FROM ""FilesetEntry"" WHERE ""FilesetID"" NOT IN (SELECT ""ID"" FROM ""Fileset"")");
89
+
cmd.ExecuteNonQuery(@"DELETE FROM ""ChangeJournalData"" WHERE ""FilesetID"" NOT IN (SELECT ""ID"" FROM ""Fileset"")");
90
+
cmd.ExecuteNonQuery(@"DELETE FROM ""FileLookup"" WHERE ""ID"" NOT IN (SELECT ""FileID"" FROM ""FilesetEntry"") ");
91
+
cmd.ExecuteNonQuery(@"DELETE FROM ""Metadataset"" WHERE ""ID"" NOT IN (SELECT ""MetadataID"" FROM ""FileLookup"") ");
92
+
cmd.ExecuteNonQuery(@"DELETE FROM ""Blockset"" WHERE ""ID"" NOT IN (SELECT ""BlocksetID"" FROM ""FileLookup"" UNIONALL SELECT ""BlocksetID"" FROM ""Metadataset"") ");
93
+
cmd.ExecuteNonQuery(@"DELETE FROM ""BlocksetEntry"" WHERE ""BlocksetID"" NOT IN (SELECT ""ID"" FROM ""Blockset"") ");
94
+
cmd.ExecuteNonQuery(@"DELETE FROM ""BlocklistHash"" WHERE ""BlocksetID"" NOT IN (SELECT ""ID"" FROM ""Blockset"") ");
95
95
96
96
//We save the block info for the remote files, before we delete it
97
-
cmd.ExecuteNonQuery(@"INSERT INTO ""DeletedBlock"" (""Hash"", ""Size"", ""VolumeID"") SELECT ""Hash"", ""Size"", ""VolumeID"" FROM ""Block"" WHERE ""ID"" NOT IN (SELECTDISTINCT""BlockID"" AS ""BlockID"" FROM ""BlocksetEntry"" UNIONSELECT DISTINCT ""ID"" FROM ""Block"", ""BlocklistHash"" WHERE ""Block"".""Hash"" = ""BlocklistHash"".""Hash"") ");
98
-
cmd.ExecuteNonQuery(@"DELETE FROM ""Block"" WHERE ""ID"" NOT IN (SELECTDISTINCT""BlockID"" FROM ""BlocksetEntry"" UNIONSELECT DISTINCT ""ID"" FROM ""Block"", ""BlocklistHash"" WHERE ""Block"".""Hash"" = ""BlocklistHash"".""Hash"") ");
97
+
cmd.ExecuteNonQuery(@"INSERT INTO ""DeletedBlock"" (""Hash"", ""Size"", ""VolumeID"") SELECT ""Hash"", ""Size"", ""VolumeID"" FROM ""Block"" WHERE ""ID"" NOT IN (SELECT ""BlockID"" AS ""BlockID"" FROM ""BlocksetEntry"" UNIONALL SELECT ""ID"" FROM ""Block"", ""BlocklistHash"" WHERE ""Block"".""Hash"" = ""BlocklistHash"".""Hash"") ");
98
+
cmd.ExecuteNonQuery(@"DELETE FROM ""Block"" WHERE ""ID"" NOT IN (SELECT ""BlockID"" FROM ""BlocksetEntry"" UNIONALL SELECT ""ID"" FROM ""Block"", ""BlocklistHash"" WHERE ""Block"".""Hash"" = ""BlocklistHash"".""Hash"") ");
99
99
100
100
//Find all remote filesets that are no longer required, and mark them as delete
101
101
varupdated=cmd.ExecuteNonQuery(@"UPDATE ""RemoteVolume"" SET ""State"" = ? WHERE ""Type"" = ? AND ""State"" IN (?, ?, ?) AND ""ID"" NOT IN (SELECT ""VolumeID"" FROM ""Fileset"") ",RemoteVolumeState.Deleting.ToString(),RemoteVolumeType.Files.ToString(),RemoteVolumeState.Uploaded.ToString(),RemoteVolumeState.Verified.ToString(),RemoteVolumeState.Temporary.ToString());