From 0c023abbcfdb60a854a1a06fd35445bfe78a0d02 Mon Sep 17 00:00:00 2001 From: ClemensF Date: Thu, 18 Jul 2019 23:08:10 +0200 Subject: [PATCH] Version 4.12.2 Added SQLiteCache --- MBTiles/Shared/MBTileData.cs | 5 - MBTiles/UWP/MBTiles.UWP.csproj | 2 +- MapControlExtended.sln | 100 ++++++- SQLiteCache/UWP/Properties/AssemblyInfo.cs | 14 + .../UWP/Properties/SQLiteCache.UWP.rd.xml | 33 +++ SQLiteCache/UWP/SQLiteCache.UWP.csproj | 163 ++++++++++++ SQLiteCache/UWP/SQLiteCache.cs | 95 +++++++ SQLiteCache/WPF/Properties/AssemblyInfo.cs | 14 + SQLiteCache/WPF/SQLiteCache.WPF.csproj | 85 ++++++ SQLiteCache/WPF/SQLiteCache.cs | 248 ++++++++++++++++++ SQLiteCache/WPF/packages.config | 4 + 11 files changed, 755 insertions(+), 8 deletions(-) create mode 100644 SQLiteCache/UWP/Properties/AssemblyInfo.cs create mode 100644 SQLiteCache/UWP/Properties/SQLiteCache.UWP.rd.xml create mode 100644 SQLiteCache/UWP/SQLiteCache.UWP.csproj create mode 100644 SQLiteCache/UWP/SQLiteCache.cs create mode 100644 SQLiteCache/WPF/Properties/AssemblyInfo.cs create mode 100644 SQLiteCache/WPF/SQLiteCache.WPF.csproj create mode 100644 SQLiteCache/WPF/SQLiteCache.cs create mode 100644 SQLiteCache/WPF/packages.config diff --git a/MBTiles/Shared/MBTileData.cs b/MBTiles/Shared/MBTileData.cs index 5693706e..5ea71ce1 100644 --- a/MBTiles/Shared/MBTileData.cs +++ b/MBTiles/Shared/MBTileData.cs @@ -49,11 +49,6 @@ namespace MapControl.MBTiles return tileData; } - public void Close() - { - connection.Close(); - } - public void Dispose() { connection.Dispose(); diff --git a/MBTiles/UWP/MBTiles.UWP.csproj b/MBTiles/UWP/MBTiles.UWP.csproj index 15e56b1f..67939197 100644 --- a/MBTiles/UWP/MBTiles.UWP.csproj +++ b/MBTiles/UWP/MBTiles.UWP.csproj @@ -53,7 +53,7 @@ - + 2.2.6 diff --git a/MapControlExtended.sln b/MapControlExtended.sln index 2caf67e3..795f4b15 100644 --- a/MapControlExtended.sln +++ b/MapControlExtended.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29102.190 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MapControl", "MapControl", "{52AECE49-F314-4F76-98F2-FA800F07824B}" EndProject @@ -39,14 +39,22 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MapImages.WPF", "MapImages\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MapImages.UWP", "MapImages\UWP\MapImages.UWP.csproj", "{BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SQLiteCache", "SQLiteCache", "{96FD1258-1597-48A2-8D64-1ADAE13E886A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLiteCache.UWP", "SQLiteCache\UWP\SQLiteCache.UWP.csproj", "{56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLiteCache.WPF", "SQLiteCache\WPF\SQLiteCache.WPF.csproj", "{0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection @@ -55,6 +63,8 @@ Global {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Debug|Any CPU.Build.0 = Debug|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Debug|ARM.ActiveCfg = Debug|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Debug|ARM.Build.0 = Debug|Any CPU + {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Debug|ARM64.Build.0 = Debug|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Debug|x64.ActiveCfg = Debug|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Debug|x64.Build.0 = Debug|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -63,6 +73,8 @@ Global {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Release|Any CPU.Build.0 = Release|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Release|ARM.ActiveCfg = Release|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Release|ARM.Build.0 = Release|Any CPU + {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Release|ARM64.ActiveCfg = Release|Any CPU + {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Release|ARM64.Build.0 = Release|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Release|x64.ActiveCfg = Release|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Release|x64.Build.0 = Release|Any CPU {A204A102-C745-4D65-AEC8-7B96FAEDEF2D}.Release|x86.ActiveCfg = Release|Any CPU @@ -73,6 +85,7 @@ Global {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Debug|ARM.ActiveCfg = Debug|ARM {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Debug|ARM.Build.0 = Debug|ARM {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Debug|ARM.Deploy.0 = Debug|ARM + {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Debug|ARM64.ActiveCfg = Debug|x86 {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Debug|x64.ActiveCfg = Debug|x64 {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Debug|x64.Build.0 = Debug|x64 {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Debug|x64.Deploy.0 = Debug|x64 @@ -85,6 +98,7 @@ Global {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Release|ARM.ActiveCfg = Release|ARM {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Release|ARM.Build.0 = Release|ARM {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Release|ARM.Deploy.0 = Release|ARM + {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Release|ARM64.ActiveCfg = Release|x86 {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Release|x64.ActiveCfg = Release|x64 {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Release|x64.Build.0 = Release|x64 {AA62B4AA-1CA3-4C20-BEB7-B824D0FC4BD1}.Release|x64.Deploy.0 = Release|x64 @@ -95,6 +109,8 @@ Global {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Debug|Any CPU.Build.0 = Debug|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Debug|ARM.ActiveCfg = Debug|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Debug|ARM.Build.0 = Debug|Any CPU + {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Debug|ARM64.Build.0 = Debug|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Debug|x64.ActiveCfg = Debug|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Debug|x64.Build.0 = Debug|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -103,6 +119,8 @@ Global {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Release|Any CPU.Build.0 = Release|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Release|ARM.ActiveCfg = Release|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Release|ARM.Build.0 = Release|Any CPU + {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Release|ARM64.ActiveCfg = Release|Any CPU + {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Release|ARM64.Build.0 = Release|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Release|x64.ActiveCfg = Release|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Release|x64.Build.0 = Release|Any CPU {38B18AB6-6E70-4696-8FB4-E8C8E12BF50C}.Release|x86.ActiveCfg = Release|Any CPU @@ -111,6 +129,8 @@ Global {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Debug|ARM.ActiveCfg = Debug|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Debug|ARM.Build.0 = Debug|Any CPU + {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Debug|ARM64.Build.0 = Debug|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Debug|x64.ActiveCfg = Debug|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Debug|x64.Build.0 = Debug|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -119,6 +139,8 @@ Global {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Release|Any CPU.Build.0 = Release|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Release|ARM.ActiveCfg = Release|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Release|ARM.Build.0 = Release|Any CPU + {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Release|ARM64.ActiveCfg = Release|Any CPU + {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Release|ARM64.Build.0 = Release|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Release|x64.ActiveCfg = Release|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Release|x64.Build.0 = Release|Any CPU {AD1CB53E-7AA4-4EC0-B901-B4E0E2665133}.Release|x86.ActiveCfg = Release|Any CPU @@ -127,6 +149,8 @@ Global {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Debug|ARM.ActiveCfg = Debug|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Debug|ARM.Build.0 = Debug|Any CPU + {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Debug|ARM64.Build.0 = Debug|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Debug|x64.ActiveCfg = Debug|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Debug|x64.Build.0 = Debug|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -135,6 +159,8 @@ Global {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Release|Any CPU.Build.0 = Release|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Release|ARM.ActiveCfg = Release|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Release|ARM.Build.0 = Release|Any CPU + {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Release|ARM64.ActiveCfg = Release|Any CPU + {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Release|ARM64.Build.0 = Release|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Release|x64.ActiveCfg = Release|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Release|x64.Build.0 = Release|Any CPU {BEEB142A-5FA3-468D-810A-32A4A5BD6D5D}.Release|x86.ActiveCfg = Release|Any CPU @@ -143,6 +169,8 @@ Global {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Debug|Any CPU.Build.0 = Debug|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Debug|ARM.ActiveCfg = Debug|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Debug|ARM.Build.0 = Debug|Any CPU + {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Debug|ARM64.Build.0 = Debug|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Debug|x64.ActiveCfg = Debug|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Debug|x64.Build.0 = Debug|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -151,6 +179,8 @@ Global {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Release|Any CPU.Build.0 = Release|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Release|ARM.ActiveCfg = Release|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Release|ARM.Build.0 = Release|Any CPU + {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Release|ARM64.ActiveCfg = Release|Any CPU + {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Release|ARM64.Build.0 = Release|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Release|x64.ActiveCfg = Release|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Release|x64.Build.0 = Release|Any CPU {9545F73C-9C35-4CF6-BAAE-19A0BAEBD344}.Release|x86.ActiveCfg = Release|Any CPU @@ -159,6 +189,8 @@ Global {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Debug|Any CPU.Build.0 = Debug|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Debug|ARM.ActiveCfg = Debug|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Debug|ARM.Build.0 = Debug|Any CPU + {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Debug|ARM64.Build.0 = Debug|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Debug|x64.ActiveCfg = Debug|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Debug|x64.Build.0 = Debug|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -167,6 +199,8 @@ Global {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Release|Any CPU.Build.0 = Release|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Release|ARM.ActiveCfg = Release|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Release|ARM.Build.0 = Release|Any CPU + {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Release|ARM64.ActiveCfg = Release|Any CPU + {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Release|ARM64.Build.0 = Release|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Release|x64.ActiveCfg = Release|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Release|x64.Build.0 = Release|Any CPU {DCC111E9-EC8B-492A-A09D-DF390D83AE8D}.Release|x86.ActiveCfg = Release|Any CPU @@ -175,6 +209,8 @@ Global {426C21C0-5F14-491F-BCD1-6D2993510420}.Debug|Any CPU.Build.0 = Debug|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Debug|ARM.ActiveCfg = Debug|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Debug|ARM.Build.0 = Debug|Any CPU + {426C21C0-5F14-491F-BCD1-6D2993510420}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {426C21C0-5F14-491F-BCD1-6D2993510420}.Debug|ARM64.Build.0 = Debug|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Debug|x64.ActiveCfg = Debug|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Debug|x64.Build.0 = Debug|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -183,6 +219,8 @@ Global {426C21C0-5F14-491F-BCD1-6D2993510420}.Release|Any CPU.Build.0 = Release|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Release|ARM.ActiveCfg = Release|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Release|ARM.Build.0 = Release|Any CPU + {426C21C0-5F14-491F-BCD1-6D2993510420}.Release|ARM64.ActiveCfg = Release|Any CPU + {426C21C0-5F14-491F-BCD1-6D2993510420}.Release|ARM64.Build.0 = Release|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Release|x64.ActiveCfg = Release|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Release|x64.Build.0 = Release|Any CPU {426C21C0-5F14-491F-BCD1-6D2993510420}.Release|x86.ActiveCfg = Release|Any CPU @@ -191,6 +229,8 @@ Global {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Debug|Any CPU.Build.0 = Debug|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Debug|ARM.ActiveCfg = Debug|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Debug|ARM.Build.0 = Debug|Any CPU + {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Debug|ARM64.Build.0 = Debug|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Debug|x64.ActiveCfg = Debug|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Debug|x64.Build.0 = Debug|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -199,6 +239,8 @@ Global {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Release|Any CPU.Build.0 = Release|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Release|ARM.ActiveCfg = Release|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Release|ARM.Build.0 = Release|Any CPU + {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Release|ARM64.ActiveCfg = Release|Any CPU + {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Release|ARM64.Build.0 = Release|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Release|x64.ActiveCfg = Release|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Release|x64.Build.0 = Release|Any CPU {F92DA93D-75DB-4308-A5F9-6B4C3908A675}.Release|x86.ActiveCfg = Release|Any CPU @@ -207,6 +249,8 @@ Global {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Debug|Any CPU.Build.0 = Debug|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Debug|ARM.ActiveCfg = Debug|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Debug|ARM.Build.0 = Debug|Any CPU + {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Debug|ARM64.Build.0 = Debug|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Debug|x64.ActiveCfg = Debug|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Debug|x64.Build.0 = Debug|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -215,6 +259,8 @@ Global {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Release|Any CPU.Build.0 = Release|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Release|ARM.ActiveCfg = Release|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Release|ARM.Build.0 = Release|Any CPU + {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Release|ARM64.ActiveCfg = Release|Any CPU + {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Release|ARM64.Build.0 = Release|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Release|x64.ActiveCfg = Release|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Release|x64.Build.0 = Release|Any CPU {9EE69591-5EDC-45E3-893E-2F9A4B82D538}.Release|x86.ActiveCfg = Release|Any CPU @@ -223,6 +269,8 @@ Global {52042F63-563A-45BB-9A08-A8635AAAB84C}.Debug|Any CPU.Build.0 = Debug|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Debug|ARM.ActiveCfg = Debug|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Debug|ARM.Build.0 = Debug|Any CPU + {52042F63-563A-45BB-9A08-A8635AAAB84C}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {52042F63-563A-45BB-9A08-A8635AAAB84C}.Debug|ARM64.Build.0 = Debug|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Debug|x64.ActiveCfg = Debug|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Debug|x64.Build.0 = Debug|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -231,6 +279,8 @@ Global {52042F63-563A-45BB-9A08-A8635AAAB84C}.Release|Any CPU.Build.0 = Release|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Release|ARM.ActiveCfg = Release|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Release|ARM.Build.0 = Release|Any CPU + {52042F63-563A-45BB-9A08-A8635AAAB84C}.Release|ARM64.ActiveCfg = Release|Any CPU + {52042F63-563A-45BB-9A08-A8635AAAB84C}.Release|ARM64.Build.0 = Release|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Release|x64.ActiveCfg = Release|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Release|x64.Build.0 = Release|Any CPU {52042F63-563A-45BB-9A08-A8635AAAB84C}.Release|x86.ActiveCfg = Release|Any CPU @@ -239,6 +289,8 @@ Global {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Debug|Any CPU.Build.0 = Debug|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Debug|ARM.ActiveCfg = Debug|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Debug|ARM.Build.0 = Debug|Any CPU + {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Debug|ARM64.Build.0 = Debug|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Debug|x64.ActiveCfg = Debug|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Debug|x64.Build.0 = Debug|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -247,10 +299,52 @@ Global {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|Any CPU.Build.0 = Release|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|ARM.ActiveCfg = Release|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|ARM.Build.0 = Release|Any CPU + {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|ARM64.ActiveCfg = Release|Any CPU + {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|ARM64.Build.0 = Release|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|x64.ActiveCfg = Release|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|x64.Build.0 = Release|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|x86.ActiveCfg = Release|Any CPU {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372}.Release|x86.Build.0 = Release|Any CPU + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|ARM.ActiveCfg = Debug|ARM + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|ARM.Build.0 = Debug|ARM + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|ARM64.Build.0 = Debug|ARM64 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|x64.ActiveCfg = Debug|x64 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|x64.Build.0 = Debug|x64 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|x86.ActiveCfg = Debug|x86 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Debug|x86.Build.0 = Debug|x86 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|Any CPU.Build.0 = Release|Any CPU + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|ARM.ActiveCfg = Release|ARM + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|ARM.Build.0 = Release|ARM + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|ARM64.ActiveCfg = Release|ARM64 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|ARM64.Build.0 = Release|ARM64 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|x64.ActiveCfg = Release|x64 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|x64.Build.0 = Release|x64 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|x86.ActiveCfg = Release|x86 + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1}.Release|x86.Build.0 = Release|x86 + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|ARM.Build.0 = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|ARM64.Build.0 = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|x64.ActiveCfg = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|x64.Build.0 = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|x86.ActiveCfg = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Debug|x86.Build.0 = Debug|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|Any CPU.Build.0 = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|ARM.ActiveCfg = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|ARM.Build.0 = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|ARM64.ActiveCfg = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|ARM64.Build.0 = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|x64.ActiveCfg = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|x64.Build.0 = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|x86.ActiveCfg = Release|Any CPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -268,6 +362,8 @@ Global {9EE69591-5EDC-45E3-893E-2F9A4B82D538} = {7BC11E28-8D3B-4C5B-AC08-AB249CC95F6D} {52042F63-563A-45BB-9A08-A8635AAAB84C} = {2FDC8B91-FB95-4C57-8183-63587FBFE180} {BE08B7BC-8C89-4837-BCE7-EDDDABEAB372} = {2FDC8B91-FB95-4C57-8183-63587FBFE180} + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1} = {96FD1258-1597-48A2-8D64-1ADAE13E886A} + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349} = {96FD1258-1597-48A2-8D64-1ADAE13E886A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {458346DD-B23F-4FDC-8F9D-A10F1882A4DB} diff --git a/SQLiteCache/UWP/Properties/AssemblyInfo.cs b/SQLiteCache/UWP/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..acf82190 --- /dev/null +++ b/SQLiteCache/UWP/Properties/AssemblyInfo.cs @@ -0,0 +1,14 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("XAML Map Control SQLiteCache (UWP)")] +[assembly: AssemblyDescription("IImageCache implementation based on SQLite")] +[assembly: AssemblyProduct("XAML Map Control")] +[assembly: AssemblyCompany("Clemens Fischer")] +[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyVersion("4.12.2")] +[assembly: AssemblyFileVersion("4.12.2")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] diff --git a/SQLiteCache/UWP/Properties/SQLiteCache.UWP.rd.xml b/SQLiteCache/UWP/Properties/SQLiteCache.UWP.rd.xml new file mode 100644 index 00000000..efe89ca3 --- /dev/null +++ b/SQLiteCache/UWP/Properties/SQLiteCache.UWP.rd.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/SQLiteCache/UWP/SQLiteCache.UWP.csproj b/SQLiteCache/UWP/SQLiteCache.UWP.csproj new file mode 100644 index 00000000..83d9d853 --- /dev/null +++ b/SQLiteCache/UWP/SQLiteCache.UWP.csproj @@ -0,0 +1,163 @@ + + + + + Debug + AnyCPU + {56DFA7CF-F31D-45CE-9C36-DA8DBB8413B1} + Library + Properties + MapControl.Caching + SQLiteCache.UWP + en-US + UAP + 10.0.18362.0 + 10.0.17134.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + AnyCPU + none + true + bin\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + x86 + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + x86 + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + ARM + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + ARM + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + ARM64 + true + bin\ARM64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + ARM64 + bin\ARM64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + x64 + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + false + prompt + + + x64 + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + false + prompt + + + PackageReference + + + + + + + + + 2.2.6 + + + 6.2.8 + + + + + MapControl.snk + + + + + {9545f73c-9c35-4cf6-baae-19a0baebd344} + MapControl.UWP + + + + 14.0 + + + true + + + ..\..\MapControl.snk + + + + \ No newline at end of file diff --git a/SQLiteCache/UWP/SQLiteCache.cs b/SQLiteCache/UWP/SQLiteCache.cs new file mode 100644 index 00000000..ab66f8ac --- /dev/null +++ b/SQLiteCache/UWP/SQLiteCache.cs @@ -0,0 +1,95 @@ +// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control +// © 2019 Clemens Fischer +// Licensed under the Microsoft Public License (Ms-PL) + +using Microsoft.Data.Sqlite; +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading.Tasks; +using Windows.Storage; +using Windows.Storage.Streams; + +namespace MapControl.Caching +{ + /// + /// IImageCache implementation based on SqLite. + /// + public sealed class SQLiteCache : IImageCache, IDisposable + { + private readonly SqliteConnection connection; + + public SQLiteCache(StorageFolder folder, string fileName = "TileCache.sqlite") + { + if (folder == null) + { + throw new ArgumentNullException("The parameter folder must not be null."); + } + + if (string.IsNullOrEmpty(fileName)) + { + throw new ArgumentNullException("The parameter fileName must not be null."); + } + + connection = new SqliteConnection("Data Source=" + Path.Combine(folder.Path, fileName)); + + connection.Open(); + + using (var command = new SqliteCommand("create table if not exists items (key text, expiration integer, buffer blob)", connection)) + { + command.ExecuteNonQuery(); + } + } + + public void Dispose() + { + connection.Dispose(); + } + + public async Task GetAsync(string key) + { + try + { + using (var command = new SqliteCommand("select expiration, buffer from items where key=@key", connection)) + { + command.Parameters.AddWithValue("@key", key); + var reader = await command.ExecuteReaderAsync(); + + if (reader.Read()) + { + return new ImageCacheItem + { + Expiration = new DateTime((long)reader["expiration"]), + Buffer = ((byte[])reader["buffer"]).AsBuffer() + }; + } + } + } + catch (Exception ex) + { + Debug.WriteLine("SqLiteCache: GetAsync(\"{0}\"): {1}", key, ex.Message); + } + + return null; + } + + public async Task SetAsync(string key, IBuffer buffer, DateTime expiration) + { + try + { + using (var command = new SqliteCommand("insert or replace into items (key, expiration, buffer) values (@key, @exp, @buf)", connection)) + { + command.Parameters.AddWithValue("@key", key); + command.Parameters.AddWithValue("@exp", expiration.Ticks); + command.Parameters.AddWithValue("@buf", buffer.ToArray()); + await command.ExecuteNonQueryAsync(); + } + } + catch (Exception ex) + { + Debug.WriteLine("SqLiteCache: SetAsync(\"{0}\"): {1}", key, ex.Message); + } + } + } +} diff --git a/SQLiteCache/WPF/Properties/AssemblyInfo.cs b/SQLiteCache/WPF/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..12b9e150 --- /dev/null +++ b/SQLiteCache/WPF/Properties/AssemblyInfo.cs @@ -0,0 +1,14 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("XAML Map Control SQLiteCache (WPF)")] +[assembly: AssemblyDescription("ObjectCache implementation based on SQLite")] +[assembly: AssemblyProduct("XAML Map Control")] +[assembly: AssemblyCompany("Clemens Fischer")] +[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyVersion("4.12.2")] +[assembly: AssemblyFileVersion("4.12.2")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] diff --git a/SQLiteCache/WPF/SQLiteCache.WPF.csproj b/SQLiteCache/WPF/SQLiteCache.WPF.csproj new file mode 100644 index 00000000..02ff43e6 --- /dev/null +++ b/SQLiteCache/WPF/SQLiteCache.WPF.csproj @@ -0,0 +1,85 @@ + + + + + Debug + AnyCPU + {0109C2F0-BA2C-420F-B2CA-DB5B29B1A349} + library + Properties + MapControl.Caching + SQLiteCache.WPF + v4.8 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + none + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + ..\..\MapControl.snk + + + + + + ..\..\packages\System.Data.SQLite.Core.1.0.111.0\lib\net46\System.Data.SQLite.dll + + + + + + Code + + + + + + + MapControl.snk + + + + + + {A204A102-C745-4D65-AEC8-7B96FAEDEF2D} + MapControl.WPF + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/SQLiteCache/WPF/SQLiteCache.cs b/SQLiteCache/WPF/SQLiteCache.cs new file mode 100644 index 00000000..46e295a2 --- /dev/null +++ b/SQLiteCache/WPF/SQLiteCache.cs @@ -0,0 +1,248 @@ +// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control +// © 2019 Clemens Fischer +// Licensed under the Microsoft Public License (Ms-PL) + +using System; +using System.Collections.Generic; +using System.Data.SQLite; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.Caching; + +namespace MapControl.Caching +{ + /// + /// ObjectCache implementation based on SqLite. + /// + public sealed class SQLiteCache : ObjectCache, IDisposable + { + private readonly SQLiteConnection connection; + + public SQLiteCache(string path) + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentException("The parameter path must not be null or empty."); + } + + if (string.IsNullOrEmpty(Path.GetExtension(path))) + { + path = Path.Combine(path, "TileCache.sqlite"); + } + + connection = new SQLiteConnection("Data Source=" + Path.GetFullPath(path)); + + connection.Open(); + + using (var command = new SQLiteCommand("create table if not exists items (key text, expiration integer, buffer blob)", connection)) + { + command.ExecuteNonQuery(); + } + } + + public override string Name + { + get { return string.Empty; } + } + + public override DefaultCacheCapabilities DefaultCacheCapabilities + { + get { return DefaultCacheCapabilities.AbsoluteExpirations | DefaultCacheCapabilities.SlidingExpirations; } + } + + public override object this[string key] + { + get { return Get(key); } + set { Set(key, value, null); } + } + + protected override IEnumerator> GetEnumerator() + { + throw new NotSupportedException("SqLiteCache does not support the ability to enumerate items."); + } + + public override CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(IEnumerable keys, string regionName = null) + { + throw new NotSupportedException("SqLiteCache does not support the ability to create change monitors."); + } + + public override long GetCount(string regionName = null) + { + if (regionName != null) + { + throw new NotSupportedException("The parameter regionName must be null."); + } + + try + { + using (var command = new SQLiteCommand("select count(*) from items", connection)) + { + return (long)command.ExecuteScalar(); + } + } + catch (Exception ex) + { + Debug.WriteLine("SqLiteCache: GetCount(): {0}", ex.Message); + } + + return 0; + } + + public override bool Contains(string key, string regionName = null) + { + if (key == null) + { + throw new ArgumentNullException("The parameter key must not be null."); + } + + if (regionName != null) + { + throw new NotSupportedException("The parameter regionName must be null."); + } + + try + { + using (var command = new SQLiteCommand("select expiration, buffer from items where key=@key", connection)) + { + command.Parameters.AddWithValue("@key", key); + + return command.ExecuteReader().Read(); + } + } + catch (Exception ex) + { + Debug.WriteLine("SqLiteCache: Get(\"{0}\"): {1}", key, ex.Message); + } + + return false; + } + + public override object Get(string key, string regionName = null) + { + if (key == null) + { + throw new ArgumentNullException("The parameter key must not be null."); + } + + if (regionName != null) + { + throw new NotSupportedException("The parameter regionName must be null."); + } + + try + { + using (var command = new SQLiteCommand("select expiration, buffer from items where key=@key", connection)) + { + command.Parameters.AddWithValue("@key", key); + var reader = command.ExecuteReader(); + + if (reader.Read()) + { + return new ImageCacheItem + { + Expiration = new DateTime((long)reader["expiration"]), + Buffer = (byte[])reader["buffer"] + }; + } + } + } + catch (Exception ex) + { + Debug.WriteLine("SqLiteCache: Get(\"{0}\"): {1}", key, ex.Message); + } + + return null; + } + + public override CacheItem GetCacheItem(string key, string regionName = null) + { + var value = Get(key, regionName); + + return value != null ? new CacheItem(key, value) : null; + } + + public override IDictionary GetValues(IEnumerable keys, string regionName = null) + { + return keys.ToDictionary(key => key, key => Get(key, regionName)); + } + + public override void Set(string key, object value, CacheItemPolicy policy, string regionName = null) + { + if (key == null) + { + throw new ArgumentNullException("The parameter key must not be null."); + } + + if (regionName != null) + { + throw new NotSupportedException("The parameter regionName must be null."); + } + + var imageCacheItem = value as ImageCacheItem; + + if (imageCacheItem == null || imageCacheItem.Buffer == null || imageCacheItem.Buffer.Length == 0) + { + throw new NotSupportedException("The parameter value must be an ImageCacheItem with a non-empty Buffer."); + } + + try + { + using (var command = new SQLiteCommand("insert or replace into items (key, expiration, buffer) values (@key, @exp, @buf)", connection)) + { + command.Parameters.AddWithValue("@key", key); + command.Parameters.AddWithValue("@exp", imageCacheItem.Expiration.Ticks); + command.Parameters.AddWithValue("@buf", imageCacheItem.Buffer); + command.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + Debug.WriteLine("SqLiteCache: Set(\"{0}\"): {1}", key, ex.Message); + } + } + + public override void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null) + { + Set(key, value, new CacheItemPolicy { AbsoluteExpiration = absoluteExpiration }, regionName); + } + + public override void Set(CacheItem item, CacheItemPolicy policy) + { + Set(item.Key, item.Value, policy, item.RegionName); + } + + public override object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null) + { + var oldValue = Get(key, regionName); + + Set(key, value, policy); + + return oldValue; + } + + public override object AddOrGetExisting(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null) + { + return AddOrGetExisting(key, value, new CacheItemPolicy { AbsoluteExpiration = absoluteExpiration }, regionName); + } + + public override CacheItem AddOrGetExisting(CacheItem item, CacheItemPolicy policy) + { + var oldItem = GetCacheItem(item.Key, item.RegionName); + + Set(item, policy); + + return oldItem; + } + + public override object Remove(string key, string regionName = null) + { + throw new NotImplementedException(); + } + + public void Dispose() + { + connection.Dispose(); + } + } +} diff --git a/SQLiteCache/WPF/packages.config b/SQLiteCache/WPF/packages.config new file mode 100644 index 00000000..66fcbabd --- /dev/null +++ b/SQLiteCache/WPF/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file