From 0101f3474f7117303f5e4ce9951b4a64715132c6 Mon Sep 17 00:00:00 2001 From: Teacup Date: Wed, 31 May 2023 18:34:50 -0400 Subject: [PATCH] Add systems for local world persistence (#553) * chore: Change vscode workspace settings to work with omnisharp * refactor(.NET): Use connection string builder to init sqlite database * docs(.NET): Add method documentation to most things that matter * docs(.NET): Add more docs I forgot to commit apparently * feat: Add PoC world database structure ^& http listener * fix: Send a response if VRCX isn't initialized rather than hanging * feat: Initialize world db schema on startup * feat: Allow worlds to store data in db through logfile * use existing current location for worldDB * Add tooltips * chore: Make it so vscode can format C# files without prettier * refactor: Add sqlite-net to (eventually) replace sqlite impl * refactor: Make use of sqlite-net for world database * docs: Add todo for fixing some random exception * refactor: Remove now-unused SQLiteWorld * refactor: Fix DB init query and change table structure again * refactor: Add WorldDataRequest, add attributes for camelcase json keys * Support current user location from API in addition to gameLog * Change current location check for worldDB * feat: Take store requests in JSON, identify worlds by GUID on store. * refactor: Remove unused worldId param from connection key generator * docs: Add more documentation to the methods for the world database * fix: Hey wait that's not a primary key * feat: Add a 10MB data cap for worlds shared across all of their rows. * fix: Don't calculate size of world date twice when inserting * refactor: Discard the guid variable since we only check for validity * docs: Add docs/comments for new data cap functionality * feat: Implement /getbulk API endpoint * fix: Correct WorldDB init query typo * fix: Update data entries properly instead of using 'OR REPLACE' * refactor: Move endpoint processing to separate methods * refactor: Add another check for error 503, remove old code * feat: Add debug capability to /vrcx/getbulk * fix: Correct the usage of getUser in actuallyGetCurrentLocation * feat: Add store errors, implement external reading, stop 404ing * docs: Add docs for new world db funcs * refactor: Change world db server listen port to 22500 * fix: Use getUser correctly, dumb dumb * fix: This error set shouldn't be here * feat: Future-proof api endpoints. Add /status endpoint --------- Co-authored-by: Natsumi --- .vscode/settings.json | 7 +- AppApi.cs | 218 +- AssetBundleCacher.cs | 33 + AutoAppLaunchManager.cs | 7 +- LogWatcher.cs | 29 +- Program.cs | 13 +- SQLite.cs | 5069 ++++++++++++++++++++++++++++++++++- SQLiteLegacy.cs | 151 ++ ScreenshotHelper.cs | 6 +- Util.cs | 3 +- VRCX.csproj | 11 +- WebApi.cs | 6 +- WorldDBManager.cs | 423 +++ WorldDataRequestResponse.cs | 53 + WorldDatabase.cs | 270 ++ html/src/app.js | 41 + lib/sqlite3.dll | Bin 0 -> 2889728 bytes 17 files changed, 6193 insertions(+), 147 deletions(-) create mode 100644 SQLiteLegacy.cs create mode 100644 WorldDBManager.cs create mode 100644 WorldDataRequestResponse.cs create mode 100644 WorldDatabase.cs create mode 100644 lib/sqlite3.dll diff --git a/.vscode/settings.json b/.vscode/settings.json index 5bbe8c61..da190865 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,10 @@ "i18n-ally.keystyle": "nested", "i18n-ally.sourceLanguage": "en", "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true + "editor.formatOnSave": true, + "omnisharp.enableRoslynAnalyzers": true, + "omnisharp.useModernNet": false, + "[csharp]": { + "editor.defaultFormatter": "ms-dotnettools.csharp" + } } diff --git a/AppApi.cs b/AppApi.cs index 9cbb33f8..51d24f5f 100644 --- a/AppApi.cs +++ b/AppApi.cs @@ -51,6 +51,11 @@ namespace VRCX CheckGameRunning(); } + /// + /// Computes the MD5 hash of the file represented by the specified base64-encoded string. + /// + /// The base64-encoded string representing the file. + /// The MD5 hash of the file as a base64-encoded string. public string MD5File(string Blob) { var fileData = Convert.FromBase64CharArray(Blob.ToCharArray(), 0, Blob.Length); @@ -58,6 +63,11 @@ namespace VRCX return Convert.ToBase64String(md5); } + /// + /// Computes the signature of the file represented by the specified base64-encoded string using the librsync library. + /// + /// The base64-encoded string representing the file. + /// The signature of the file as a base64-encoded string. public string SignFile(string Blob) { var fileData = Convert.FromBase64CharArray(Blob.ToCharArray(), 0, Blob.Length); @@ -68,12 +78,21 @@ namespace VRCX return Convert.ToBase64String(sigBytes); } + /// + /// Returns the length of the file represented by the specified base64-encoded string. + /// + /// The base64-encoded string representing the file. + /// The length of the file in bytes. public string FileLength(string Blob) { var fileData = Convert.FromBase64CharArray(Blob.ToCharArray(), 0, Blob.Length); return fileData.Length.ToString(); } + /// + /// Reads the VRChat config file and returns its contents as a string. + /// + /// The contents of the VRChat config file as a string, or an empty string if the file does not exist. public string ReadConfigFile() { var logPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"Low\VRChat\VRChat\"; @@ -87,6 +106,10 @@ namespace VRCX return json; } + /// + /// Writes the specified JSON string to the VRChat config file. + /// + /// The JSON string to write to the config file. public void WriteConfigFile(string json) { var logPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"Low\VRChat\VRChat\"; @@ -94,6 +117,11 @@ namespace VRCX File.WriteAllText(configFile, json); } + /// + /// Gets the VRChat application data location by reading the config file and checking the cache directory. + /// If the cache directory is not found in the config file, it returns the default cache path. + /// + /// The VRChat application data location. public string GetVRChatAppDataLocation() { var json = ReadConfigFile(); @@ -114,21 +142,34 @@ namespace VRCX return cachePath; } + /// + /// Gets the VRChat cache location by combining the VRChat application data location with the cache directory name. + /// + /// The VRChat cache location. public string GetVRChatCacheLocation() { return Path.Combine(GetVRChatAppDataLocation(), "Cache-WindowsPlayer"); } + /// + /// Shows the developer tools for the main browser window. + /// public void ShowDevTools() { MainForm.Instance.Browser.ShowDevTools(); } + /// + /// Deletes all cookies from the global cef cookie manager. + /// public void DeleteAllCookies() { Cef.GetGlobalCookieManager().DeleteCookies(); } + /// + /// Checks if the VRChat game and SteamVR are currently running and updates the browser's JavaScript function $app.updateIsGameRunning with the results. + /// public void CheckGameRunning() { var isGameRunning = false; @@ -144,10 +185,16 @@ namespace VRCX isSteamVRRunning = true; } + // TODO: fix this throwing an exception for being called before the browser is ready. somehow it gets past the checks if (MainForm.Instance?.Browser != null && !MainForm.Instance.Browser.IsLoading) MainForm.Instance.Browser.ExecuteScriptAsync("$app.updateIsGameRunning", isGameRunning, isSteamVRRunning); } + + /// + /// Kills the VRChat process if it is currently running. + /// + /// The number of processes that were killed (0 or 1). public int QuitGame() { var processes = Process.GetProcessesByName("vrchat"); @@ -157,6 +204,10 @@ namespace VRCX return processes.Length; } + /// + /// Starts the VRChat game process with the specified command-line arguments. + /// + /// The command-line arguments to pass to the VRChat game. public void StartGame(string arguments) { // try stream first @@ -204,6 +255,12 @@ namespace VRCX } } + /// + /// Starts the VRChat game process with the specified command-line arguments from the given path. + /// + /// The path to the VRChat game executable. + /// The command-line arguments to pass to the VRChat game. + /// True if the game was started successfully, false otherwise. public bool StartGameFromPath(string path, string arguments) { if (!path.EndsWith(".exe")) @@ -222,6 +279,11 @@ namespace VRCX return true; } + + /// + /// Opens the specified URL in the default browser. + /// + /// The URL to open. public void OpenLink(string url) { if (url.StartsWith("http://") || @@ -264,21 +326,43 @@ namespace VRCX VRCXVR.Instance.Restart(); } + /// + /// Returns an array of arrays containing information about the connected VR devices. + /// Each sub-array contains the type of device and its current state + /// + /// An array of arrays containing information about the connected VR devices. public string[][] GetVRDevices() { return VRCXVR.Instance.GetDevices(); } + /// + /// Returns the current CPU usage as a percentage. + /// + /// The current CPU usage as a percentage. public float CpuUsage() { return CpuMonitor.Instance.CpuUsage; } + /// + /// Retrieves an image from the VRChat API and caches it for future use. The function will return the cached image if it already exists. + /// + /// The URL of the image to retrieve. + /// The ID of the file associated with the image. + /// The version of the file associated with the image. + /// A string representing the file location of the cached image. public string GetImage(string url, string fileId, string version) { return ImageCache.GetImage(url, fileId, version); } + /// + /// Displays a desktop notification with the specified bold text, optional text, and optional image. + /// + /// The bold text to display in the notification. + /// The optional text to display in the notification. + /// The optional image to display in the notification. public void DesktopNotification(string BoldText, string Text = "", string Image = "") { var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastImageAndText02); @@ -297,6 +381,13 @@ namespace VRCX ToastNotificationManager.CreateToastNotifier("VRCX").Show(toast); } + /// + /// Displays an XSOverlay notification with the specified title, content, and optional image. + /// + /// The title of the notification. + /// The content of the notification. + /// The duration of the notification in milliseconds. + /// The optional image to display in the notification. public void XSNotification(string Title, string Content, int Timeout, string Image = "") { bool UseBase64Icon; @@ -332,6 +423,10 @@ namespace VRCX broadcastSocket.SendTo(byteBuffer, endPoint); } + /// + /// Downloads the VRCX update executable from the specified URL and saves it to the AppData directory. + /// + /// The URL of the VRCX update to download. public void DownloadVRCXUpdate(string url) { var Location = Path.Combine(Program.AppDataDirectory, "update.exe"); @@ -340,6 +435,9 @@ namespace VRCX client.DownloadFile(new Uri(url), Location); } + /// + /// Restarts the VRCX application for an update by launching a new process with the "/Upgrade" argument and exiting the current process. + /// public void RestartApplication() { var VRCXProcess = new Process(); @@ -350,6 +448,10 @@ namespace VRCX Environment.Exit(0); } + /// + /// Checks if the VRCX update executable exists in the AppData directory. + /// + /// True if the update executable exists, false otherwise. public bool CheckForUpdateExe() { if (File.Exists(Path.Combine(Program.AppDataDirectory, "update.exe"))) @@ -357,6 +459,9 @@ namespace VRCX return false; } + /// + /// Sends an IPC packet to announce the start of VRCX. + /// public void IPCAnnounceStart() { IPCServer.Send(new IPCPacket @@ -365,6 +470,11 @@ namespace VRCX }); } + /// + /// Sends an IPC packet with a specified message type and data. + /// + /// The message type to send. + /// The data to send. public void SendIpc(string type, string data) { IPCServer.Send(new IPCPacket @@ -397,6 +507,10 @@ namespace VRCX VRCXVR._browser2.ExecuteScriptAsync($"$app.{function}", json); } + /// + /// Gets the launch command from the startup arguments and clears the launch command. + /// + /// The launch command. public string GetLaunchCommand() { var command = StartupArgs.LaunchCommand; @@ -404,11 +518,18 @@ namespace VRCX return command; } + /// + /// Focuses the main window of the VRCX application. + /// public void FocusWindow() { MainForm.Instance.Invoke(new Action(() => { MainForm.Instance.Focus_Window(); })); } + /// + /// Returns the file path of the custom user CSS file, if it exists. + /// + /// The file path of the custom user CSS file, or an empty string if it doesn't exist. public string CustomCssPath() { var output = string.Empty; @@ -418,6 +539,10 @@ namespace VRCX return output; } + /// + /// Returns the file path of the custom user js file, if it exists. + /// + /// The file path of the custom user js file, or an empty string if it doesn't exist. public string CustomScriptPath() { var output = string.Empty; @@ -442,6 +567,10 @@ namespace VRCX return Program.Version; } + /// + /// Returns whether or not the VRChat client was last closed gracefully. According to the log file, anyway. + /// + /// True if the VRChat client was last closed gracefully, false otherwise. public bool VrcClosedGracefully() { return LogWatcher.Instance.VrcClosedGracefully; @@ -457,6 +586,10 @@ namespace VRCX WinformThemer.DoFunny(); } + /// + /// Returns the number of milliseconds that the system has been running. + /// + /// The number of milliseconds that the system has been running. public double GetUptime() { using (var uptime = new PerformanceCounter("System", "System Up Time")) @@ -466,12 +599,23 @@ namespace VRCX } } + /// + /// Returns a color value derived from the given user ID. + /// This is, essentially, and is used for, random colors. + /// + /// The user ID to derive the color value from. + /// A color value derived from the given user ID. public int GetColourFromUserID(string userId) { var hash = _hasher.ComputeHash(Encoding.UTF8.GetBytes(userId)); return (hash[3] << 8) | hash[4]; } + /// + /// Returns a dictionary of color values derived from the given list of user IDs. + /// + /// The list of user IDs to derive the color values from. + /// A dictionary of color values derived from the given list of user IDs. public Dictionary GetColourBulk(List userIds) { var output = new Dictionary(); @@ -483,6 +627,10 @@ namespace VRCX return output; } + /// + /// Retrieves the current text from the clipboard. + /// + /// The current text from the clipboard. public string GetClipboard() { var clipboard = string.Empty; @@ -493,6 +641,11 @@ namespace VRCX return clipboard; } + /// + /// Retrieves the value of the specified key from the VRChat group in the windows registry. + /// + /// The name of the key to retrieve. + /// The value of the specified key, or null if the key does not exist. public object GetVRChatRegistryKey(string key) { // https://answers.unity.com/questions/177945/playerprefs-changing-the-name-of-keys.html?childToView=208076#answer-208076 @@ -528,6 +681,12 @@ namespace VRCX return null; } + /// + /// Sets the value of the specified key in the VRChat group in the windows registry. + /// + /// The name of the key to set. + /// The value to set for the specified key. + /// True if the key was successfully set, false otherwise. public bool SetVRChatRegistryKey(string key, string value) { uint hash = 5381; @@ -562,6 +721,11 @@ namespace VRCX return true; } + /// + /// Retrieves a dictionary of moderations for the specified user from the VRChat LocalPlayerModerations folder. + /// + /// The ID of the current user. + /// A dictionary of moderations for the specified user, or null if the file does not exist. public Dictionary GetVRChatModerations(string currentUserId) { var filePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + $@"Low\VRChat\VRChat\LocalPlayerModerations\{currentUserId}-show-hide-user.vrcset"; @@ -590,6 +754,12 @@ namespace VRCX return output; } + /// + /// Retrieves the moderation type for the specified user from the VRChat LocalPlayerModerations folder. + /// + /// The ID of the current user. + /// The ID of the user to retrieve the moderation type for. + /// The moderation type for the specified user, or 0 if the file does not exist or the user is not found. public short GetVRChatUserModeration(string currentUserId, string userId) { var filePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + $@"Low\VRChat\VRChat\LocalPlayerModerations\{currentUserId}-show-hide-user.vrcset"; @@ -615,6 +785,13 @@ namespace VRCX return 0; } + /// + /// Sets the moderation type for the specified user in the VRChat LocalPlayerModerations folder. + /// + /// The ID of the current user. + /// The ID of the user to set the moderation type for. + /// The moderation type to set for the specified user. + /// True if the operation was successful, false otherwise. public bool SetVRChatUserModeration(string currentUserId, string userId, int type) { var filePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + $@"Low\VRChat\VRChat\LocalPlayerModerations\{currentUserId}-show-hide-user.vrcset"; @@ -648,6 +825,10 @@ namespace VRCX return true; } + /// + /// Sets whether or not the application should start up automatically with Windows. + /// + /// True to enable automatic startup, false to disable it. public void SetStartup(bool enabled) { try @@ -679,6 +860,13 @@ namespace VRCX AutoAppLaunchManager.Instance.KillChildrenOnExit = killOnExit; } + /// + /// Adds metadata to a PNG screenshot file and optionally renames the file to include the specified world ID. + /// + /// The path to the PNG screenshot file. + /// The metadata to add to the screenshot file. + /// The ID of the world to associate with the screenshot. + /// Whether or not to rename the screenshot file to include the world ID. public void AddScreenshotMetadata(string path, string metadataString, string worldId, bool changeFilename = false) { var fileName = Path.GetFileNameWithoutExtension(path); @@ -696,7 +884,10 @@ namespace VRCX ScreenshotHelper.WritePNGDescription(path, metadataString); } - // Create a function that opens a file dialog so a user can choose a .png file. Print the name of the file after it is chosen + /// + /// Opens a file dialog to select a PNG screenshot file. + /// The resulting file path is passed to . + /// public void OpenScreenshotFileDialog() { if (dialogOpen) return; @@ -737,6 +928,10 @@ namespace VRCX thread.Start(); } + /// + /// Retrieves metadata from a PNG screenshot file and send the result to displayScreenshotMetadata in app.js + /// + /// The path to the PNG screenshot file. public void GetScreenshotMetadata(string path) { if (string.IsNullOrEmpty(path)) @@ -818,6 +1013,9 @@ namespace VRCX ExecuteAppFunction("displayScreenshotMetadata", metadata.ToString(Formatting.Indented)); } + /// + /// Gets the last screenshot taken by VRChat and retrieves its metadata. + /// public void GetLastScreenshot() { // Get the last screenshot taken by VRChat @@ -836,6 +1034,10 @@ namespace VRCX GetScreenshotMetadata(lastScreenshot); } + /// + /// Copies an image file to the clipboard if it exists and is of a supported image file type. + /// + /// The path to the image file to copy to the clipboard. public void CopyImageToClipboard(string path) { // check if the file exists and is any image file type @@ -849,6 +1051,9 @@ namespace VRCX } } + /// + /// Opens the folder containing user-defined shortcuts, if it exists. + /// public void OpenShortcutFolder() { var path = AutoAppLaunchManager.Instance.AppShortcutDirectory; @@ -858,6 +1063,11 @@ namespace VRCX OpenFolderAndSelectItem(path, true); } + /// + /// Opens the folder containing the specified file or folder path and selects the item in the folder. + /// + /// The path to the file or folder to select in the folder. + /// Whether the specified path is a folder or not. Defaults to false. public void OpenFolderAndSelectItem(string path, bool isFolder = false) { // I don't think it's quite meant for it, but SHOpenFolderAndSelectItems can open folders by passing the folder path as the item to select, as a child to itself, somehow. So we'll check to see if 'path' is a folder as well. @@ -901,11 +1111,17 @@ namespace VRCX } } + /// + /// Flashes the window of the main form. + /// public void FlashWindow() { MainForm.Instance.BeginInvoke(new MethodInvoker(() => { WinformThemer.Flash(MainForm.Instance); })); } + /// + /// Sets the user agent string for the browser. + /// public void SetUserAgent() { using (var client = MainForm.Instance.Browser.GetDevToolsClient()) diff --git a/AssetBundleCacher.cs b/AssetBundleCacher.cs index e92377ca..6d845b79 100644 --- a/AssetBundleCacher.cs +++ b/AssetBundleCacher.cs @@ -59,6 +59,12 @@ namespace VRCX return AppApi.Instance.GetVRChatCacheLocation(); } + /// + /// Gets the full location of the VRChat cache for a specific asset bundle. + /// + /// The ID of the asset bundle. + /// The version of the asset bundle. + /// The full location of the VRChat cache for the specified asset bundle. public string GetVRChatCacheFullLocation(string id, int version) { var cachePath = GetVRChatCacheLocation(); @@ -67,6 +73,12 @@ namespace VRCX return Path.Combine(cachePath, idHash, versionLocation); } + /// + /// Checks the VRChat cache for a specific asset bundle. + /// + /// The ID of the asset bundle. + /// The version of the asset bundle. + /// An array containing the file size and lock status of the asset bundle. public long[] CheckVRChatCache(string id, int version) { long FileSize = -1; @@ -155,6 +167,11 @@ namespace VRCX DownloadProgress = -16; } + /// + /// Deletes the cache directory for a specific asset bundle. + /// + /// The ID of the asset bundle to delete. + /// The version of the asset bundle to delete. public void DeleteCache(string id, int version) { var FullLocation = GetVRChatCacheFullLocation(id, version); @@ -162,6 +179,9 @@ namespace VRCX Directory.Delete(FullLocation, true); } + /// + /// Deletes the entire VRChat cache directory. + /// public void DeleteAllCache() { var cachePath = GetVRChatCacheLocation(); @@ -172,6 +192,9 @@ namespace VRCX } } + /// + /// Removes empty directories from the VRChat cache directory and deletes old versions of cached asset bundles. + /// public void SweepCache() { var cachePath = GetVRChatCacheLocation(); @@ -201,6 +224,10 @@ namespace VRCX } } + /// + /// Returns the size of the VRChat cache directory in bytes. + /// + /// The size of the VRChat cache directory in bytes. public long GetCacheSize() { var cachePath = GetVRChatCacheLocation(); @@ -214,6 +241,12 @@ namespace VRCX } } + + /// + /// Recursively calculates the size of a directory and all its subdirectories. + /// + /// The directory to calculate the size of. + /// The size of the directory and all its subdirectories in bytes. public long DirSize(DirectoryInfo d) { long size = 0; diff --git a/AutoAppLaunchManager.cs b/AutoAppLaunchManager.cs index 5dcb0191..c6d410a9 100644 --- a/AutoAppLaunchManager.cs +++ b/AutoAppLaunchManager.cs @@ -22,7 +22,7 @@ namespace VRCX private DateTime startTime = DateTime.Now; private Dictionary startedProcesses = new Dictionary(); - private static readonly byte[] shortcutSignatureBytes = { 0x4C, 0x00, 0x00, 0x00 }; // signature for ShellLinkHeader\ + private static readonly byte[] shortcutSignatureBytes = { 0x4C, 0x00, 0x00, 0x00 }; // signature for ShellLinkHeader private const uint TH32CS_SNAPPROCESS = 2; @@ -123,6 +123,11 @@ namespace VRCX // This is a recursive function that kills a process and all of its children. // It uses the CreateToolhelp32Snapshot winapi func to get a snapshot of all running processes, loops through them with Process32First/Process32Next, and kills any processes that have the given pid as their parent. + + /// + /// Kills a process and all of its child processes. + /// + /// The process ID of the parent process. public static void KillProcessTree(int pid) { IntPtr snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); diff --git a/LogWatcher.cs b/LogWatcher.cs index 67b49cb9..3103de06 100644 --- a/LogWatcher.cs +++ b/LogWatcher.cs @@ -14,6 +14,9 @@ using CefSharp; namespace VRCX { + /// + /// Monitors the VRChat log files for changes and provides access to the log data. + /// public class LogWatcher { public static readonly LogWatcher Instance; @@ -88,6 +91,9 @@ namespace VRCX } } + /// + /// Updates the log watcher by checking for new log files and updating the log list. + /// private void Update() { if (m_ResetLog) @@ -157,6 +163,11 @@ namespace VRCX m_FirstRun = false; } + /// + /// Parses the log file starting from the current position and updates the log context. + /// + /// The file information of the log file to parse. + /// The log context to update. private void ParseLog(FileInfo fileInfo, LogContext logContext) { try @@ -224,6 +235,7 @@ namespace VRCX ParseLogUsharpVideoPlay(fileInfo, logContext, line, offset) || ParseLogUsharpVideoSync(fileInfo, logContext, line, offset) || ParseLogWorldVRCX(fileInfo, logContext, line, offset) || + ParseLogWorldDataVRCX(fileInfo, logContext, line, offset) || ParseLogOnAudioConfigurationChanged(fileInfo, logContext, line, offset) || ParseLogScreenshot(fileInfo, logContext, line, offset) || ParseLogStringDownload(fileInfo, logContext, line, offset) || @@ -593,6 +605,19 @@ namespace VRCX return true; } + private bool ParseLogWorldDataVRCX(FileInfo fileInfo, LogContext logContext, string line, int offset) + { + // [VRCX-World] store:test:testvalue + + if (string.Compare(line, offset, "[VRCX-World] ", 0, 13, StringComparison.Ordinal) != 0) + return false; + + var data = line.Substring(offset + 13); + + WorldDBManager.Instance.ProcessLogWorldDataRequest(data); + return true; + } + private bool ParseLogVideoChange(FileInfo fileInfo, LogContext logContext, string line, int offset) { // 2021.04.20 13:37:69 Log - [Video Playback] Attempting to resolve URL 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' @@ -927,7 +952,7 @@ namespace VRCX private bool ParseOpenVRInit(FileInfo fileInfo, LogContext logContext, string line, int offset) { // 2022.07.29 02:52:14 Log - OpenVR initialized! - + // 2023.04.22 16:52:28 Log - Initializing VRSDK. // 2023.04.22 16:52:29 Log - StartVRSDK: Open VR Loader @@ -944,7 +969,7 @@ namespace VRCX return true; } - + private bool ParseDesktopMode(FileInfo fileInfo, LogContext logContext, string line, int offset) { // 2023.04.22 16:54:18 Log - VR Disabled diff --git a/Program.cs b/Program.cs index c784256f..47741085 100644 --- a/Program.cs +++ b/Program.cs @@ -6,6 +6,7 @@ using System; using System.IO; +using System.Threading.Tasks; using System.Windows.Forms; namespace VRCX @@ -78,8 +79,12 @@ namespace VRCX Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); + // I'll re-do this whole function eventually I swear + var worldDBServer = new WorldDBManager("http://127.0.0.1:22500/"); + Task.Run(worldDBServer.Start); + ProcessMonitor.Instance.Init(); - SQLite.Instance.Init(); + SQLiteLegacy.Instance.Init(); VRCXStorage.Load(); LoadFromConfig(); CpuMonitor.Instance.Init(); @@ -99,14 +104,18 @@ namespace VRCX AutoAppLaunchManager.Instance.Exit(); LogWatcher.Instance.Exit(); WebApi.Instance.Exit(); + worldDBServer.Stop(); Discord.Instance.Exit(); CpuMonitor.Instance.Exit(); VRCXStorage.Save(); - SQLite.Instance.Exit(); + SQLiteLegacy.Instance.Exit(); ProcessMonitor.Instance.Exit(); } + /// + /// Sets GPUFix to true if it is not already set and the VRCX_GPUFix key in the database is true. + /// private static void LoadFromConfig() { if (!GPUFix) diff --git a/SQLite.cs b/SQLite.cs index 5bd26aa8..3bfd1fd7 100644 --- a/SQLite.cs +++ b/SQLite.cs @@ -1,151 +1,4956 @@ -using CefSharp; +// +// Copyright (c) 2009-2021 Krueger Systems, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +#if WINDOWS_PHONE && !USE_WP8_NATIVE_SQLITE +#define USE_CSHARP_SQLITE +#endif + using System; +using System.Collections; +using System.Diagnostics; +#if !USE_SQLITEPCL_RAW +using System.Runtime.InteropServices; +#endif using System.Collections.Generic; -using System.Data.SQLite; -using System.IO; +using System.Reflection; +using System.Linq; +using System.Linq.Expressions; +using System.Text; using System.Threading; -namespace VRCX +#if USE_CSHARP_SQLITE +using Sqlite3 = Community.CsharpSqlite.Sqlite3; +using Sqlite3DatabaseHandle = Community.CsharpSqlite.Sqlite3.sqlite3; +using Sqlite3Statement = Community.CsharpSqlite.Sqlite3.Vdbe; +#elif USE_WP8_NATIVE_SQLITE +using Sqlite3 = Sqlite.Sqlite3; +using Sqlite3DatabaseHandle = Sqlite.Database; +using Sqlite3Statement = Sqlite.Statement; +#elif USE_SQLITEPCL_RAW +using Sqlite3DatabaseHandle = SQLitePCL.sqlite3; +using Sqlite3BackupHandle = SQLitePCL.sqlite3_backup; +using Sqlite3Statement = SQLitePCL.sqlite3_stmt; +using Sqlite3 = SQLitePCL.raw; +#else +using Sqlite3DatabaseHandle = System.IntPtr; +using Sqlite3BackupHandle = System.IntPtr; +using Sqlite3Statement = System.IntPtr; +#endif + +#pragma warning disable 1591 // XML Doc Comments + +namespace SQLite { - public class SQLite - { - public static readonly SQLite Instance; - private readonly ReaderWriterLockSlim m_ConnectionLock; - private readonly SQLiteConnection m_Connection; + public class SQLiteException : Exception + { + public SQLite3.Result Result { get; private set; } - static SQLite() + protected SQLiteException (SQLite3.Result r, string message) : base (message) + { + Result = r; + } + + public static SQLiteException New (SQLite3.Result r, string message) + { + return new SQLiteException (r, message); + } + } + + public class NotNullConstraintViolationException : SQLiteException + { + public IEnumerable Columns { get; protected set; } + + protected NotNullConstraintViolationException (SQLite3.Result r, string message) + : this (r, message, null, null) + { + + } + + protected NotNullConstraintViolationException (SQLite3.Result r, string message, TableMapping mapping, object obj) + : base (r, message) + { + if (mapping != null && obj != null) { + this.Columns = from c in mapping.Columns + where c.IsNullable == false && c.GetValue (obj) == null + select c; + } + } + + public static new NotNullConstraintViolationException New (SQLite3.Result r, string message) + { + return new NotNullConstraintViolationException (r, message); + } + + public static NotNullConstraintViolationException New (SQLite3.Result r, string message, TableMapping mapping, object obj) + { + return new NotNullConstraintViolationException (r, message, mapping, obj); + } + + public static NotNullConstraintViolationException New (SQLiteException exception, TableMapping mapping, object obj) + { + return new NotNullConstraintViolationException (exception.Result, exception.Message, mapping, obj); + } + } + + [Flags] + public enum SQLiteOpenFlags + { + ReadOnly = 1, ReadWrite = 2, Create = 4, + NoMutex = 0x8000, FullMutex = 0x10000, + SharedCache = 0x20000, PrivateCache = 0x40000, + ProtectionComplete = 0x00100000, + ProtectionCompleteUnlessOpen = 0x00200000, + ProtectionCompleteUntilFirstUserAuthentication = 0x00300000, + ProtectionNone = 0x00400000 + } + + [Flags] + public enum CreateFlags + { + /// + /// Use the default creation options + /// + None = 0x000, + /// + /// Create a primary key index for a property called 'Id' (case-insensitive). + /// This avoids the need for the [PrimaryKey] attribute. + /// + ImplicitPK = 0x001, + /// + /// Create indices for properties ending in 'Id' (case-insensitive). + /// + ImplicitIndex = 0x002, + /// + /// Create a primary key for a property called 'Id' and + /// create an indices for properties ending in 'Id' (case-insensitive). + /// + AllImplicit = 0x003, + /// + /// Force the primary key property to be auto incrementing. + /// This avoids the need for the [AutoIncrement] attribute. + /// The primary key property on the class should have type int or long. + /// + AutoIncPK = 0x004, + /// + /// Create virtual table using FTS3 + /// + FullTextSearch3 = 0x100, + /// + /// Create virtual table using FTS4 + /// + FullTextSearch4 = 0x200 + } + + public interface ISQLiteConnection + { + Sqlite3DatabaseHandle Handle { get; } + string DatabasePath { get; } + int LibVersionNumber { get; } + bool TimeExecution { get; set; } + bool Trace { get; set; } + Action Tracer { get; set; } + bool StoreDateTimeAsTicks { get; } + bool StoreTimeSpanAsTicks { get; } + string DateTimeStringFormat { get; } + TimeSpan BusyTimeout { get; set; } + IEnumerable TableMappings { get; } + bool IsInTransaction { get; } + + event EventHandler TableChanged; + + void Backup (string destinationDatabasePath, string databaseName = "main"); + void BeginTransaction (); + void Close (); + void Commit (); + SQLiteCommand CreateCommand (string cmdText, params object[] ps); + SQLiteCommand CreateCommand (string cmdText, Dictionary args); + int CreateIndex (string indexName, string tableName, string[] columnNames, bool unique = false); + int CreateIndex (string indexName, string tableName, string columnName, bool unique = false); + int CreateIndex (string tableName, string columnName, bool unique = false); + int CreateIndex (string tableName, string[] columnNames, bool unique = false); + int CreateIndex (Expression> property, bool unique = false); + CreateTableResult CreateTable (CreateFlags createFlags = CreateFlags.None); + CreateTableResult CreateTable (Type ty, CreateFlags createFlags = CreateFlags.None); + CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None) + where T : new() + where T2 : new(); + CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None) + where T : new() + where T2 : new() + where T3 : new(); + CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None) + where T : new() + where T2 : new() + where T3 : new() + where T4 : new(); + CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None) + where T : new() + where T2 : new() + where T3 : new() + where T4 : new() + where T5 : new(); + CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None, params Type[] types); + IEnumerable DeferredQuery (string query, params object[] args) where T : new(); + IEnumerable DeferredQuery (TableMapping map, string query, params object[] args); + int Delete (object objectToDelete); + int Delete (object primaryKey); + int Delete (object primaryKey, TableMapping map); + int DeleteAll (); + int DeleteAll (TableMapping map); + void Dispose (); + int DropTable (); + int DropTable (TableMapping map); + void EnableLoadExtension (bool enabled); + void EnableWriteAheadLogging (); + int Execute (string query, params object[] args); + T ExecuteScalar (string query, params object[] args); + T Find (object pk) where T : new(); + object Find (object pk, TableMapping map); + T Find (Expression> predicate) where T : new(); + T FindWithQuery (string query, params object[] args) where T : new(); + object FindWithQuery (TableMapping map, string query, params object[] args); + T Get (object pk) where T : new(); + object Get (object pk, TableMapping map); + T Get (Expression> predicate) where T : new(); + TableMapping GetMapping (Type type, CreateFlags createFlags = CreateFlags.None); + TableMapping GetMapping (CreateFlags createFlags = CreateFlags.None); + List GetTableInfo (string tableName); + int Insert (object obj); + int Insert (object obj, Type objType); + int Insert (object obj, string extra); + int Insert (object obj, string extra, Type objType); + int InsertAll (IEnumerable objects, bool runInTransaction = true); + int InsertAll (IEnumerable objects, string extra, bool runInTransaction = true); + int InsertAll (IEnumerable objects, Type objType, bool runInTransaction = true); + int InsertOrReplace (object obj); + int InsertOrReplace (object obj, Type objType); + List Query (string query, params object[] args) where T : new(); + List Query (TableMapping map, string query, params object[] args); + List QueryScalars (string query, params object[] args); + void Release (string savepoint); + void Rollback (); + void RollbackTo (string savepoint); + void RunInTransaction (Action action); + string SaveTransactionPoint (); + TableQuery Table () where T : new(); + int Update (object obj); + int Update (object obj, Type objType); + int UpdateAll (IEnumerable objects, bool runInTransaction = true); + } + + /// + /// An open connection to a SQLite database. + /// + [Preserve (AllMembers = true)] + public partial class SQLiteConnection : IDisposable + , ISQLiteConnection + { + private bool _open; + private TimeSpan _busyTimeout; + readonly static Dictionary _mappings = new Dictionary (); + private System.Diagnostics.Stopwatch _sw; + private long _elapsedMilliseconds = 0; + + private int _transactionDepth = 0; + private Random _rand = new Random (); + + public Sqlite3DatabaseHandle Handle { get; private set; } + static readonly Sqlite3DatabaseHandle NullHandle = default (Sqlite3DatabaseHandle); + static readonly Sqlite3BackupHandle NullBackupHandle = default (Sqlite3BackupHandle); + + /// + /// Gets the database path used by this connection. + /// + public string DatabasePath { get; private set; } + + /// + /// Gets the SQLite library version number. 3007014 would be v3.7.14 + /// + public int LibVersionNumber { get; private set; } + + /// + /// Whether Trace lines should be written that show the execution time of queries. + /// + public bool TimeExecution { get; set; } + + /// + /// Whether to write queries to during execution. + /// + public bool Trace { get; set; } + + /// + /// The delegate responsible for writing trace lines. + /// + /// The tracer. + public Action Tracer { get; set; } + + /// + /// Whether to store DateTime properties as ticks (true) or strings (false). + /// + public bool StoreDateTimeAsTicks { get; private set; } + + /// + /// Whether to store TimeSpan properties as ticks (true) or strings (false). + /// + public bool StoreTimeSpanAsTicks { get; private set; } + + /// + /// The format to use when storing DateTime properties as strings. Ignored if StoreDateTimeAsTicks is true. + /// + /// The date time string format. + public string DateTimeStringFormat { get; private set; } + + /// + /// The DateTimeStyles value to use when parsing a DateTime property string. + /// + /// The date time style. + internal System.Globalization.DateTimeStyles DateTimeStyle { get; private set; } + +#if USE_SQLITEPCL_RAW && !NO_SQLITEPCL_RAW_BATTERIES + static SQLiteConnection () + { + SQLitePCL.Batteries_V2.Init (); + } +#endif + + /// + /// Constructs a new SQLiteConnection and opens a SQLite database specified by databasePath. + /// + /// + /// Specifies the path to the database file. + /// + /// + /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You + /// absolutely do want to store them as Ticks in all new projects. The value of false is + /// only here for backwards compatibility. There is a *significant* speed advantage, with no + /// down sides, when setting storeDateTimeAsTicks = true. + /// If you use DateTimeOffset properties, it will be always stored as ticks regardingless + /// the storeDateTimeAsTicks parameter. + /// + public SQLiteConnection (string databasePath, bool storeDateTimeAsTicks = true) + : this (new SQLiteConnectionString (databasePath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create, storeDateTimeAsTicks)) + { + } + + /// + /// Constructs a new SQLiteConnection and opens a SQLite database specified by databasePath. + /// + /// + /// Specifies the path to the database file. + /// + /// + /// Flags controlling how the connection should be opened. + /// + /// + /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You + /// absolutely do want to store them as Ticks in all new projects. The value of false is + /// only here for backwards compatibility. There is a *significant* speed advantage, with no + /// down sides, when setting storeDateTimeAsTicks = true. + /// If you use DateTimeOffset properties, it will be always stored as ticks regardingless + /// the storeDateTimeAsTicks parameter. + /// + public SQLiteConnection (string databasePath, SQLiteOpenFlags openFlags, bool storeDateTimeAsTicks = true) + : this (new SQLiteConnectionString (databasePath, openFlags, storeDateTimeAsTicks)) + { + } + + /// + /// Constructs a new SQLiteConnection and opens a SQLite database specified by databasePath. + /// + /// + /// Details on how to find and open the database. + /// + public SQLiteConnection (SQLiteConnectionString connectionString) + { + if (connectionString == null) + throw new ArgumentNullException (nameof (connectionString)); + if (connectionString.DatabasePath == null) + throw new InvalidOperationException ("DatabasePath must be specified"); + + DatabasePath = connectionString.DatabasePath; + + LibVersionNumber = SQLite3.LibVersionNumber (); + +#if NETFX_CORE + SQLite3.SetDirectory(/*temp directory type*/2, Windows.Storage.ApplicationData.Current.TemporaryFolder.Path); +#endif + + Sqlite3DatabaseHandle handle; + +#if SILVERLIGHT || USE_CSHARP_SQLITE || USE_SQLITEPCL_RAW + var r = SQLite3.Open (connectionString.DatabasePath, out handle, (int)connectionString.OpenFlags, connectionString.VfsName); +#else + // open using the byte[] + // in the case where the path may include Unicode + // force open to using UTF-8 using sqlite3_open_v2 + var databasePathAsBytes = GetNullTerminatedUtf8 (connectionString.DatabasePath); + var r = SQLite3.Open (databasePathAsBytes, out handle, (int)connectionString.OpenFlags, connectionString.VfsName); +#endif + + Handle = handle; + if (r != SQLite3.Result.OK) { + throw SQLiteException.New (r, String.Format ("Could not open database file: {0} ({1})", DatabasePath, r)); + } + _open = true; + + StoreDateTimeAsTicks = connectionString.StoreDateTimeAsTicks; + StoreTimeSpanAsTicks = connectionString.StoreTimeSpanAsTicks; + DateTimeStringFormat = connectionString.DateTimeStringFormat; + DateTimeStyle = connectionString.DateTimeStyle; + + BusyTimeout = TimeSpan.FromSeconds (1.0); + Tracer = line => Debug.WriteLine (line); + + connectionString.PreKeyAction?.Invoke (this); + if (connectionString.Key is string stringKey) { + SetKey (stringKey); + } + else if (connectionString.Key is byte[] bytesKey) { + SetKey (bytesKey); + } + else if (connectionString.Key != null) { + throw new InvalidOperationException ("Encryption keys must be strings or byte arrays"); + } + connectionString.PostKeyAction?.Invoke (this); + } + + /// + /// Enables the write ahead logging. WAL is significantly faster in most scenarios + /// by providing better concurrency and better disk IO performance than the normal + /// journal mode. You only need to call this function once in the lifetime of the database. + /// + public void EnableWriteAheadLogging () + { + ExecuteScalar ("PRAGMA journal_mode=WAL"); + } + + /// + /// Convert an input string to a quoted SQL string that can be safely used in queries. + /// + /// The quoted string. + /// The unsafe string to quote. + static string Quote (string unsafeString) + { + // TODO: Doesn't call sqlite3_mprintf("%Q", u) because we're waiting on https://github.com/ericsink/SQLitePCL.raw/issues/153 + if (unsafeString == null) + return "NULL"; + var safe = unsafeString.Replace ("'", "''"); + return "'" + safe + "'"; + } + + /// + /// Sets the key used to encrypt/decrypt the database with "pragma key = ...". + /// This must be the first thing you call before doing anything else with this connection + /// if your database is encrypted. + /// This only has an effect if you are using the SQLCipher nuget package. + /// + /// Ecryption key plain text that is converted to the real encryption key using PBKDF2 key derivation + void SetKey (string key) + { + if (key == null) + throw new ArgumentNullException (nameof (key)); + var q = Quote (key); + ExecuteScalar ("pragma key = " + q); + } + + /// + /// Sets the key used to encrypt/decrypt the database. + /// This must be the first thing you call before doing anything else with this connection + /// if your database is encrypted. + /// This only has an effect if you are using the SQLCipher nuget package. + /// + /// 256-bit (32 byte) ecryption key data + void SetKey (byte[] key) + { + if (key == null) + throw new ArgumentNullException (nameof (key)); + if (key.Length != 32 && key.Length != 48) + throw new ArgumentException ("Key must be 32 bytes (256-bit) or 48 bytes (384-bit)", nameof (key)); + var s = String.Join ("", key.Select (x => x.ToString ("X2"))); + ExecuteScalar ("pragma key = \"x'" + s + "'\""); + } + + /// + /// Enable or disable extension loading. + /// + public void EnableLoadExtension (bool enabled) + { + SQLite3.Result r = SQLite3.EnableLoadExtension (Handle, enabled ? 1 : 0); + if (r != SQLite3.Result.OK) { + string msg = SQLite3.GetErrmsg (Handle); + throw SQLiteException.New (r, msg); + } + } + +#if !USE_SQLITEPCL_RAW + static byte[] GetNullTerminatedUtf8 (string s) + { + var utf8Length = System.Text.Encoding.UTF8.GetByteCount (s); + var bytes = new byte [utf8Length + 1]; + utf8Length = System.Text.Encoding.UTF8.GetBytes(s, 0, s.Length, bytes, 0); + return bytes; + } +#endif + + /// + /// Sets a busy handler to sleep the specified amount of time when a table is locked. + /// The handler will sleep multiple times until a total time of has accumulated. + /// + public TimeSpan BusyTimeout { + get { return _busyTimeout; } + set { + _busyTimeout = value; + if (Handle != NullHandle) { + SQLite3.BusyTimeout (Handle, (int)_busyTimeout.TotalMilliseconds); + } + } + } + + /// + /// Returns the mappings from types to tables that the connection + /// currently understands. + /// + public IEnumerable TableMappings { + get { + lock (_mappings) { + return new List (_mappings.Values); + } + } + } + + /// + /// Retrieves the mapping that is automatically generated for the given type. + /// + /// + /// The type whose mapping to the database is returned. + /// + /// + /// Optional flags allowing implicit PK and indexes based on naming conventions + /// + /// + /// The mapping represents the schema of the columns of the database and contains + /// methods to set and get properties of objects. + /// + public TableMapping GetMapping (Type type, CreateFlags createFlags = CreateFlags.None) + { + TableMapping map; + var key = type.FullName; + lock (_mappings) { + if (_mappings.TryGetValue (key, out map)) { + if (createFlags != CreateFlags.None && createFlags != map.CreateFlags) { + map = new TableMapping (type, createFlags); + _mappings[key] = map; + } + } + else { + map = new TableMapping (type, createFlags); + _mappings.Add (key, map); + } + } + return map; + } + + /// + /// Retrieves the mapping that is automatically generated for the given type. + /// + /// + /// Optional flags allowing implicit PK and indexes based on naming conventions + /// + /// + /// The mapping represents the schema of the columns of the database and contains + /// methods to set and get properties of objects. + /// + public TableMapping GetMapping (CreateFlags createFlags = CreateFlags.None) + { + return GetMapping (typeof (T), createFlags); + } + + private struct IndexedColumn + { + public int Order; + public string ColumnName; + } + + private struct IndexInfo + { + public string IndexName; + public string TableName; + public bool Unique; + public List Columns; + } + + /// + /// Executes a "drop table" on the database. This is non-recoverable. + /// + public int DropTable () + { + return DropTable (GetMapping (typeof (T))); + } + + /// + /// Executes a "drop table" on the database. This is non-recoverable. + /// + /// + /// The TableMapping used to identify the table. + /// + public int DropTable (TableMapping map) + { + var query = string.Format ("drop table if exists \"{0}\"", map.TableName); + return Execute (query); + } + + /// + /// Executes a "create table if not exists" on the database. It also + /// creates any specified indexes on the columns of the table. It uses + /// a schema automatically generated from the specified type. You can + /// later access this schema by calling GetMapping. + /// + /// + /// Whether the table was created or migrated. + /// + public CreateTableResult CreateTable (CreateFlags createFlags = CreateFlags.None) + { + return CreateTable (typeof (T), createFlags); + } + + /// + /// Executes a "create table if not exists" on the database. It also + /// creates any specified indexes on the columns of the table. It uses + /// a schema automatically generated from the specified type. You can + /// later access this schema by calling GetMapping. + /// + /// Type to reflect to a database table. + /// Optional flags allowing implicit PK and indexes based on naming conventions. + /// + /// Whether the table was created or migrated. + /// + public CreateTableResult CreateTable (Type ty, CreateFlags createFlags = CreateFlags.None) + { + var map = GetMapping (ty, createFlags); + + // Present a nice error if no columns specified + if (map.Columns.Length == 0) { + throw new Exception (string.Format ("Cannot create a table without columns (does '{0}' have public properties?)", ty.FullName)); + } + + // Check if the table exists + var result = CreateTableResult.Created; + var existingCols = GetTableInfo (map.TableName); + + // Create or migrate it + if (existingCols.Count == 0) { + + // Facilitate virtual tables a.k.a. full-text search. + bool fts3 = (createFlags & CreateFlags.FullTextSearch3) != 0; + bool fts4 = (createFlags & CreateFlags.FullTextSearch4) != 0; + bool fts = fts3 || fts4; + var @virtual = fts ? "virtual " : string.Empty; + var @using = fts3 ? "using fts3 " : fts4 ? "using fts4 " : string.Empty; + + // Build query. + var query = "create " + @virtual + "table if not exists \"" + map.TableName + "\" " + @using + "(\n"; + var decls = map.Columns.Select (p => Orm.SqlDecl (p, StoreDateTimeAsTicks, StoreTimeSpanAsTicks)); + var decl = string.Join (",\n", decls.ToArray ()); + query += decl; + query += ")"; + if (map.WithoutRowId) { + query += " without rowid"; + } + + Execute (query); + } + else { + result = CreateTableResult.Migrated; + MigrateTable (map, existingCols); + } + + var indexes = new Dictionary (); + foreach (var c in map.Columns) { + foreach (var i in c.Indices) { + var iname = i.Name ?? map.TableName + "_" + c.Name; + IndexInfo iinfo; + if (!indexes.TryGetValue (iname, out iinfo)) { + iinfo = new IndexInfo { + IndexName = iname, + TableName = map.TableName, + Unique = i.Unique, + Columns = new List () + }; + indexes.Add (iname, iinfo); + } + + if (i.Unique != iinfo.Unique) + throw new Exception ("All the columns in an index must have the same value for their Unique property"); + + iinfo.Columns.Add (new IndexedColumn { + Order = i.Order, + ColumnName = c.Name + }); + } + } + + foreach (var indexName in indexes.Keys) { + var index = indexes[indexName]; + var columns = index.Columns.OrderBy (i => i.Order).Select (i => i.ColumnName).ToArray (); + CreateIndex (indexName, index.TableName, columns, index.Unique); + } + + return result; + } + + /// + /// Executes a "create table if not exists" on the database for each type. It also + /// creates any specified indexes on the columns of the table. It uses + /// a schema automatically generated from the specified type. You can + /// later access this schema by calling GetMapping. + /// + /// + /// Whether the table was created or migrated for each type. + /// + public CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None) + where T : new() + where T2 : new() + { + return CreateTables (createFlags, typeof (T), typeof (T2)); + } + + /// + /// Executes a "create table if not exists" on the database for each type. It also + /// creates any specified indexes on the columns of the table. It uses + /// a schema automatically generated from the specified type. You can + /// later access this schema by calling GetMapping. + /// + /// + /// Whether the table was created or migrated for each type. + /// + public CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None) + where T : new() + where T2 : new() + where T3 : new() + { + return CreateTables (createFlags, typeof (T), typeof (T2), typeof (T3)); + } + + /// + /// Executes a "create table if not exists" on the database for each type. It also + /// creates any specified indexes on the columns of the table. It uses + /// a schema automatically generated from the specified type. You can + /// later access this schema by calling GetMapping. + /// + /// + /// Whether the table was created or migrated for each type. + /// + public CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None) + where T : new() + where T2 : new() + where T3 : new() + where T4 : new() + { + return CreateTables (createFlags, typeof (T), typeof (T2), typeof (T3), typeof (T4)); + } + + /// + /// Executes a "create table if not exists" on the database for each type. It also + /// creates any specified indexes on the columns of the table. It uses + /// a schema automatically generated from the specified type. You can + /// later access this schema by calling GetMapping. + /// + /// + /// Whether the table was created or migrated for each type. + /// + public CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None) + where T : new() + where T2 : new() + where T3 : new() + where T4 : new() + where T5 : new() + { + return CreateTables (createFlags, typeof (T), typeof (T2), typeof (T3), typeof (T4), typeof (T5)); + } + + /// + /// Executes a "create table if not exists" on the database for each type. It also + /// creates any specified indexes on the columns of the table. It uses + /// a schema automatically generated from the specified type. You can + /// later access this schema by calling GetMapping. + /// + /// + /// Whether the table was created or migrated for each type. + /// + public CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None, params Type[] types) + { + var result = new CreateTablesResult (); + foreach (Type type in types) { + var aResult = CreateTable (type, createFlags); + result.Results[type] = aResult; + } + return result; + } + + /// + /// Creates an index for the specified table and columns. + /// + /// Name of the index to create + /// Name of the database table + /// An array of column names to index + /// Whether the index should be unique + /// Zero on success. + public int CreateIndex (string indexName, string tableName, string[] columnNames, bool unique = false) + { + const string sqlFormat = "create {2} index if not exists \"{3}\" on \"{0}\"(\"{1}\")"; + var sql = String.Format (sqlFormat, tableName, string.Join ("\", \"", columnNames), unique ? "unique" : "", indexName); + return Execute (sql); + } + + /// + /// Creates an index for the specified table and column. + /// + /// Name of the index to create + /// Name of the database table + /// Name of the column to index + /// Whether the index should be unique + /// Zero on success. + public int CreateIndex (string indexName, string tableName, string columnName, bool unique = false) + { + return CreateIndex (indexName, tableName, new string[] { columnName }, unique); + } + + /// + /// Creates an index for the specified table and column. + /// + /// Name of the database table + /// Name of the column to index + /// Whether the index should be unique + /// Zero on success. + public int CreateIndex (string tableName, string columnName, bool unique = false) + { + return CreateIndex (tableName + "_" + columnName, tableName, columnName, unique); + } + + /// + /// Creates an index for the specified table and columns. + /// + /// Name of the database table + /// An array of column names to index + /// Whether the index should be unique + /// Zero on success. + public int CreateIndex (string tableName, string[] columnNames, bool unique = false) + { + return CreateIndex (tableName + "_" + string.Join ("_", columnNames), tableName, columnNames, unique); + } + + /// + /// Creates an index for the specified object property. + /// e.g. CreateIndex<Client>(c => c.Name); + /// + /// Type to reflect to a database table. + /// Property to index + /// Whether the index should be unique + /// Zero on success. + public int CreateIndex (Expression> property, bool unique = false) + { + MemberExpression mx; + if (property.Body.NodeType == ExpressionType.Convert) { + mx = ((UnaryExpression)property.Body).Operand as MemberExpression; + } + else { + mx = (property.Body as MemberExpression); + } + var propertyInfo = mx.Member as PropertyInfo; + if (propertyInfo == null) { + throw new ArgumentException ("The lambda expression 'property' should point to a valid Property"); + } + + var propName = propertyInfo.Name; + + var map = GetMapping (); + var colName = map.FindColumnWithPropertyName (propName).Name; + + return CreateIndex (map.TableName, colName, unique); + } + + [Preserve (AllMembers = true)] + public class ColumnInfo + { + // public int cid { get; set; } + + [Column ("name")] + public string Name { get; set; } + + // [Column ("type")] + // public string ColumnType { get; set; } + + public int notnull { get; set; } + + // public string dflt_value { get; set; } + + // public int pk { get; set; } + + public override string ToString () + { + return Name; + } + } + + /// + /// Query the built-in sqlite table_info table for a specific tables columns. + /// + /// The columns contains in the table. + /// Table name. + public List GetTableInfo (string tableName) + { + var query = "pragma table_info(\"" + tableName + "\")"; + return Query (query); + } + + void MigrateTable (TableMapping map, List existingCols) + { + var toBeAdded = new List (); + + foreach (var p in map.Columns) { + var found = false; + foreach (var c in existingCols) { + found = (string.Compare (p.Name, c.Name, StringComparison.OrdinalIgnoreCase) == 0); + if (found) + break; + } + if (!found) { + toBeAdded.Add (p); + } + } + + foreach (var p in toBeAdded) { + var addCol = "alter table \"" + map.TableName + "\" add column " + Orm.SqlDecl (p, StoreDateTimeAsTicks, StoreTimeSpanAsTicks); + Execute (addCol); + } + } + + /// + /// Creates a new SQLiteCommand. Can be overridden to provide a sub-class. + /// + /// + protected virtual SQLiteCommand NewCommand () + { + return new SQLiteCommand (this); + } + + /// + /// Creates a new SQLiteCommand given the command text with arguments. Place a '?' + /// in the command text for each of the arguments. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the command text. + /// + /// + /// A + /// + public SQLiteCommand CreateCommand (string cmdText, params object[] ps) + { + if (!_open) + throw SQLiteException.New (SQLite3.Result.Error, "Cannot create commands from unopened database"); + + var cmd = NewCommand (); + cmd.CommandText = cmdText; + foreach (var o in ps) { + cmd.Bind (o); + } + return cmd; + } + + /// + /// Creates a new SQLiteCommand given the command text with named arguments. Place a "[@:$]VVV" + /// in the command text for each of the arguments. VVV represents an alphanumeric identifier. + /// For example, @name :name and $name can all be used in the query. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of "[@:$]VVV" in the command text. + /// + /// + /// A + /// + public SQLiteCommand CreateCommand (string cmdText, Dictionary args) + { + if (!_open) + throw SQLiteException.New (SQLite3.Result.Error, "Cannot create commands from unopened database"); + + SQLiteCommand cmd = NewCommand (); + cmd.CommandText = cmdText; + foreach (var kv in args) { + cmd.Bind (kv.Key, kv.Value); + } + return cmd; + } + + /// + /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?' + /// in the command text for each of the arguments and then executes that command. + /// Use this method instead of Query when you don't expect rows back. Such cases include + /// INSERTs, UPDATEs, and DELETEs. + /// You can set the Trace or TimeExecution properties of the connection + /// to profile execution. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// The number of rows modified in the database as a result of this execution. + /// + public int Execute (string query, params object[] args) + { + var cmd = CreateCommand (query, args); + + if (TimeExecution) { + if (_sw == null) { + _sw = new Stopwatch (); + } + _sw.Reset (); + _sw.Start (); + } + + var r = cmd.ExecuteNonQuery (); + + if (TimeExecution) { + _sw.Stop (); + _elapsedMilliseconds += _sw.ElapsedMilliseconds; + Tracer?.Invoke (string.Format ("Finished in {0} ms ({1:0.0} s total)", _sw.ElapsedMilliseconds, _elapsedMilliseconds / 1000.0)); + } + + return r; + } + + /// + /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?' + /// in the command text for each of the arguments and then executes that command. + /// Use this method when return primitive values. + /// You can set the Trace or TimeExecution properties of the connection + /// to profile execution. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// The number of rows modified in the database as a result of this execution. + /// + public T ExecuteScalar (string query, params object[] args) + { + var cmd = CreateCommand (query, args); + + if (TimeExecution) { + if (_sw == null) { + _sw = new Stopwatch (); + } + _sw.Reset (); + _sw.Start (); + } + + var r = cmd.ExecuteScalar (); + + if (TimeExecution) { + _sw.Stop (); + _elapsedMilliseconds += _sw.ElapsedMilliseconds; + Tracer?.Invoke (string.Format ("Finished in {0} ms ({1:0.0} s total)", _sw.ElapsedMilliseconds, _elapsedMilliseconds / 1000.0)); + } + + return r; + } + + /// + /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?' + /// in the command text for each of the arguments and then executes that command. + /// It returns each row of the result using the mapping automatically generated for + /// the given type. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// An enumerable with one result for each row returned by the query. + /// + public List Query (string query, params object[] args) where T : new() + { + var cmd = CreateCommand (query, args); + return cmd.ExecuteQuery (); + } + + /// + /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?' + /// in the command text for each of the arguments and then executes that command. + /// It returns the first column of each row of the result. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// An enumerable with one result for the first column of each row returned by the query. + /// + public List QueryScalars (string query, params object[] args) + { + var cmd = CreateCommand (query, args); + return cmd.ExecuteQueryScalars ().ToList (); + } + + /// + /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?' + /// in the command text for each of the arguments and then executes that command. + /// It returns each row of the result using the mapping automatically generated for + /// the given type. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// An enumerable with one result for each row returned by the query. + /// The enumerator (retrieved by calling GetEnumerator() on the result of this method) + /// will call sqlite3_step on each call to MoveNext, so the database + /// connection must remain open for the lifetime of the enumerator. + /// + public IEnumerable DeferredQuery (string query, params object[] args) where T : new() + { + var cmd = CreateCommand (query, args); + return cmd.ExecuteDeferredQuery (); + } + + /// + /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?' + /// in the command text for each of the arguments and then executes that command. + /// It returns each row of the result using the specified mapping. This function is + /// only used by libraries in order to query the database via introspection. It is + /// normally not used. + /// + /// + /// A to use to convert the resulting rows + /// into objects. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// An enumerable with one result for each row returned by the query. + /// + public List Query (TableMapping map, string query, params object[] args) + { + var cmd = CreateCommand (query, args); + return cmd.ExecuteQuery (map); + } + + /// + /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?' + /// in the command text for each of the arguments and then executes that command. + /// It returns each row of the result using the specified mapping. This function is + /// only used by libraries in order to query the database via introspection. It is + /// normally not used. + /// + /// + /// A to use to convert the resulting rows + /// into objects. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// An enumerable with one result for each row returned by the query. + /// The enumerator (retrieved by calling GetEnumerator() on the result of this method) + /// will call sqlite3_step on each call to MoveNext, so the database + /// connection must remain open for the lifetime of the enumerator. + /// + public IEnumerable DeferredQuery (TableMapping map, string query, params object[] args) + { + var cmd = CreateCommand (query, args); + return cmd.ExecuteDeferredQuery (map); + } + + /// + /// Returns a queryable interface to the table represented by the given type. + /// + /// + /// A queryable object that is able to translate Where, OrderBy, and Take + /// queries into native SQL. + /// + public TableQuery Table () where T : new() + { + return new TableQuery (this); + } + + /// + /// Attempts to retrieve an object with the given primary key from the table + /// associated with the specified type. Use of this method requires that + /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute). + /// + /// + /// The primary key. + /// + /// + /// The object with the given primary key. Throws a not found exception + /// if the object is not found. + /// + public T Get (object pk) where T : new() + { + var map = GetMapping (typeof (T)); + return Query (map.GetByPrimaryKeySql, pk).First (); + } + + /// + /// Attempts to retrieve an object with the given primary key from the table + /// associated with the specified type. Use of this method requires that + /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute). + /// + /// + /// The primary key. + /// + /// + /// The TableMapping used to identify the table. + /// + /// + /// The object with the given primary key. Throws a not found exception + /// if the object is not found. + /// + public object Get (object pk, TableMapping map) + { + return Query (map, map.GetByPrimaryKeySql, pk).First (); + } + + /// + /// Attempts to retrieve the first object that matches the predicate from the table + /// associated with the specified type. + /// + /// + /// A predicate for which object to find. + /// + /// + /// The object that matches the given predicate. Throws a not found exception + /// if the object is not found. + /// + public T Get (Expression> predicate) where T : new() + { + return Table ().Where (predicate).First (); + } + + /// + /// Attempts to retrieve an object with the given primary key from the table + /// associated with the specified type. Use of this method requires that + /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute). + /// + /// + /// The primary key. + /// + /// + /// The object with the given primary key or null + /// if the object is not found. + /// + public T Find (object pk) where T : new() + { + var map = GetMapping (typeof (T)); + return Query (map.GetByPrimaryKeySql, pk).FirstOrDefault (); + } + + /// + /// Attempts to retrieve an object with the given primary key from the table + /// associated with the specified type. Use of this method requires that + /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute). + /// + /// + /// The primary key. + /// + /// + /// The TableMapping used to identify the table. + /// + /// + /// The object with the given primary key or null + /// if the object is not found. + /// + public object Find (object pk, TableMapping map) + { + return Query (map, map.GetByPrimaryKeySql, pk).FirstOrDefault (); + } + + /// + /// Attempts to retrieve the first object that matches the predicate from the table + /// associated with the specified type. + /// + /// + /// A predicate for which object to find. + /// + /// + /// The object that matches the given predicate or null + /// if the object is not found. + /// + public T Find (Expression> predicate) where T : new() + { + return Table ().Where (predicate).FirstOrDefault (); + } + + /// + /// Attempts to retrieve the first object that matches the query from the table + /// associated with the specified type. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// The object that matches the given predicate or null + /// if the object is not found. + /// + public T FindWithQuery (string query, params object[] args) where T : new() + { + return Query (query, args).FirstOrDefault (); + } + + /// + /// Attempts to retrieve the first object that matches the query from the table + /// associated with the specified type. + /// + /// + /// The TableMapping used to identify the table. + /// + /// + /// The fully escaped SQL. + /// + /// + /// Arguments to substitute for the occurences of '?' in the query. + /// + /// + /// The object that matches the given predicate or null + /// if the object is not found. + /// + public object FindWithQuery (TableMapping map, string query, params object[] args) + { + return Query (map, query, args).FirstOrDefault (); + } + + /// + /// Whether has been called and the database is waiting for a . + /// + public bool IsInTransaction { + get { return _transactionDepth > 0; } + } + + /// + /// Begins a new transaction. Call to end the transaction. + /// + /// Throws if a transaction has already begun. + public void BeginTransaction () + { + // The BEGIN command only works if the transaction stack is empty, + // or in other words if there are no pending transactions. + // If the transaction stack is not empty when the BEGIN command is invoked, + // then the command fails with an error. + // Rather than crash with an error, we will just ignore calls to BeginTransaction + // that would result in an error. + if (Interlocked.CompareExchange (ref _transactionDepth, 1, 0) == 0) { + try { + Execute ("begin transaction"); + } + catch (Exception ex) { + var sqlExp = ex as SQLiteException; + if (sqlExp != null) { + // It is recommended that applications respond to the errors listed below + // by explicitly issuing a ROLLBACK command. + // TODO: This rollback failsafe should be localized to all throw sites. + switch (sqlExp.Result) { + case SQLite3.Result.IOError: + case SQLite3.Result.Full: + case SQLite3.Result.Busy: + case SQLite3.Result.NoMem: + case SQLite3.Result.Interrupt: + RollbackTo (null, true); + break; + } + } + else { + // Call decrement and not VolatileWrite in case we've already + // created a transaction point in SaveTransactionPoint since the catch. + Interlocked.Decrement (ref _transactionDepth); + } + + throw; + } + } + else { + // Calling BeginTransaction on an already open transaction is invalid + throw new InvalidOperationException ("Cannot begin a transaction while already in a transaction."); + } + } + + /// + /// Creates a savepoint in the database at the current point in the transaction timeline. + /// Begins a new transaction if one is not in progress. + /// + /// Call to undo transactions since the returned savepoint. + /// Call to commit transactions after the savepoint returned here. + /// Call to end the transaction, committing all changes. + /// + /// A string naming the savepoint. + public string SaveTransactionPoint () + { + int depth = Interlocked.Increment (ref _transactionDepth) - 1; + string retVal = "S" + _rand.Next (short.MaxValue) + "D" + depth; + + try { + Execute ("savepoint " + retVal); + } + catch (Exception ex) { + var sqlExp = ex as SQLiteException; + if (sqlExp != null) { + // It is recommended that applications respond to the errors listed below + // by explicitly issuing a ROLLBACK command. + // TODO: This rollback failsafe should be localized to all throw sites. + switch (sqlExp.Result) { + case SQLite3.Result.IOError: + case SQLite3.Result.Full: + case SQLite3.Result.Busy: + case SQLite3.Result.NoMem: + case SQLite3.Result.Interrupt: + RollbackTo (null, true); + break; + } + } + else { + Interlocked.Decrement (ref _transactionDepth); + } + + throw; + } + + return retVal; + } + + /// + /// Rolls back the transaction that was begun by or . + /// + public void Rollback () + { + RollbackTo (null, false); + } + + /// + /// Rolls back the savepoint created by or SaveTransactionPoint. + /// + /// The name of the savepoint to roll back to, as returned by . If savepoint is null or empty, this method is equivalent to a call to + public void RollbackTo (string savepoint) + { + RollbackTo (savepoint, false); + } + + /// + /// Rolls back the transaction that was begun by . + /// + /// The name of the savepoint to roll back to, as returned by . If savepoint is null or empty, this method is equivalent to a call to + /// true to avoid throwing exceptions, false otherwise + void RollbackTo (string savepoint, bool noThrow) + { + // Rolling back without a TO clause rolls backs all transactions + // and leaves the transaction stack empty. + try { + if (String.IsNullOrEmpty (savepoint)) { + if (Interlocked.Exchange (ref _transactionDepth, 0) > 0) { + Execute ("rollback"); + } + } + else { + DoSavePointExecute (savepoint, "rollback to "); + } + } + catch (SQLiteException) { + if (!noThrow) + throw; + + } + // No need to rollback if there are no transactions open. + } + + /// + /// Releases a savepoint returned from . Releasing a savepoint + /// makes changes since that savepoint permanent if the savepoint began the transaction, + /// or otherwise the changes are permanent pending a call to . + /// + /// The RELEASE command is like a COMMIT for a SAVEPOINT. + /// + /// The name of the savepoint to release. The string should be the result of a call to + public void Release (string savepoint) + { + try { + DoSavePointExecute (savepoint, "release "); + } + catch (SQLiteException ex) { + if (ex.Result == SQLite3.Result.Busy) { + // Force a rollback since most people don't know this function can fail + // Don't call Rollback() since the _transactionDepth is 0 and it won't try + // Calling rollback makes our _transactionDepth variable correct. + // Writes to the database only happen at depth=0, so this failure will only happen then. + try { + Execute ("rollback"); + } + catch { + // rollback can fail in all sorts of wonderful version-dependent ways. Let's just hope for the best + } + } + throw; + } + } + + void DoSavePointExecute (string savepoint, string cmd) + { + // Validate the savepoint + int firstLen = savepoint.IndexOf ('D'); + if (firstLen >= 2 && savepoint.Length > firstLen + 1) { + int depth; + if (Int32.TryParse (savepoint.Substring (firstLen + 1), out depth)) { + // TODO: Mild race here, but inescapable without locking almost everywhere. + if (0 <= depth && depth < _transactionDepth) { +#if NETFX_CORE || USE_SQLITEPCL_RAW || NETCORE + Volatile.Write (ref _transactionDepth, depth); +#elif SILVERLIGHT + _transactionDepth = depth; +#else + Thread.VolatileWrite (ref _transactionDepth, depth); +#endif + Execute (cmd + savepoint); + return; + } + } + } + + throw new ArgumentException ("savePoint is not valid, and should be the result of a call to SaveTransactionPoint.", "savePoint"); + } + + /// + /// Commits the transaction that was begun by . + /// + public void Commit () + { + if (Interlocked.Exchange (ref _transactionDepth, 0) != 0) { + try { + Execute ("commit"); + } + catch { + // Force a rollback since most people don't know this function can fail + // Don't call Rollback() since the _transactionDepth is 0 and it won't try + // Calling rollback makes our _transactionDepth variable correct. + try { + Execute ("rollback"); + } + catch { + // rollback can fail in all sorts of wonderful version-dependent ways. Let's just hope for the best + } + throw; + } + } + // Do nothing on a commit with no open transaction + } + + /// + /// Executes within a (possibly nested) transaction by wrapping it in a SAVEPOINT. If an + /// exception occurs the whole transaction is rolled back, not just the current savepoint. The exception + /// is rethrown. + /// + /// + /// The to perform within a transaction. can contain any number + /// of operations on the connection but should never call or + /// . + /// + public void RunInTransaction (Action action) + { + try { + var savePoint = SaveTransactionPoint (); + action (); + Release (savePoint); + } + catch (Exception) { + Rollback (); + throw; + } + } + + /// + /// Inserts all specified objects. + /// + /// + /// An of the objects to insert. + /// + /// A boolean indicating if the inserts should be wrapped in a transaction. + /// + /// + /// The number of rows added to the table. + /// + public int InsertAll (System.Collections.IEnumerable objects, bool runInTransaction = true) + { + var c = 0; + if (runInTransaction) { + RunInTransaction (() => { + foreach (var r in objects) { + c += Insert (r); + } + }); + } + else { + foreach (var r in objects) { + c += Insert (r); + } + } + return c; + } + + /// + /// Inserts all specified objects. + /// + /// + /// An of the objects to insert. + /// + /// + /// Literal SQL code that gets placed into the command. INSERT {extra} INTO ... + /// + /// + /// A boolean indicating if the inserts should be wrapped in a transaction. + /// + /// + /// The number of rows added to the table. + /// + public int InsertAll (System.Collections.IEnumerable objects, string extra, bool runInTransaction = true) + { + var c = 0; + if (runInTransaction) { + RunInTransaction (() => { + foreach (var r in objects) { + c += Insert (r, extra); + } + }); + } + else { + foreach (var r in objects) { + c += Insert (r, extra); + } + } + return c; + } + + /// + /// Inserts all specified objects. + /// + /// + /// An of the objects to insert. + /// + /// + /// The type of object to insert. + /// + /// + /// A boolean indicating if the inserts should be wrapped in a transaction. + /// + /// + /// The number of rows added to the table. + /// + public int InsertAll (System.Collections.IEnumerable objects, Type objType, bool runInTransaction = true) + { + var c = 0; + if (runInTransaction) { + RunInTransaction (() => { + foreach (var r in objects) { + c += Insert (r, objType); + } + }); + } + else { + foreach (var r in objects) { + c += Insert (r, objType); + } + } + return c; + } + + /// + /// Inserts the given object (and updates its + /// auto incremented primary key if it has one). + /// The return value is the number of rows added to the table. + /// + /// + /// The object to insert. + /// + /// + /// The number of rows added to the table. + /// + public int Insert (object obj) + { + if (obj == null) { + return 0; + } + return Insert (obj, "", Orm.GetType (obj)); + } + + /// + /// Inserts the given object (and updates its + /// auto incremented primary key if it has one). + /// The return value is the number of rows added to the table. + /// If a UNIQUE constraint violation occurs with + /// some pre-existing object, this function deletes + /// the old object. + /// + /// + /// The object to insert. + /// + /// + /// The number of rows modified. + /// + public int InsertOrReplace (object obj) + { + if (obj == null) { + return 0; + } + return Insert (obj, "OR REPLACE", Orm.GetType (obj)); + } + + /// + /// Inserts the given object (and updates its + /// auto incremented primary key if it has one). + /// The return value is the number of rows added to the table. + /// + /// + /// The object to insert. + /// + /// + /// The type of object to insert. + /// + /// + /// The number of rows added to the table. + /// + public int Insert (object obj, Type objType) + { + return Insert (obj, "", objType); + } + + /// + /// Inserts the given object (and updates its + /// auto incremented primary key if it has one). + /// The return value is the number of rows added to the table. + /// If a UNIQUE constraint violation occurs with + /// some pre-existing object, this function deletes + /// the old object. + /// + /// + /// The object to insert. + /// + /// + /// The type of object to insert. + /// + /// + /// The number of rows modified. + /// + public int InsertOrReplace (object obj, Type objType) + { + return Insert (obj, "OR REPLACE", objType); + } + + /// + /// Inserts the given object (and updates its + /// auto incremented primary key if it has one). + /// The return value is the number of rows added to the table. + /// + /// + /// The object to insert. + /// + /// + /// Literal SQL code that gets placed into the command. INSERT {extra} INTO ... + /// + /// + /// The number of rows added to the table. + /// + public int Insert (object obj, string extra) + { + if (obj == null) { + return 0; + } + return Insert (obj, extra, Orm.GetType (obj)); + } + + /// + /// Inserts the given object (and updates its + /// auto incremented primary key if it has one). + /// The return value is the number of rows added to the table. + /// + /// + /// The object to insert. + /// + /// + /// Literal SQL code that gets placed into the command. INSERT {extra} INTO ... + /// + /// + /// The type of object to insert. + /// + /// + /// The number of rows added to the table. + /// + public int Insert (object obj, string extra, Type objType) + { + if (obj == null || objType == null) { + return 0; + } + + var map = GetMapping (objType); + + if (map.PK != null && map.PK.IsAutoGuid) { + if (map.PK.GetValue (obj).Equals (Guid.Empty)) { + map.PK.SetValue (obj, Guid.NewGuid ()); + } + } + + var replacing = string.Compare (extra, "OR REPLACE", StringComparison.OrdinalIgnoreCase) == 0; + + var cols = replacing ? map.InsertOrReplaceColumns : map.InsertColumns; + var vals = new object[cols.Length]; + for (var i = 0; i < vals.Length; i++) { + vals[i] = cols[i].GetValue (obj); + } + + var insertCmd = GetInsertCommand (map, extra); + int count; + + lock (insertCmd) { + // We lock here to protect the prepared statement returned via GetInsertCommand. + // A SQLite prepared statement can be bound for only one operation at a time. + try { + count = insertCmd.ExecuteNonQuery (vals); + } + catch (SQLiteException ex) { + if (SQLite3.ExtendedErrCode (this.Handle) == SQLite3.ExtendedResult.ConstraintNotNull) { + throw NotNullConstraintViolationException.New (ex.Result, ex.Message, map, obj); + } + throw; + } + + if (map.HasAutoIncPK) { + var id = SQLite3.LastInsertRowid (Handle); + map.SetAutoIncPK (obj, id); + } + } + if (count > 0) + OnTableChanged (map, NotifyTableChangedAction.Insert); + + return count; + } + + readonly Dictionary, PreparedSqlLiteInsertCommand> _insertCommandMap = new Dictionary, PreparedSqlLiteInsertCommand> (); + + PreparedSqlLiteInsertCommand GetInsertCommand (TableMapping map, string extra) + { + PreparedSqlLiteInsertCommand prepCmd; + + var key = Tuple.Create (map.MappedType.FullName, extra); + + lock (_insertCommandMap) { + if (_insertCommandMap.TryGetValue (key, out prepCmd)) { + return prepCmd; + } + } + + prepCmd = CreateInsertCommand (map, extra); + + lock (_insertCommandMap) { + if (_insertCommandMap.TryGetValue (key, out var existing)) { + prepCmd.Dispose (); + return existing; + } + + _insertCommandMap.Add (key, prepCmd); + } + + return prepCmd; + } + + PreparedSqlLiteInsertCommand CreateInsertCommand (TableMapping map, string extra) + { + var cols = map.InsertColumns; + string insertSql; + if (cols.Length == 0 && map.Columns.Length == 1 && map.Columns[0].IsAutoInc) { + insertSql = string.Format ("insert {1} into \"{0}\" default values", map.TableName, extra); + } + else { + var replacing = string.Compare (extra, "OR REPLACE", StringComparison.OrdinalIgnoreCase) == 0; + + if (replacing) { + cols = map.InsertOrReplaceColumns; + } + + insertSql = string.Format ("insert {3} into \"{0}\"({1}) values ({2})", map.TableName, + string.Join (",", (from c in cols + select "\"" + c.Name + "\"").ToArray ()), + string.Join (",", (from c in cols + select "?").ToArray ()), extra); + + } + + var insertCommand = new PreparedSqlLiteInsertCommand (this, insertSql); + return insertCommand; + } + + /// + /// Updates all of the columns of a table using the specified object + /// except for its primary key. + /// The object is required to have a primary key. + /// + /// + /// The object to update. It must have a primary key designated using the PrimaryKeyAttribute. + /// + /// + /// The number of rows updated. + /// + public int Update (object obj) + { + if (obj == null) { + return 0; + } + return Update (obj, Orm.GetType (obj)); + } + + /// + /// Updates all of the columns of a table using the specified object + /// except for its primary key. + /// The object is required to have a primary key. + /// + /// + /// The object to update. It must have a primary key designated using the PrimaryKeyAttribute. + /// + /// + /// The type of object to insert. + /// + /// + /// The number of rows updated. + /// + public int Update (object obj, Type objType) + { + int rowsAffected = 0; + if (obj == null || objType == null) { + return 0; + } + + var map = GetMapping (objType); + + var pk = map.PK; + + if (pk == null) { + throw new NotSupportedException ("Cannot update " + map.TableName + ": it has no PK"); + } + + var cols = from p in map.Columns + where p != pk + select p; + var vals = from c in cols + select c.GetValue (obj); + var ps = new List (vals); + if (ps.Count == 0) { + // There is a PK but no accompanying data, + // so reset the PK to make the UPDATE work. + cols = map.Columns; + vals = from c in cols + select c.GetValue (obj); + ps = new List (vals); + } + ps.Add (pk.GetValue (obj)); + var q = string.Format ("update \"{0}\" set {1} where \"{2}\" = ? ", map.TableName, string.Join (",", (from c in cols + select "\"" + c.Name + "\" = ? ").ToArray ()), pk.Name); + + try { + rowsAffected = Execute (q, ps.ToArray ()); + } + catch (SQLiteException ex) { + + if (ex.Result == SQLite3.Result.Constraint && SQLite3.ExtendedErrCode (this.Handle) == SQLite3.ExtendedResult.ConstraintNotNull) { + throw NotNullConstraintViolationException.New (ex, map, obj); + } + + throw ex; + } + + if (rowsAffected > 0) + OnTableChanged (map, NotifyTableChangedAction.Update); + + return rowsAffected; + } + + /// + /// Updates all specified objects. + /// + /// + /// An of the objects to insert. + /// + /// + /// A boolean indicating if the inserts should be wrapped in a transaction + /// + /// + /// The number of rows modified. + /// + public int UpdateAll (System.Collections.IEnumerable objects, bool runInTransaction = true) + { + var c = 0; + if (runInTransaction) { + RunInTransaction (() => { + foreach (var r in objects) { + c += Update (r); + } + }); + } + else { + foreach (var r in objects) { + c += Update (r); + } + } + return c; + } + + /// + /// Deletes the given object from the database using its primary key. + /// + /// + /// The object to delete. It must have a primary key designated using the PrimaryKeyAttribute. + /// + /// + /// The number of rows deleted. + /// + public int Delete (object objectToDelete) + { + var map = GetMapping (Orm.GetType (objectToDelete)); + var pk = map.PK; + if (pk == null) { + throw new NotSupportedException ("Cannot delete " + map.TableName + ": it has no PK"); + } + var q = string.Format ("delete from \"{0}\" where \"{1}\" = ?", map.TableName, pk.Name); + var count = Execute (q, pk.GetValue (objectToDelete)); + if (count > 0) + OnTableChanged (map, NotifyTableChangedAction.Delete); + return count; + } + + /// + /// Deletes the object with the specified primary key. + /// + /// + /// The primary key of the object to delete. + /// + /// + /// The number of objects deleted. + /// + /// + /// The type of object. + /// + public int Delete (object primaryKey) + { + return Delete (primaryKey, GetMapping (typeof (T))); + } + + /// + /// Deletes the object with the specified primary key. + /// + /// + /// The primary key of the object to delete. + /// + /// + /// The TableMapping used to identify the table. + /// + /// + /// The number of objects deleted. + /// + public int Delete (object primaryKey, TableMapping map) + { + var pk = map.PK; + if (pk == null) { + throw new NotSupportedException ("Cannot delete " + map.TableName + ": it has no PK"); + } + var q = string.Format ("delete from \"{0}\" where \"{1}\" = ?", map.TableName, pk.Name); + var count = Execute (q, primaryKey); + if (count > 0) + OnTableChanged (map, NotifyTableChangedAction.Delete); + return count; + } + + /// + /// Deletes all the objects from the specified table. + /// WARNING WARNING: Let me repeat. It deletes ALL the objects from the + /// specified table. Do you really want to do that? + /// + /// + /// The number of objects deleted. + /// + /// + /// The type of objects to delete. + /// + public int DeleteAll () + { + var map = GetMapping (typeof (T)); + return DeleteAll (map); + } + + /// + /// Deletes all the objects from the specified table. + /// WARNING WARNING: Let me repeat. It deletes ALL the objects from the + /// specified table. Do you really want to do that? + /// + /// + /// The TableMapping used to identify the table. + /// + /// + /// The number of objects deleted. + /// + public int DeleteAll (TableMapping map) + { + var query = string.Format ("delete from \"{0}\"", map.TableName); + var count = Execute (query); + if (count > 0) + OnTableChanged (map, NotifyTableChangedAction.Delete); + return count; + } + + /// + /// Backup the entire database to the specified path. + /// + /// Path to backup file. + /// The name of the database to backup (usually "main"). + public void Backup (string destinationDatabasePath, string databaseName = "main") + { + // Open the destination + var r = SQLite3.Open (destinationDatabasePath, out var destHandle); + if (r != SQLite3.Result.OK) { + throw SQLiteException.New (r, "Failed to open destination database"); + } + + // Init the backup + var backup = SQLite3.BackupInit (destHandle, databaseName, Handle, databaseName); + if (backup == NullBackupHandle) { + SQLite3.Close (destHandle); + throw new Exception ("Failed to create backup"); + } + + // Perform it + SQLite3.BackupStep (backup, -1); + SQLite3.BackupFinish (backup); + + // Check for errors + r = SQLite3.GetResult (destHandle); + string msg = ""; + if (r != SQLite3.Result.OK) { + msg = SQLite3.GetErrmsg (destHandle); + } + + // Close everything and report errors + SQLite3.Close (destHandle); + if (r != SQLite3.Result.OK) { + throw SQLiteException.New (r, msg); + } + } + + ~SQLiteConnection () + { + Dispose (false); + } + + public void Dispose () + { + Dispose (true); + GC.SuppressFinalize (this); + } + + public void Close () + { + Dispose (true); + } + + protected virtual void Dispose (bool disposing) + { + var useClose2 = LibVersionNumber >= 3007014; + + if (_open && Handle != NullHandle) { + try { + if (disposing) { + lock (_insertCommandMap) { + foreach (var sqlInsertCommand in _insertCommandMap.Values) { + sqlInsertCommand.Dispose (); + } + _insertCommandMap.Clear (); + } + + var r = useClose2 ? SQLite3.Close2 (Handle) : SQLite3.Close (Handle); + if (r != SQLite3.Result.OK) { + string msg = SQLite3.GetErrmsg (Handle); + throw SQLiteException.New (r, msg); + } + } + else { + var r = useClose2 ? SQLite3.Close2 (Handle) : SQLite3.Close (Handle); + } + } + finally { + Handle = NullHandle; + _open = false; + } + } + } + + void OnTableChanged (TableMapping table, NotifyTableChangedAction action) + { + var ev = TableChanged; + if (ev != null) + ev (this, new NotifyTableChangedEventArgs (table, action)); + } + + public event EventHandler TableChanged; + } + + public class NotifyTableChangedEventArgs : EventArgs + { + public TableMapping Table { get; private set; } + public NotifyTableChangedAction Action { get; private set; } + + public NotifyTableChangedEventArgs (TableMapping table, NotifyTableChangedAction action) + { + Table = table; + Action = action; + } + } + + public enum NotifyTableChangedAction + { + Insert, + Update, + Delete, + } + + /// + /// Represents a parsed connection string. + /// + public class SQLiteConnectionString + { + const string DateTimeSqliteDefaultFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff"; + + public string UniqueKey { get; } + public string DatabasePath { get; } + public bool StoreDateTimeAsTicks { get; } + public bool StoreTimeSpanAsTicks { get; } + public string DateTimeStringFormat { get; } + public System.Globalization.DateTimeStyles DateTimeStyle { get; } + public object Key { get; } + public SQLiteOpenFlags OpenFlags { get; } + public Action PreKeyAction { get; } + public Action PostKeyAction { get; } + public string VfsName { get; } + +#if NETFX_CORE + static readonly string MetroStyleDataPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path; + + public static readonly string[] InMemoryDbPaths = new[] { - Instance = new SQLite(); + ":memory:", + "file::memory:" + }; + + public static bool IsInMemoryPath(string databasePath) + { + return InMemoryDbPaths.Any(i => i.Equals(databasePath, StringComparison.OrdinalIgnoreCase)); } - public SQLite() - { - m_ConnectionLock = new ReaderWriterLockSlim(); +#endif - var dataSource = Program.ConfigLocation; - m_Connection = new SQLiteConnection($"Data Source=\"{dataSource}\";Version=3;PRAGMA locking_mode=NORMAL;PRAGMA busy_timeout=5000", true); - } + /// + /// Constructs a new SQLiteConnectionString with all the data needed to open an SQLiteConnection. + /// + /// + /// Specifies the path to the database file. + /// + /// + /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You + /// absolutely do want to store them as Ticks in all new projects. The value of false is + /// only here for backwards compatibility. There is a *significant* speed advantage, with no + /// down sides, when setting storeDateTimeAsTicks = true. + /// If you use DateTimeOffset properties, it will be always stored as ticks regardingless + /// the storeDateTimeAsTicks parameter. + /// + public SQLiteConnectionString (string databasePath, bool storeDateTimeAsTicks = true) + : this (databasePath, SQLiteOpenFlags.Create | SQLiteOpenFlags.ReadWrite, storeDateTimeAsTicks) + { + } - internal void Init() - { - m_Connection.Open(); - } + /// + /// Constructs a new SQLiteConnectionString with all the data needed to open an SQLiteConnection. + /// + /// + /// Specifies the path to the database file. + /// + /// + /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You + /// absolutely do want to store them as Ticks in all new projects. The value of false is + /// only here for backwards compatibility. There is a *significant* speed advantage, with no + /// down sides, when setting storeDateTimeAsTicks = true. + /// If you use DateTimeOffset properties, it will be always stored as ticks regardingless + /// the storeDateTimeAsTicks parameter. + /// + /// + /// Specifies the encryption key to use on the database. Should be a string or a byte[]. + /// + /// + /// Executes prior to setting key for SQLCipher databases + /// + /// + /// Executes after setting key for SQLCipher databases + /// + /// + /// Specifies the Virtual File System to use on the database. + /// + public SQLiteConnectionString (string databasePath, bool storeDateTimeAsTicks, object key = null, Action preKeyAction = null, Action postKeyAction = null, string vfsName = null) + : this (databasePath, SQLiteOpenFlags.Create | SQLiteOpenFlags.ReadWrite, storeDateTimeAsTicks, key, preKeyAction, postKeyAction, vfsName) + { + } - internal void Exit() - { - m_Connection.Close(); - m_Connection.Dispose(); - } + /// + /// Constructs a new SQLiteConnectionString with all the data needed to open an SQLiteConnection. + /// + /// + /// Specifies the path to the database file. + /// + /// + /// Flags controlling how the connection should be opened. + /// + /// + /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You + /// absolutely do want to store them as Ticks in all new projects. The value of false is + /// only here for backwards compatibility. There is a *significant* speed advantage, with no + /// down sides, when setting storeDateTimeAsTicks = true. + /// If you use DateTimeOffset properties, it will be always stored as ticks regardingless + /// the storeDateTimeAsTicks parameter. + /// + /// + /// Specifies the encryption key to use on the database. Should be a string or a byte[]. + /// + /// + /// Executes prior to setting key for SQLCipher databases + /// + /// + /// Executes after setting key for SQLCipher databases + /// + /// + /// Specifies the Virtual File System to use on the database. + /// + /// + /// Specifies the format to use when storing DateTime properties as strings. + /// + /// + /// Specifies whether to store TimeSpan properties as ticks (true) or strings (false). You + /// absolutely do want to store them as Ticks in all new projects. The value of false is + /// only here for backwards compatibility. There is a *significant* speed advantage, with no + /// down sides, when setting storeTimeSpanAsTicks = true. + /// + public SQLiteConnectionString (string databasePath, SQLiteOpenFlags openFlags, bool storeDateTimeAsTicks, object key = null, Action preKeyAction = null, Action postKeyAction = null, string vfsName = null, string dateTimeStringFormat = DateTimeSqliteDefaultFormat, bool storeTimeSpanAsTicks = true) + { + if (key != null && !((key is byte[]) || (key is string))) + throw new ArgumentException ("Encryption keys must be strings or byte arrays", nameof (key)); - public void Execute(IJavascriptCallback callback, string sql, IDictionary args = null) - { - try - { - m_ConnectionLock.EnterReadLock(); - try - { - using (var command = new SQLiteCommand(sql, m_Connection)) - { - if (args != null) - { - foreach (var arg in args) - { - command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value)); - } - } - using (var reader = command.ExecuteReader()) - { - while (reader.Read() == true) - { - var values = new object[reader.FieldCount]; - reader.GetValues(values); - if (callback.CanExecute == true) - { - callback.ExecuteAsync(null, values); - } - } - } - } - if (callback.CanExecute == true) - { - callback.ExecuteAsync(null, null); - } - } - finally - { - m_ConnectionLock.ExitReadLock(); - } - } - catch (Exception e) - { - if (callback.CanExecute == true) - { - callback.ExecuteAsync(e.Message, null); - } - } + UniqueKey = string.Format ("{0}_{1:X8}", databasePath, (uint)openFlags); + StoreDateTimeAsTicks = storeDateTimeAsTicks; + StoreTimeSpanAsTicks = storeTimeSpanAsTicks; + DateTimeStringFormat = dateTimeStringFormat; + DateTimeStyle = "o".Equals (DateTimeStringFormat, StringComparison.OrdinalIgnoreCase) || "r".Equals (DateTimeStringFormat, StringComparison.OrdinalIgnoreCase) ? System.Globalization.DateTimeStyles.RoundtripKind : System.Globalization.DateTimeStyles.None; + Key = key; + PreKeyAction = preKeyAction; + PostKeyAction = postKeyAction; + OpenFlags = openFlags; + VfsName = vfsName; - callback.Dispose(); - } +#if NETFX_CORE + DatabasePath = IsInMemoryPath(databasePath) + ? databasePath + : System.IO.Path.Combine(MetroStyleDataPath, databasePath); - public void Execute(Action callback, string sql, IDictionary args = null) - { - m_ConnectionLock.EnterReadLock(); - try - { - using (var command = new SQLiteCommand(sql, m_Connection)) - { - if (args != null) - { - foreach (var arg in args) - { - command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value)); - } - } - using (var reader = command.ExecuteReader()) - { - while (reader.Read() == true) - { - var values = new object[reader.FieldCount]; - reader.GetValues(values); - callback(values); - } - } - } - } - catch - { - } - finally - { - m_ConnectionLock.ExitReadLock(); - } - } +#else + DatabasePath = databasePath; +#endif + } + } - public int ExecuteNonQuery(string sql, IDictionary args = null) - { - int result = -1; + [AttributeUsage (AttributeTargets.Class)] + public class TableAttribute : Attribute + { + public string Name { get; set; } - m_ConnectionLock.EnterWriteLock(); - try - { - using (var command = new SQLiteCommand(sql, m_Connection)) - { - if (args != null) - { - foreach (var arg in args) - { - command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value)); - } - } - result = command.ExecuteNonQuery(); - } - } - finally - { - m_ConnectionLock.ExitWriteLock(); - } + /// + /// Flag whether to create the table without rowid (see https://sqlite.org/withoutrowid.html) + /// + /// The default is false so that sqlite adds an implicit rowid to every table created. + /// + public bool WithoutRowId { get; set; } - return result; - } - } + public TableAttribute (string name) + { + Name = name; + } + } + + [AttributeUsage (AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public string Name { get; set; } + + public ColumnAttribute (string name) + { + Name = name; + } + } + + [AttributeUsage (AttributeTargets.Property)] + public class PrimaryKeyAttribute : Attribute + { + } + + [AttributeUsage (AttributeTargets.Property)] + public class AutoIncrementAttribute : Attribute + { + } + + [AttributeUsage (AttributeTargets.Property)] + public class IndexedAttribute : Attribute + { + public string Name { get; set; } + public int Order { get; set; } + public virtual bool Unique { get; set; } + + public IndexedAttribute () + { + } + + public IndexedAttribute (string name, int order) + { + Name = name; + Order = order; + } + } + + [AttributeUsage (AttributeTargets.Property)] + public class IgnoreAttribute : Attribute + { + } + + [AttributeUsage (AttributeTargets.Property)] + public class UniqueAttribute : IndexedAttribute + { + public override bool Unique { + get { return true; } + set { /* throw? */ } + } + } + + [AttributeUsage (AttributeTargets.Property)] + public class MaxLengthAttribute : Attribute + { + public int Value { get; private set; } + + public MaxLengthAttribute (int length) + { + Value = length; + } + } + + public sealed class PreserveAttribute : System.Attribute + { + public bool AllMembers; + public bool Conditional; + } + + /// + /// Select the collating sequence to use on a column. + /// "BINARY", "NOCASE", and "RTRIM" are supported. + /// "BINARY" is the default. + /// + [AttributeUsage (AttributeTargets.Property)] + public class CollationAttribute : Attribute + { + public string Value { get; private set; } + + public CollationAttribute (string collation) + { + Value = collation; + } + } + + [AttributeUsage (AttributeTargets.Property)] + public class NotNullAttribute : Attribute + { + } + + [AttributeUsage (AttributeTargets.Enum)] + public class StoreAsTextAttribute : Attribute + { + } + + public class TableMapping + { + public Type MappedType { get; private set; } + + public string TableName { get; private set; } + + public bool WithoutRowId { get; private set; } + + public Column[] Columns { get; private set; } + + public Column PK { get; private set; } + + public string GetByPrimaryKeySql { get; private set; } + + public CreateFlags CreateFlags { get; private set; } + + internal MapMethod Method { get; private set; } = MapMethod.ByName; + + readonly Column _autoPk; + readonly Column[] _insertColumns; + readonly Column[] _insertOrReplaceColumns; + + public TableMapping (Type type, CreateFlags createFlags = CreateFlags.None) + { + MappedType = type; + CreateFlags = createFlags; + + var typeInfo = type.GetTypeInfo (); +#if ENABLE_IL2CPP + var tableAttr = typeInfo.GetCustomAttribute (); +#else + var tableAttr = + typeInfo.CustomAttributes + .Where (x => x.AttributeType == typeof (TableAttribute)) + .Select (x => (TableAttribute)Orm.InflateAttribute (x)) + .FirstOrDefault (); +#endif + + TableName = (tableAttr != null && !string.IsNullOrEmpty (tableAttr.Name)) ? tableAttr.Name : MappedType.Name; + WithoutRowId = tableAttr != null ? tableAttr.WithoutRowId : false; + + var members = GetPublicMembers(type); + var cols = new List(members.Count); + foreach(var m in members) + { + var ignore = m.IsDefined(typeof(IgnoreAttribute), true); + if(!ignore) + cols.Add(new Column(m, createFlags)); + } + Columns = cols.ToArray (); + foreach (var c in Columns) { + if (c.IsAutoInc && c.IsPK) { + _autoPk = c; + } + if (c.IsPK) { + PK = c; + } + } + + HasAutoIncPK = _autoPk != null; + + if (PK != null) { + GetByPrimaryKeySql = string.Format ("select * from \"{0}\" where \"{1}\" = ?", TableName, PK.Name); + } + else { + // People should not be calling Get/Find without a PK + GetByPrimaryKeySql = string.Format ("select * from \"{0}\" limit 1", TableName); + } + + _insertColumns = Columns.Where (c => !c.IsAutoInc).ToArray (); + _insertOrReplaceColumns = Columns.ToArray (); + } + + private IReadOnlyCollection GetPublicMembers(Type type) + { + if(type.Name.StartsWith("ValueTuple`")) + return GetFieldsFromValueTuple(type); + + var members = new List(); + var memberNames = new HashSet(); + var newMembers = new List(); + do + { + var ti = type.GetTypeInfo(); + newMembers.Clear(); + + newMembers.AddRange( + from p in ti.DeclaredProperties + where !memberNames.Contains(p.Name) && + p.CanRead && p.CanWrite && + p.GetMethod != null && p.SetMethod != null && + p.GetMethod.IsPublic && p.SetMethod.IsPublic && + !p.GetMethod.IsStatic && !p.SetMethod.IsStatic + select p); + + members.AddRange(newMembers); + foreach(var m in newMembers) + memberNames.Add(m.Name); + + type = ti.BaseType; + } + while(type != typeof(object)); + + return members; + } + + private IReadOnlyCollection GetFieldsFromValueTuple(Type type) + { + Method = MapMethod.ByPosition; + var fields = type.GetFields(); + + // https://docs.microsoft.com/en-us/dotnet/api/system.valuetuple-8.rest + if(fields.Length >= 8) + throw new NotSupportedException("ValueTuple with more than 7 members not supported due to nesting; see https://docs.microsoft.com/en-us/dotnet/api/system.valuetuple-8.rest"); + + return fields; + } + + public bool HasAutoIncPK { get; private set; } + + public void SetAutoIncPK (object obj, long id) + { + if (_autoPk != null) { + _autoPk.SetValue (obj, Convert.ChangeType (id, _autoPk.ColumnType, null)); + } + } + + public Column[] InsertColumns { + get { + return _insertColumns; + } + } + + public Column[] InsertOrReplaceColumns { + get { + return _insertOrReplaceColumns; + } + } + + public Column FindColumnWithPropertyName (string propertyName) + { + var exact = Columns.FirstOrDefault (c => c.PropertyName == propertyName); + return exact; + } + + public Column FindColumn (string columnName) + { + if(Method != MapMethod.ByName) + throw new InvalidOperationException($"This {nameof(TableMapping)} is not mapped by name, but {Method}."); + + var exact = Columns.FirstOrDefault (c => c.Name.ToLower () == columnName.ToLower ()); + return exact; + } + + public class Column + { + MemberInfo _member; + + public string Name { get; private set; } + + public PropertyInfo PropertyInfo => _member as PropertyInfo; + + public string PropertyName { get { return _member.Name; } } + + public Type ColumnType { get; private set; } + + public string Collation { get; private set; } + + public bool IsAutoInc { get; private set; } + public bool IsAutoGuid { get; private set; } + + public bool IsPK { get; private set; } + + public IEnumerable Indices { get; set; } + + public bool IsNullable { get; private set; } + + public int? MaxStringLength { get; private set; } + + public bool StoreAsText { get; private set; } + + public Column (MemberInfo member, CreateFlags createFlags = CreateFlags.None) + { + _member = member; + var memberType = GetMemberType(member); + + var colAttr = member.CustomAttributes.FirstOrDefault (x => x.AttributeType == typeof (ColumnAttribute)); +#if ENABLE_IL2CPP + var ca = member.GetCustomAttribute(typeof(ColumnAttribute)) as ColumnAttribute; + Name = ca == null ? member.Name : ca.Name; +#else + Name = (colAttr != null && colAttr.ConstructorArguments.Count > 0) ? + colAttr.ConstructorArguments[0].Value?.ToString () : + member.Name; +#endif + //If this type is Nullable then Nullable.GetUnderlyingType returns the T, otherwise it returns null, so get the actual type instead + ColumnType = Nullable.GetUnderlyingType (memberType) ?? memberType; + Collation = Orm.Collation (member); + + IsPK = Orm.IsPK (member) || + (((createFlags & CreateFlags.ImplicitPK) == CreateFlags.ImplicitPK) && + string.Compare (member.Name, Orm.ImplicitPkName, StringComparison.OrdinalIgnoreCase) == 0); + + var isAuto = Orm.IsAutoInc (member) || (IsPK && ((createFlags & CreateFlags.AutoIncPK) == CreateFlags.AutoIncPK)); + IsAutoGuid = isAuto && ColumnType == typeof (Guid); + IsAutoInc = isAuto && !IsAutoGuid; + + Indices = Orm.GetIndices (member); + if (!Indices.Any () + && !IsPK + && ((createFlags & CreateFlags.ImplicitIndex) == CreateFlags.ImplicitIndex) + && Name.EndsWith (Orm.ImplicitIndexSuffix, StringComparison.OrdinalIgnoreCase) + ) { + Indices = new IndexedAttribute[] { new IndexedAttribute () }; + } + IsNullable = !(IsPK || Orm.IsMarkedNotNull (member)); + MaxStringLength = Orm.MaxStringLength (member); + + StoreAsText = memberType.GetTypeInfo ().CustomAttributes.Any (x => x.AttributeType == typeof (StoreAsTextAttribute)); + } + + public Column (PropertyInfo member, CreateFlags createFlags = CreateFlags.None) + : this((MemberInfo)member, createFlags) + { } + + public void SetValue (object obj, object val) + { + if(_member is PropertyInfo propy) + { + if (val != null && ColumnType.GetTypeInfo ().IsEnum) + propy.SetValue (obj, Enum.ToObject (ColumnType, val)); + else + propy.SetValue (obj, val); + } + else if(_member is FieldInfo field) + { + if (val != null && ColumnType.GetTypeInfo ().IsEnum) + field.SetValue (obj, Enum.ToObject (ColumnType, val)); + else + field.SetValue (obj, val); + } + else + throw new InvalidProgramException("unreachable condition"); + } + + public object GetValue (object obj) + { + if(_member is PropertyInfo propy) + return propy.GetValue(obj); + else if(_member is FieldInfo field) + return field.GetValue(obj); + else + throw new InvalidProgramException("unreachable condition"); + } + + private static Type GetMemberType(MemberInfo m) + { + switch(m.MemberType) + { + case MemberTypes.Property: return ((PropertyInfo)m).PropertyType; + case MemberTypes.Field: return ((FieldInfo)m).FieldType; + default: throw new InvalidProgramException($"{nameof(TableMapping)} supports properties or fields only."); + } + } + } + + internal enum MapMethod + { + ByName, + ByPosition + } + } + + class EnumCacheInfo + { + public EnumCacheInfo (Type type) + { + var typeInfo = type.GetTypeInfo (); + + IsEnum = typeInfo.IsEnum; + + if (IsEnum) { + StoreAsText = typeInfo.CustomAttributes.Any (x => x.AttributeType == typeof (StoreAsTextAttribute)); + + if (StoreAsText) { + EnumValues = new Dictionary (); + foreach (object e in Enum.GetValues (type)) { + EnumValues[Convert.ToInt32 (e)] = e.ToString (); + } + } + } + } + + public bool IsEnum { get; private set; } + + public bool StoreAsText { get; private set; } + + public Dictionary EnumValues { get; private set; } + } + + static class EnumCache + { + static readonly Dictionary Cache = new Dictionary (); + + public static EnumCacheInfo GetInfo () + { + return GetInfo (typeof (T)); + } + + public static EnumCacheInfo GetInfo (Type type) + { + lock (Cache) { + EnumCacheInfo info = null; + if (!Cache.TryGetValue (type, out info)) { + info = new EnumCacheInfo (type); + Cache[type] = info; + } + + return info; + } + } + } + + public static class Orm + { + public const int DefaultMaxStringLength = 140; + public const string ImplicitPkName = "Id"; + public const string ImplicitIndexSuffix = "Id"; + + public static Type GetType (object obj) + { + if (obj == null) + return typeof (object); + var rt = obj as IReflectableType; + if (rt != null) + return rt.GetTypeInfo ().AsType (); + return obj.GetType (); + } + + public static string SqlDecl (TableMapping.Column p, bool storeDateTimeAsTicks, bool storeTimeSpanAsTicks) + { + string decl = "\"" + p.Name + "\" " + SqlType (p, storeDateTimeAsTicks, storeTimeSpanAsTicks) + " "; + + if (p.IsPK) { + decl += "primary key "; + } + if (p.IsAutoInc) { + decl += "autoincrement "; + } + if (!p.IsNullable) { + decl += "not null "; + } + if (!string.IsNullOrEmpty (p.Collation)) { + decl += "collate " + p.Collation + " "; + } + + return decl; + } + + public static string SqlType (TableMapping.Column p, bool storeDateTimeAsTicks, bool storeTimeSpanAsTicks) + { + var clrType = p.ColumnType; + if (clrType == typeof (Boolean) || clrType == typeof (Byte) || clrType == typeof (UInt16) || clrType == typeof (SByte) || clrType == typeof (Int16) || clrType == typeof (Int32) || clrType == typeof (UInt32) || clrType == typeof (Int64)) { + return "integer"; + } + else if (clrType == typeof (Single) || clrType == typeof (Double) || clrType == typeof (Decimal)) { + return "float"; + } + else if (clrType == typeof (String) || clrType == typeof (StringBuilder) || clrType == typeof (Uri) || clrType == typeof (UriBuilder)) { + int? len = p.MaxStringLength; + + if (len.HasValue) + return "varchar(" + len.Value + ")"; + + return "varchar"; + } + else if (clrType == typeof (TimeSpan)) { + return storeTimeSpanAsTicks ? "bigint" : "time"; + } + else if (clrType == typeof (DateTime)) { + return storeDateTimeAsTicks ? "bigint" : "datetime"; + } + else if (clrType == typeof (DateTimeOffset)) { + return "bigint"; + } + else if (clrType.GetTypeInfo ().IsEnum) { + if (p.StoreAsText) + return "varchar"; + else + return "integer"; + } + else if (clrType == typeof (byte[])) { + return "blob"; + } + else if (clrType == typeof (Guid)) { + return "varchar(36)"; + } + else { + throw new NotSupportedException ("Don't know about " + clrType); + } + } + + public static bool IsPK (MemberInfo p) + { + return p.CustomAttributes.Any (x => x.AttributeType == typeof (PrimaryKeyAttribute)); + } + + public static string Collation (MemberInfo p) + { +#if ENABLE_IL2CPP + return (p.GetCustomAttribute ()?.Value) ?? ""; +#else + return + (p.CustomAttributes + .Where (x => typeof (CollationAttribute) == x.AttributeType) + .Select (x => { + var args = x.ConstructorArguments; + return args.Count > 0 ? ((args[0].Value as string) ?? "") : ""; + }) + .FirstOrDefault ()) ?? ""; +#endif + } + + public static bool IsAutoInc (MemberInfo p) + { + return p.CustomAttributes.Any (x => x.AttributeType == typeof (AutoIncrementAttribute)); + } + + public static FieldInfo GetField (TypeInfo t, string name) + { + var f = t.GetDeclaredField (name); + if (f != null) + return f; + return GetField (t.BaseType.GetTypeInfo (), name); + } + + public static PropertyInfo GetProperty (TypeInfo t, string name) + { + var f = t.GetDeclaredProperty (name); + if (f != null) + return f; + return GetProperty (t.BaseType.GetTypeInfo (), name); + } + + public static object InflateAttribute (CustomAttributeData x) + { + var atype = x.AttributeType; + var typeInfo = atype.GetTypeInfo (); +#if ENABLE_IL2CPP + var r = Activator.CreateInstance (x.AttributeType); +#else + var args = x.ConstructorArguments.Select (a => a.Value).ToArray (); + var r = Activator.CreateInstance (x.AttributeType, args); + foreach (var arg in x.NamedArguments) { + if (arg.IsField) { + GetField (typeInfo, arg.MemberName).SetValue (r, arg.TypedValue.Value); + } + else { + GetProperty (typeInfo, arg.MemberName).SetValue (r, arg.TypedValue.Value); + } + } +#endif + return r; + } + + public static IEnumerable GetIndices (MemberInfo p) + { +#if ENABLE_IL2CPP + return p.GetCustomAttributes (); +#else + var indexedInfo = typeof (IndexedAttribute).GetTypeInfo (); + return + p.CustomAttributes + .Where (x => indexedInfo.IsAssignableFrom (x.AttributeType.GetTypeInfo ())) + .Select (x => (IndexedAttribute)InflateAttribute (x)); +#endif + } + + public static int? MaxStringLength (MemberInfo p) + { +#if ENABLE_IL2CPP + return p.GetCustomAttribute ()?.Value; +#else + var attr = p.CustomAttributes.FirstOrDefault (x => x.AttributeType == typeof (MaxLengthAttribute)); + if (attr != null) { + var attrv = (MaxLengthAttribute)InflateAttribute (attr); + return attrv.Value; + } + return null; +#endif + } + + public static int? MaxStringLength (PropertyInfo p) => MaxStringLength((MemberInfo)p); + + public static bool IsMarkedNotNull (MemberInfo p) + { + return p.CustomAttributes.Any (x => x.AttributeType == typeof (NotNullAttribute)); + } + } + + public partial class SQLiteCommand + { + SQLiteConnection _conn; + private List _bindings; + + public string CommandText { get; set; } + + public SQLiteCommand (SQLiteConnection conn) + { + _conn = conn; + _bindings = new List (); + CommandText = ""; + } + + public int ExecuteNonQuery () + { + if (_conn.Trace) { + _conn.Tracer?.Invoke ("Executing: " + this); + } + + var r = SQLite3.Result.OK; + var stmt = Prepare (); + r = SQLite3.Step (stmt); + Finalize (stmt); + if (r == SQLite3.Result.Done) { + int rowsAffected = SQLite3.Changes (_conn.Handle); + return rowsAffected; + } + else if (r == SQLite3.Result.Error) { + string msg = SQLite3.GetErrmsg (_conn.Handle); + throw SQLiteException.New (r, msg); + } + else if (r == SQLite3.Result.Constraint) { + if (SQLite3.ExtendedErrCode (_conn.Handle) == SQLite3.ExtendedResult.ConstraintNotNull) { + throw NotNullConstraintViolationException.New (r, SQLite3.GetErrmsg (_conn.Handle)); + } + } + + throw SQLiteException.New (r, SQLite3.GetErrmsg (_conn.Handle)); + } + + public IEnumerable ExecuteDeferredQuery () + { + return ExecuteDeferredQuery (_conn.GetMapping (typeof (T))); + } + + public List ExecuteQuery () + { + return ExecuteDeferredQuery (_conn.GetMapping (typeof (T))).ToList (); + } + + public List ExecuteQuery (TableMapping map) + { + return ExecuteDeferredQuery (map).ToList (); + } + + /// + /// Invoked every time an instance is loaded from the database. + /// + /// + /// The newly created object. + /// + /// + /// This can be overridden in combination with the + /// method to hook into the life-cycle of objects. + /// + protected virtual void OnInstanceCreated (object obj) + { + // Can be overridden. + } + + public IEnumerable ExecuteDeferredQuery (TableMapping map) + { + if (_conn.Trace) { + _conn.Tracer?.Invoke ("Executing Query: " + this); + } + + var stmt = Prepare (); + try { + var cols = new TableMapping.Column[SQLite3.ColumnCount (stmt)]; + var fastColumnSetters = new Action[SQLite3.ColumnCount (stmt)]; + + if (map.Method == TableMapping.MapMethod.ByPosition) + { + Array.Copy(map.Columns, cols, Math.Min(cols.Length, map.Columns.Length)); + } + else if (map.Method == TableMapping.MapMethod.ByName) { + MethodInfo getSetter = null; + if (typeof(T) != map.MappedType) { + getSetter = typeof(FastColumnSetter) + .GetMethod (nameof(FastColumnSetter.GetFastSetter), + BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod (map.MappedType); + } + + for (int i = 0; i < cols.Length; i++) { + var name = SQLite3.ColumnName16 (stmt, i); + cols[i] = map.FindColumn (name); + if (cols[i] != null) + if (getSetter != null) { + fastColumnSetters[i] = (Action)getSetter.Invoke(null, new object[]{ _conn, cols[i]}); + } + else { + fastColumnSetters[i] = FastColumnSetter.GetFastSetter(_conn, cols[i]); + } + } + } + + while (SQLite3.Step (stmt) == SQLite3.Result.Row) { + var obj = Activator.CreateInstance (map.MappedType); + for (int i = 0; i < cols.Length; i++) { + if (cols[i] == null) + continue; + + if (fastColumnSetters[i] != null) { + fastColumnSetters[i].Invoke (obj, stmt, i); + } + else { + var colType = SQLite3.ColumnType (stmt, i); + var val = ReadCol (stmt, i, colType, cols[i].ColumnType); + cols[i].SetValue (obj, val); + } + } + OnInstanceCreated (obj); + yield return (T)obj; + } + } + finally { + SQLite3.Finalize (stmt); + } + } + + public T ExecuteScalar () + { + if (_conn.Trace) { + _conn.Tracer?.Invoke ("Executing Query: " + this); + } + + T val = default (T); + + var stmt = Prepare (); + + try { + var r = SQLite3.Step (stmt); + if (r == SQLite3.Result.Row) { + var colType = SQLite3.ColumnType (stmt, 0); + var colval = ReadCol (stmt, 0, colType, typeof (T)); + if (colval != null) { + val = (T)colval; + } + } + else if (r == SQLite3.Result.Done) { + } + else { + throw SQLiteException.New (r, SQLite3.GetErrmsg (_conn.Handle)); + } + } + finally { + Finalize (stmt); + } + + return val; + } + + public IEnumerable ExecuteQueryScalars () + { + if (_conn.Trace) { + _conn.Tracer?.Invoke ("Executing Query: " + this); + } + var stmt = Prepare (); + try { + if (SQLite3.ColumnCount (stmt) < 1) { + throw new InvalidOperationException ("QueryScalars should return at least one column"); + } + while (SQLite3.Step (stmt) == SQLite3.Result.Row) { + var colType = SQLite3.ColumnType (stmt, 0); + var val = ReadCol (stmt, 0, colType, typeof (T)); + if (val == null) { + yield return default (T); + } + else { + yield return (T)val; + } + } + } + finally { + Finalize (stmt); + } + } + + public void Bind (string name, object val) + { + _bindings.Add (new Binding { + Name = name, + Value = val + }); + } + + public void Bind (object val) + { + Bind (null, val); + } + + public override string ToString () + { + var parts = new string[1 + _bindings.Count]; + parts[0] = CommandText; + var i = 1; + foreach (var b in _bindings) { + parts[i] = string.Format (" {0}: {1}", i - 1, b.Value); + i++; + } + return string.Join (Environment.NewLine, parts); + } + + Sqlite3Statement Prepare () + { + var stmt = SQLite3.Prepare2 (_conn.Handle, CommandText); + BindAll (stmt); + return stmt; + } + + void Finalize (Sqlite3Statement stmt) + { + SQLite3.Finalize (stmt); + } + + void BindAll (Sqlite3Statement stmt) + { + int nextIdx = 1; + foreach (var b in _bindings) { + if (b.Name != null) { + b.Index = SQLite3.BindParameterIndex (stmt, b.Name); + } + else { + b.Index = nextIdx++; + } + + BindParameter (stmt, b.Index, b.Value, _conn.StoreDateTimeAsTicks, _conn.DateTimeStringFormat, _conn.StoreTimeSpanAsTicks); + } + } + + static IntPtr NegativePointer = new IntPtr (-1); + + internal static void BindParameter (Sqlite3Statement stmt, int index, object value, bool storeDateTimeAsTicks, string dateTimeStringFormat, bool storeTimeSpanAsTicks) + { + if (value == null) { + SQLite3.BindNull (stmt, index); + } + else { + if (value is Int32) { + SQLite3.BindInt (stmt, index, (int)value); + } + else if (value is String) { + SQLite3.BindText (stmt, index, (string)value, -1, NegativePointer); + } + else if (value is Byte || value is UInt16 || value is SByte || value is Int16) { + SQLite3.BindInt (stmt, index, Convert.ToInt32 (value)); + } + else if (value is Boolean) { + SQLite3.BindInt (stmt, index, (bool)value ? 1 : 0); + } + else if (value is UInt32 || value is Int64) { + SQLite3.BindInt64 (stmt, index, Convert.ToInt64 (value)); + } + else if (value is Single || value is Double || value is Decimal) { + SQLite3.BindDouble (stmt, index, Convert.ToDouble (value)); + } + else if (value is TimeSpan) { + if (storeTimeSpanAsTicks) { + SQLite3.BindInt64 (stmt, index, ((TimeSpan)value).Ticks); + } + else { + SQLite3.BindText (stmt, index, ((TimeSpan)value).ToString (), -1, NegativePointer); + } + } + else if (value is DateTime) { + if (storeDateTimeAsTicks) { + SQLite3.BindInt64 (stmt, index, ((DateTime)value).Ticks); + } + else { + SQLite3.BindText (stmt, index, ((DateTime)value).ToString (dateTimeStringFormat, System.Globalization.CultureInfo.InvariantCulture), -1, NegativePointer); + } + } + else if (value is DateTimeOffset) { + SQLite3.BindInt64 (stmt, index, ((DateTimeOffset)value).UtcTicks); + } + else if (value is byte[]) { + SQLite3.BindBlob (stmt, index, (byte[])value, ((byte[])value).Length, NegativePointer); + } + else if (value is Guid) { + SQLite3.BindText (stmt, index, ((Guid)value).ToString (), 72, NegativePointer); + } + else if (value is Uri) { + SQLite3.BindText (stmt, index, ((Uri)value).ToString (), -1, NegativePointer); + } + else if (value is StringBuilder) { + SQLite3.BindText (stmt, index, ((StringBuilder)value).ToString (), -1, NegativePointer); + } + else if (value is UriBuilder) { + SQLite3.BindText (stmt, index, ((UriBuilder)value).ToString (), -1, NegativePointer); + } + else { + // Now we could possibly get an enum, retrieve cached info + var valueType = value.GetType (); + var enumInfo = EnumCache.GetInfo (valueType); + if (enumInfo.IsEnum) { + var enumIntValue = Convert.ToInt32 (value); + if (enumInfo.StoreAsText) + SQLite3.BindText (stmt, index, enumInfo.EnumValues[enumIntValue], -1, NegativePointer); + else + SQLite3.BindInt (stmt, index, enumIntValue); + } + else { + throw new NotSupportedException ("Cannot store type: " + Orm.GetType (value)); + } + } + } + } + + class Binding + { + public string Name { get; set; } + + public object Value { get; set; } + + public int Index { get; set; } + } + + object ReadCol (Sqlite3Statement stmt, int index, SQLite3.ColType type, Type clrType) + { + if (type == SQLite3.ColType.Null) { + return null; + } + else { + var clrTypeInfo = clrType.GetTypeInfo (); + if (clrTypeInfo.IsGenericType && clrTypeInfo.GetGenericTypeDefinition () == typeof (Nullable<>)) { + clrType = clrTypeInfo.GenericTypeArguments[0]; + clrTypeInfo = clrType.GetTypeInfo (); + } + + if (clrType == typeof (String)) { + return SQLite3.ColumnString (stmt, index); + } + else if (clrType == typeof (Int32)) { + return (int)SQLite3.ColumnInt (stmt, index); + } + else if (clrType == typeof (Boolean)) { + return SQLite3.ColumnInt (stmt, index) == 1; + } + else if (clrType == typeof (double)) { + return SQLite3.ColumnDouble (stmt, index); + } + else if (clrType == typeof (float)) { + return (float)SQLite3.ColumnDouble (stmt, index); + } + else if (clrType == typeof (TimeSpan)) { + if (_conn.StoreTimeSpanAsTicks) { + return new TimeSpan (SQLite3.ColumnInt64 (stmt, index)); + } + else { + var text = SQLite3.ColumnString (stmt, index); + TimeSpan resultTime; + if (!TimeSpan.TryParseExact (text, "c", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.TimeSpanStyles.None, out resultTime)) { + resultTime = TimeSpan.Parse (text); + } + return resultTime; + } + } + else if (clrType == typeof (DateTime)) { + if (_conn.StoreDateTimeAsTicks) { + return new DateTime (SQLite3.ColumnInt64 (stmt, index)); + } + else { + var text = SQLite3.ColumnString (stmt, index); + DateTime resultDate; + if (!DateTime.TryParseExact (text, _conn.DateTimeStringFormat, System.Globalization.CultureInfo.InvariantCulture, _conn.DateTimeStyle, out resultDate)) { + resultDate = DateTime.Parse (text); + } + return resultDate; + } + } + else if (clrType == typeof (DateTimeOffset)) { + return new DateTimeOffset (SQLite3.ColumnInt64 (stmt, index), TimeSpan.Zero); + } + else if (clrTypeInfo.IsEnum) { + if (type == SQLite3.ColType.Text) { + var value = SQLite3.ColumnString (stmt, index); + return Enum.Parse (clrType, value.ToString (), true); + } + else + return SQLite3.ColumnInt (stmt, index); + } + else if (clrType == typeof (Int64)) { + return SQLite3.ColumnInt64 (stmt, index); + } + else if (clrType == typeof (UInt32)) { + return (uint)SQLite3.ColumnInt64 (stmt, index); + } + else if (clrType == typeof (decimal)) { + return (decimal)SQLite3.ColumnDouble (stmt, index); + } + else if (clrType == typeof (Byte)) { + return (byte)SQLite3.ColumnInt (stmt, index); + } + else if (clrType == typeof (UInt16)) { + return (ushort)SQLite3.ColumnInt (stmt, index); + } + else if (clrType == typeof (Int16)) { + return (short)SQLite3.ColumnInt (stmt, index); + } + else if (clrType == typeof (sbyte)) { + return (sbyte)SQLite3.ColumnInt (stmt, index); + } + else if (clrType == typeof (byte[])) { + return SQLite3.ColumnByteArray (stmt, index); + } + else if (clrType == typeof (Guid)) { + var text = SQLite3.ColumnString (stmt, index); + return new Guid (text); + } + else if (clrType == typeof (Uri)) { + var text = SQLite3.ColumnString (stmt, index); + return new Uri (text); + } + else if (clrType == typeof (StringBuilder)) { + var text = SQLite3.ColumnString (stmt, index); + return new StringBuilder (text); + } + else if (clrType == typeof (UriBuilder)) { + var text = SQLite3.ColumnString (stmt, index); + return new UriBuilder (text); + } + else { + throw new NotSupportedException ("Don't know how to read " + clrType); + } + } + } + } + + internal class FastColumnSetter + { + /// + /// Creates a delegate that can be used to quickly set object members from query columns. + /// + /// Note that this frontloads the slow reflection-based type checking for columns to only happen once at the beginning of a query, + /// and then afterwards each row of the query can invoke the delegate returned by this function to get much better performance (up to 10x speed boost, depending on query size and platform). + /// + /// The type of the destination object that the query will read into + /// The active connection. Note that this is primarily needed in order to read preferences regarding how certain data types (such as TimeSpan / DateTime) should be encoded in the database. + /// The table mapping used to map the statement column to a member of the destination object type + /// + /// A delegate for fast-setting of object members from statement columns. + /// + /// If no fast setter is available for the requested column (enums in particular cause headache), then this function returns null. + /// + internal static Action GetFastSetter (SQLiteConnection conn, TableMapping.Column column) + { + Action fastSetter = null; + + Type clrType = column.PropertyInfo.PropertyType; + + var clrTypeInfo = clrType.GetTypeInfo (); + if (clrTypeInfo.IsGenericType && clrTypeInfo.GetGenericTypeDefinition () == typeof (Nullable<>)) { + clrType = clrTypeInfo.GenericTypeArguments[0]; + clrTypeInfo = clrType.GetTypeInfo (); + } + + if (clrType == typeof (String)) { + fastSetter = CreateTypedSetterDelegate (column, (stmt, index) => { + return SQLite3.ColumnString (stmt, index); + }); + } + else if (clrType == typeof (Int32)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index)=>{ + return SQLite3.ColumnInt (stmt, index); + }); + } + else if (clrType == typeof (Boolean)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return SQLite3.ColumnInt (stmt, index) == 1; + }); + } + else if (clrType == typeof (double)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return SQLite3.ColumnDouble (stmt, index); + }); + } + else if (clrType == typeof (float)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return (float) SQLite3.ColumnDouble (stmt, index); + }); + } + else if (clrType == typeof (TimeSpan)) { + if (conn.StoreTimeSpanAsTicks) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return new TimeSpan (SQLite3.ColumnInt64 (stmt, index)); + }); + } + else { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + var text = SQLite3.ColumnString (stmt, index); + TimeSpan resultTime; + if (!TimeSpan.TryParseExact (text, "c", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.TimeSpanStyles.None, out resultTime)) { + resultTime = TimeSpan.Parse (text); + } + return resultTime; + }); + } + } + else if (clrType == typeof (DateTime)) { + if (conn.StoreDateTimeAsTicks) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return new DateTime (SQLite3.ColumnInt64 (stmt, index)); + }); + } + else { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + var text = SQLite3.ColumnString (stmt, index); + DateTime resultDate; + if (!DateTime.TryParseExact (text, conn.DateTimeStringFormat, System.Globalization.CultureInfo.InvariantCulture, conn.DateTimeStyle, out resultDate)) { + resultDate = DateTime.Parse (text); + } + return resultDate; + }); + } + } + else if (clrType == typeof (DateTimeOffset)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return new DateTimeOffset (SQLite3.ColumnInt64 (stmt, index), TimeSpan.Zero); + }); + } + else if (clrTypeInfo.IsEnum) { + // NOTE: Not sure of a good way (if any?) to do a strongly-typed fast setter like this for enumerated types -- for now, return null and column sets will revert back to the safe (but slow) Reflection-based method of column prop.Set() + } + else if (clrType == typeof (Int64)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return SQLite3.ColumnInt64 (stmt, index); + }); + } + else if (clrType == typeof (UInt32)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return (uint)SQLite3.ColumnInt64 (stmt, index); + }); + } + else if (clrType == typeof (decimal)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return (decimal)SQLite3.ColumnDouble (stmt, index); + }); + } + else if (clrType == typeof (Byte)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return (byte)SQLite3.ColumnInt (stmt, index); + }); + } + else if (clrType == typeof (UInt16)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return (ushort)SQLite3.ColumnInt (stmt, index); + }); + } + else if (clrType == typeof (Int16)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return (short)SQLite3.ColumnInt (stmt, index); + }); + } + else if (clrType == typeof (sbyte)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + return (sbyte)SQLite3.ColumnInt (stmt, index); + }); + } + else if (clrType == typeof (byte[])) { + fastSetter = CreateTypedSetterDelegate (column, (stmt, index) => { + return SQLite3.ColumnByteArray (stmt, index); + }); + } + else if (clrType == typeof (Guid)) { + fastSetter = CreateNullableTypedSetterDelegate (column, (stmt, index) => { + var text = SQLite3.ColumnString (stmt, index); + return new Guid (text); + }); + } + else if (clrType == typeof (Uri)) { + fastSetter = CreateTypedSetterDelegate (column, (stmt, index) => { + var text = SQLite3.ColumnString (stmt, index); + return new Uri (text); + }); + } + else if (clrType == typeof (StringBuilder)) { + fastSetter = CreateTypedSetterDelegate (column, (stmt, index) => { + var text = SQLite3.ColumnString (stmt, index); + return new StringBuilder (text); + }); + } + else if (clrType == typeof (UriBuilder)) { + fastSetter = CreateTypedSetterDelegate (column, (stmt, index) => { + var text = SQLite3.ColumnString (stmt, index); + return new UriBuilder (text); + }); + } + else { + // NOTE: Will fall back to the slow setter method in the event that we are unable to create a fast setter delegate for a particular column type + } + return fastSetter; + } + + /// + /// This creates a strongly typed delegate that will permit fast setting of column values given a Sqlite3Statement and a column index. + /// + /// Note that this is identical to CreateTypedSetterDelegate(), but has an extra check to see if it should create a nullable version of the delegate. + /// + /// The type of the object whose member column is being set + /// The CLR type of the member in the object which corresponds to the given SQLite columnn + /// The column mapping that identifies the target member of the destination object + /// A lambda that can be used to retrieve the column value at query-time + /// A strongly-typed delegate + private static Action CreateNullableTypedSetterDelegate (TableMapping.Column column, Func getColumnValue) where ColumnMemberType : struct + { + var clrTypeInfo = column.PropertyInfo.PropertyType.GetTypeInfo(); + bool isNullable = false; + + if (clrTypeInfo.IsGenericType && clrTypeInfo.GetGenericTypeDefinition () == typeof (Nullable<>)) { + isNullable = true; + } + + if (isNullable) { + var setProperty = (Action)Delegate.CreateDelegate ( + typeof (Action), null, + column.PropertyInfo.GetSetMethod ()); + + return (o, stmt, i) => { + var colType = SQLite3.ColumnType (stmt, i); + if (colType != SQLite3.ColType.Null) + setProperty.Invoke ((ObjectType)o, getColumnValue.Invoke (stmt, i)); + }; + } + + return CreateTypedSetterDelegate (column, getColumnValue); + } + + /// + /// This creates a strongly typed delegate that will permit fast setting of column values given a Sqlite3Statement and a column index. + /// + /// The type of the object whose member column is being set + /// The CLR type of the member in the object which corresponds to the given SQLite columnn + /// The column mapping that identifies the target member of the destination object + /// A lambda that can be used to retrieve the column value at query-time + /// A strongly-typed delegate + private static Action CreateTypedSetterDelegate (TableMapping.Column column, Func getColumnValue) + { + var setProperty = (Action)Delegate.CreateDelegate ( + typeof (Action), null, + column.PropertyInfo.GetSetMethod ()); + + return (o, stmt, i) => { + var colType = SQLite3.ColumnType (stmt, i); + if (colType != SQLite3.ColType.Null) + setProperty.Invoke ((ObjectType)o, getColumnValue.Invoke (stmt, i)); + }; + } + } + + /// + /// Since the insert never changed, we only need to prepare once. + /// + class PreparedSqlLiteInsertCommand : IDisposable + { + bool Initialized; + + SQLiteConnection Connection; + + string CommandText; + + Sqlite3Statement Statement; + static readonly Sqlite3Statement NullStatement = default (Sqlite3Statement); + + public PreparedSqlLiteInsertCommand (SQLiteConnection conn, string commandText) + { + Connection = conn; + CommandText = commandText; + } + + public int ExecuteNonQuery (object[] source) + { + if (Initialized && Statement == NullStatement) { + throw new ObjectDisposedException (nameof (PreparedSqlLiteInsertCommand)); + } + + if (Connection.Trace) { + Connection.Tracer?.Invoke ("Executing: " + CommandText); + } + + var r = SQLite3.Result.OK; + + if (!Initialized) { + Statement = SQLite3.Prepare2 (Connection.Handle, CommandText); + Initialized = true; + } + + //bind the values. + if (source != null) { + for (int i = 0; i < source.Length; i++) { + SQLiteCommand.BindParameter (Statement, i + 1, source[i], Connection.StoreDateTimeAsTicks, Connection.DateTimeStringFormat, Connection.StoreTimeSpanAsTicks); + } + } + r = SQLite3.Step (Statement); + + if (r == SQLite3.Result.Done) { + int rowsAffected = SQLite3.Changes (Connection.Handle); + SQLite3.Reset (Statement); + return rowsAffected; + } + else if (r == SQLite3.Result.Error) { + string msg = SQLite3.GetErrmsg (Connection.Handle); + SQLite3.Reset (Statement); + throw SQLiteException.New (r, msg); + } + else if (r == SQLite3.Result.Constraint && SQLite3.ExtendedErrCode (Connection.Handle) == SQLite3.ExtendedResult.ConstraintNotNull) { + SQLite3.Reset (Statement); + throw NotNullConstraintViolationException.New (r, SQLite3.GetErrmsg (Connection.Handle)); + } + else { + SQLite3.Reset (Statement); + throw SQLiteException.New (r, SQLite3.GetErrmsg (Connection.Handle)); + } + } + + public void Dispose () + { + Dispose (true); + GC.SuppressFinalize (this); + } + + void Dispose (bool disposing) + { + var s = Statement; + Statement = NullStatement; + Connection = null; + if (s != NullStatement) { + SQLite3.Finalize (s); + } + } + + ~PreparedSqlLiteInsertCommand () + { + Dispose (false); + } + } + + public enum CreateTableResult + { + Created, + Migrated, + } + + public class CreateTablesResult + { + public Dictionary Results { get; private set; } + + public CreateTablesResult () + { + Results = new Dictionary (); + } + } + + public abstract class BaseTableQuery + { + protected class Ordering + { + public string ColumnName { get; set; } + public bool Ascending { get; set; } + } + } + + public class TableQuery : BaseTableQuery, IEnumerable + { + public SQLiteConnection Connection { get; private set; } + + public TableMapping Table { get; private set; } + + Expression _where; + List _orderBys; + int? _limit; + int? _offset; + + BaseTableQuery _joinInner; + Expression _joinInnerKeySelector; + BaseTableQuery _joinOuter; + Expression _joinOuterKeySelector; + Expression _joinSelector; + + Expression _selector; + + TableQuery (SQLiteConnection conn, TableMapping table) + { + Connection = conn; + Table = table; + } + + public TableQuery (SQLiteConnection conn) + { + Connection = conn; + Table = Connection.GetMapping (typeof (T)); + } + + public TableQuery Clone () + { + var q = new TableQuery (Connection, Table); + q._where = _where; + q._deferred = _deferred; + if (_orderBys != null) { + q._orderBys = new List (_orderBys); + } + q._limit = _limit; + q._offset = _offset; + q._joinInner = _joinInner; + q._joinInnerKeySelector = _joinInnerKeySelector; + q._joinOuter = _joinOuter; + q._joinOuterKeySelector = _joinOuterKeySelector; + q._joinSelector = _joinSelector; + q._selector = _selector; + return q; + } + + /// + /// Filters the query based on a predicate. + /// + public TableQuery Where (Expression> predExpr) + { + if (predExpr.NodeType == ExpressionType.Lambda) { + var lambda = (LambdaExpression)predExpr; + var pred = lambda.Body; + var q = Clone (); + q.AddWhere (pred); + return q; + } + else { + throw new NotSupportedException ("Must be a predicate"); + } + } + + /// + /// Delete all the rows that match this query. + /// + public int Delete () + { + return Delete (null); + } + + /// + /// Delete all the rows that match this query and the given predicate. + /// + public int Delete (Expression> predExpr) + { + if (_limit.HasValue || _offset.HasValue) + throw new InvalidOperationException ("Cannot delete with limits or offsets"); + + if (_where == null && predExpr == null) + throw new InvalidOperationException ("No condition specified"); + + var pred = _where; + + if (predExpr != null && predExpr.NodeType == ExpressionType.Lambda) { + var lambda = (LambdaExpression)predExpr; + pred = pred != null ? Expression.AndAlso (pred, lambda.Body) : lambda.Body; + } + + var args = new List (); + var cmdText = "delete from \"" + Table.TableName + "\""; + var w = CompileExpr (pred, args); + cmdText += " where " + w.CommandText; + + var command = Connection.CreateCommand (cmdText, args.ToArray ()); + + int result = command.ExecuteNonQuery (); + return result; + } + + /// + /// Yields a given number of elements from the query and then skips the remainder. + /// + public TableQuery Take (int n) + { + var q = Clone (); + q._limit = n; + return q; + } + + /// + /// Skips a given number of elements from the query and then yields the remainder. + /// + public TableQuery Skip (int n) + { + var q = Clone (); + q._offset = n; + return q; + } + + /// + /// Returns the element at a given index + /// + public T ElementAt (int index) + { + return Skip (index).Take (1).First (); + } + + bool _deferred; + public TableQuery Deferred () + { + var q = Clone (); + q._deferred = true; + return q; + } + + /// + /// Order the query results according to a key. + /// + public TableQuery OrderBy (Expression> orderExpr) + { + return AddOrderBy (orderExpr, true); + } + + /// + /// Order the query results according to a key. + /// + public TableQuery OrderByDescending (Expression> orderExpr) + { + return AddOrderBy (orderExpr, false); + } + + /// + /// Order the query results according to a key. + /// + public TableQuery ThenBy (Expression> orderExpr) + { + return AddOrderBy (orderExpr, true); + } + + /// + /// Order the query results according to a key. + /// + public TableQuery ThenByDescending (Expression> orderExpr) + { + return AddOrderBy (orderExpr, false); + } + + TableQuery AddOrderBy (Expression> orderExpr, bool asc) + { + if (orderExpr.NodeType == ExpressionType.Lambda) { + var lambda = (LambdaExpression)orderExpr; + + MemberExpression mem = null; + + var unary = lambda.Body as UnaryExpression; + if (unary != null && unary.NodeType == ExpressionType.Convert) { + mem = unary.Operand as MemberExpression; + } + else { + mem = lambda.Body as MemberExpression; + } + + if (mem != null && (mem.Expression.NodeType == ExpressionType.Parameter)) { + var q = Clone (); + if (q._orderBys == null) { + q._orderBys = new List (); + } + q._orderBys.Add (new Ordering { + ColumnName = Table.FindColumnWithPropertyName (mem.Member.Name).Name, + Ascending = asc + }); + return q; + } + else { + throw new NotSupportedException ("Order By does not support: " + orderExpr); + } + } + else { + throw new NotSupportedException ("Must be a predicate"); + } + } + + private void AddWhere (Expression pred) + { + if (_where == null) { + _where = pred; + } + else { + _where = Expression.AndAlso (_where, pred); + } + } + + ///// + ///// Performs an inner join of two queries based on matching keys extracted from the elements. + ///// + //public TableQuery Join ( + // TableQuery inner, + // Expression> outerKeySelector, + // Expression> innerKeySelector, + // Expression> resultSelector) + //{ + // var q = new TableQuery (Connection, Connection.GetMapping (typeof (TResult))) { + // _joinOuter = this, + // _joinOuterKeySelector = outerKeySelector, + // _joinInner = inner, + // _joinInnerKeySelector = innerKeySelector, + // _joinSelector = resultSelector, + // }; + // return q; + //} + + // Not needed until Joins are supported + // Keeping this commented out forces the default Linq to objects processor to run + //public TableQuery Select (Expression> selector) + //{ + // var q = Clone (); + // q._selector = selector; + // return q; + //} + + private SQLiteCommand GenerateCommand (string selectionList) + { + if (_joinInner != null && _joinOuter != null) { + throw new NotSupportedException ("Joins are not supported."); + } + else { + var cmdText = "select " + selectionList + " from \"" + Table.TableName + "\""; + var args = new List (); + if (_where != null) { + var w = CompileExpr (_where, args); + cmdText += " where " + w.CommandText; + } + if ((_orderBys != null) && (_orderBys.Count > 0)) { + var t = string.Join (", ", _orderBys.Select (o => "\"" + o.ColumnName + "\"" + (o.Ascending ? "" : " desc")).ToArray ()); + cmdText += " order by " + t; + } + if (_limit.HasValue) { + cmdText += " limit " + _limit.Value; + } + if (_offset.HasValue) { + if (!_limit.HasValue) { + cmdText += " limit -1 "; + } + cmdText += " offset " + _offset.Value; + } + return Connection.CreateCommand (cmdText, args.ToArray ()); + } + } + + class CompileResult + { + public string CommandText { get; set; } + + public object Value { get; set; } + } + + private CompileResult CompileExpr (Expression expr, List queryArgs) + { + if (expr == null) { + throw new NotSupportedException ("Expression is NULL"); + } + else if (expr is BinaryExpression) { + var bin = (BinaryExpression)expr; + + // VB turns 'x=="foo"' into 'CompareString(x,"foo",true/false)==0', so we need to unwrap it + // http://blogs.msdn.com/b/vbteam/archive/2007/09/18/vb-expression-trees-string-comparisons.aspx + if (bin.Left.NodeType == ExpressionType.Call) { + var call = (MethodCallExpression)bin.Left; + if (call.Method.DeclaringType.FullName == "Microsoft.VisualBasic.CompilerServices.Operators" + && call.Method.Name == "CompareString") + bin = Expression.MakeBinary (bin.NodeType, call.Arguments[0], call.Arguments[1]); + } + + + var leftr = CompileExpr (bin.Left, queryArgs); + var rightr = CompileExpr (bin.Right, queryArgs); + + //If either side is a parameter and is null, then handle the other side specially (for "is null"/"is not null") + string text; + if (leftr.CommandText == "?" && leftr.Value == null) + text = CompileNullBinaryExpression (bin, rightr); + else if (rightr.CommandText == "?" && rightr.Value == null) + text = CompileNullBinaryExpression (bin, leftr); + else + text = "(" + leftr.CommandText + " " + GetSqlName (bin) + " " + rightr.CommandText + ")"; + return new CompileResult { CommandText = text }; + } + else if (expr.NodeType == ExpressionType.Not) { + var operandExpr = ((UnaryExpression)expr).Operand; + var opr = CompileExpr (operandExpr, queryArgs); + object val = opr.Value; + if (val is bool) + val = !((bool)val); + return new CompileResult { + CommandText = "NOT(" + opr.CommandText + ")", + Value = val + }; + } + else if (expr.NodeType == ExpressionType.Call) { + + var call = (MethodCallExpression)expr; + var args = new CompileResult[call.Arguments.Count]; + var obj = call.Object != null ? CompileExpr (call.Object, queryArgs) : null; + + for (var i = 0; i < args.Length; i++) { + args[i] = CompileExpr (call.Arguments[i], queryArgs); + } + + var sqlCall = ""; + + if (call.Method.Name == "Like" && args.Length == 2) { + sqlCall = "(" + args[0].CommandText + " like " + args[1].CommandText + ")"; + } + else if (call.Method.Name == "Contains" && args.Length == 2) { + sqlCall = "(" + args[1].CommandText + " in " + args[0].CommandText + ")"; + } + else if (call.Method.Name == "Contains" && args.Length == 1) { + if (call.Object != null && call.Object.Type == typeof (string)) { + sqlCall = "( instr(" + obj.CommandText + "," + args[0].CommandText + ") >0 )"; + } + else { + sqlCall = "(" + args[0].CommandText + " in " + obj.CommandText + ")"; + } + } + else if (call.Method.Name == "StartsWith" && args.Length >= 1) { + var startsWithCmpOp = StringComparison.CurrentCulture; + if (args.Length == 2) { + startsWithCmpOp = (StringComparison)args[1].Value; + } + switch (startsWithCmpOp) { + case StringComparison.Ordinal: + case StringComparison.CurrentCulture: + sqlCall = "( substr(" + obj.CommandText + ", 1, " + args[0].Value.ToString ().Length + ") = " + args[0].CommandText + ")"; + break; + case StringComparison.OrdinalIgnoreCase: + case StringComparison.CurrentCultureIgnoreCase: + sqlCall = "(" + obj.CommandText + " like (" + args[0].CommandText + " || '%'))"; + break; + } + + } + else if (call.Method.Name == "EndsWith" && args.Length >= 1) { + var endsWithCmpOp = StringComparison.CurrentCulture; + if (args.Length == 2) { + endsWithCmpOp = (StringComparison)args[1].Value; + } + switch (endsWithCmpOp) { + case StringComparison.Ordinal: + case StringComparison.CurrentCulture: + sqlCall = "( substr(" + obj.CommandText + ", length(" + obj.CommandText + ") - " + args[0].Value.ToString ().Length + "+1, " + args[0].Value.ToString ().Length + ") = " + args[0].CommandText + ")"; + break; + case StringComparison.OrdinalIgnoreCase: + case StringComparison.CurrentCultureIgnoreCase: + sqlCall = "(" + obj.CommandText + " like ('%' || " + args[0].CommandText + "))"; + break; + } + } + else if (call.Method.Name == "Equals" && args.Length == 1) { + sqlCall = "(" + obj.CommandText + " = (" + args[0].CommandText + "))"; + } + else if (call.Method.Name == "ToLower") { + sqlCall = "(lower(" + obj.CommandText + "))"; + } + else if (call.Method.Name == "ToUpper") { + sqlCall = "(upper(" + obj.CommandText + "))"; + } + else if (call.Method.Name == "Replace" && args.Length == 2) { + sqlCall = "(replace(" + obj.CommandText + "," + args[0].CommandText + "," + args[1].CommandText + "))"; + } + else if (call.Method.Name == "IsNullOrEmpty" && args.Length == 1) { + sqlCall = "(" + args[0].CommandText + " is null or" + args[0].CommandText + " ='' )"; + } + else { + sqlCall = call.Method.Name.ToLower () + "(" + string.Join (",", args.Select (a => a.CommandText).ToArray ()) + ")"; + } + return new CompileResult { CommandText = sqlCall }; + + } + else if (expr.NodeType == ExpressionType.Constant) { + var c = (ConstantExpression)expr; + queryArgs.Add (c.Value); + return new CompileResult { + CommandText = "?", + Value = c.Value + }; + } + else if (expr.NodeType == ExpressionType.Convert) { + var u = (UnaryExpression)expr; + var ty = u.Type; + var valr = CompileExpr (u.Operand, queryArgs); + return new CompileResult { + CommandText = valr.CommandText, + Value = valr.Value != null ? ConvertTo (valr.Value, ty) : null + }; + } + else if (expr.NodeType == ExpressionType.MemberAccess) { + var mem = (MemberExpression)expr; + + var paramExpr = mem.Expression as ParameterExpression; + if (paramExpr == null) { + var convert = mem.Expression as UnaryExpression; + if (convert != null && convert.NodeType == ExpressionType.Convert) { + paramExpr = convert.Operand as ParameterExpression; + } + } + + if (paramExpr != null) { + // + // This is a column of our table, output just the column name + // Need to translate it if that column name is mapped + // + var columnName = Table.FindColumnWithPropertyName (mem.Member.Name).Name; + return new CompileResult { CommandText = "\"" + columnName + "\"" }; + } + else { + object obj = null; + if (mem.Expression != null) { + var r = CompileExpr (mem.Expression, queryArgs); + if (r.Value == null) { + throw new NotSupportedException ("Member access failed to compile expression"); + } + if (r.CommandText == "?") { + queryArgs.RemoveAt (queryArgs.Count - 1); + } + obj = r.Value; + } + + // + // Get the member value + // + object val = null; + + if (mem.Member is PropertyInfo) { + var m = (PropertyInfo)mem.Member; + val = m.GetValue (obj, null); + } + else if (mem.Member is FieldInfo) { + var m = (FieldInfo)mem.Member; + val = m.GetValue (obj); + } + else { + throw new NotSupportedException ("MemberExpr: " + mem.Member.GetType ()); + } + + // + // Work special magic for enumerables + // + if (val != null && val is System.Collections.IEnumerable && !(val is string) && !(val is System.Collections.Generic.IEnumerable)) { + var sb = new System.Text.StringBuilder (); + sb.Append ("("); + var head = ""; + foreach (var a in (System.Collections.IEnumerable)val) { + queryArgs.Add (a); + sb.Append (head); + sb.Append ("?"); + head = ","; + } + sb.Append (")"); + return new CompileResult { + CommandText = sb.ToString (), + Value = val + }; + } + else { + queryArgs.Add (val); + return new CompileResult { + CommandText = "?", + Value = val + }; + } + } + } + throw new NotSupportedException ("Cannot compile: " + expr.NodeType.ToString ()); + } + + static object ConvertTo (object obj, Type t) + { + Type nut = Nullable.GetUnderlyingType (t); + + if (nut != null) { + if (obj == null) + return null; + return Convert.ChangeType (obj, nut); + } + else { + return Convert.ChangeType (obj, t); + } + } + + /// + /// Compiles a BinaryExpression where one of the parameters is null. + /// + /// The expression to compile + /// The non-null parameter + private string CompileNullBinaryExpression (BinaryExpression expression, CompileResult parameter) + { + if (expression.NodeType == ExpressionType.Equal) + return "(" + parameter.CommandText + " is ?)"; + else if (expression.NodeType == ExpressionType.NotEqual) + return "(" + parameter.CommandText + " is not ?)"; + else if (expression.NodeType == ExpressionType.GreaterThan + || expression.NodeType == ExpressionType.GreaterThanOrEqual + || expression.NodeType == ExpressionType.LessThan + || expression.NodeType == ExpressionType.LessThanOrEqual) + return "(" + parameter.CommandText + " < ?)"; // always false + else + throw new NotSupportedException ("Cannot compile Null-BinaryExpression with type " + expression.NodeType.ToString ()); + } + + string GetSqlName (Expression expr) + { + var n = expr.NodeType; + if (n == ExpressionType.GreaterThan) + return ">"; + else if (n == ExpressionType.GreaterThanOrEqual) { + return ">="; + } + else if (n == ExpressionType.LessThan) { + return "<"; + } + else if (n == ExpressionType.LessThanOrEqual) { + return "<="; + } + else if (n == ExpressionType.And) { + return "&"; + } + else if (n == ExpressionType.AndAlso) { + return "and"; + } + else if (n == ExpressionType.Or) { + return "|"; + } + else if (n == ExpressionType.OrElse) { + return "or"; + } + else if (n == ExpressionType.Equal) { + return "="; + } + else if (n == ExpressionType.NotEqual) { + return "!="; + } + else { + throw new NotSupportedException ("Cannot get SQL for: " + n); + } + } + + /// + /// Execute SELECT COUNT(*) on the query + /// + public int Count () + { + return GenerateCommand ("count(*)").ExecuteScalar (); + } + + /// + /// Execute SELECT COUNT(*) on the query with an additional WHERE clause. + /// + public int Count (Expression> predExpr) + { + return Where (predExpr).Count (); + } + + public IEnumerator GetEnumerator () + { + if (!_deferred) + return GenerateCommand ("*").ExecuteQuery ().GetEnumerator (); + + return GenerateCommand ("*").ExecuteDeferredQuery ().GetEnumerator (); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () + { + return GetEnumerator (); + } + + /// + /// Queries the database and returns the results as a List. + /// + public List ToList () + { + return GenerateCommand ("*").ExecuteQuery (); + } + + /// + /// Queries the database and returns the results as an array. + /// + public T[] ToArray () + { + return GenerateCommand ("*").ExecuteQuery ().ToArray (); + } + + /// + /// Returns the first element of this query. + /// + public T First () + { + var query = Take (1); + return query.ToList ().First (); + } + + /// + /// Returns the first element of this query, or null if no element is found. + /// + public T FirstOrDefault () + { + var query = Take (1); + return query.ToList ().FirstOrDefault (); + } + + /// + /// Returns the first element of this query that matches the predicate. + /// + public T First (Expression> predExpr) + { + return Where (predExpr).First (); + } + + /// + /// Returns the first element of this query that matches the predicate, or null + /// if no element is found. + /// + public T FirstOrDefault (Expression> predExpr) + { + return Where (predExpr).FirstOrDefault (); + } + } + + public static class SQLite3 + { + public enum Result : int + { + OK = 0, + Error = 1, + Internal = 2, + Perm = 3, + Abort = 4, + Busy = 5, + Locked = 6, + NoMem = 7, + ReadOnly = 8, + Interrupt = 9, + IOError = 10, + Corrupt = 11, + NotFound = 12, + Full = 13, + CannotOpen = 14, + LockErr = 15, + Empty = 16, + SchemaChngd = 17, + TooBig = 18, + Constraint = 19, + Mismatch = 20, + Misuse = 21, + NotImplementedLFS = 22, + AccessDenied = 23, + Format = 24, + Range = 25, + NonDBFile = 26, + Notice = 27, + Warning = 28, + Row = 100, + Done = 101 + } + + public enum ExtendedResult : int + { + IOErrorRead = (Result.IOError | (1 << 8)), + IOErrorShortRead = (Result.IOError | (2 << 8)), + IOErrorWrite = (Result.IOError | (3 << 8)), + IOErrorFsync = (Result.IOError | (4 << 8)), + IOErrorDirFSync = (Result.IOError | (5 << 8)), + IOErrorTruncate = (Result.IOError | (6 << 8)), + IOErrorFStat = (Result.IOError | (7 << 8)), + IOErrorUnlock = (Result.IOError | (8 << 8)), + IOErrorRdlock = (Result.IOError | (9 << 8)), + IOErrorDelete = (Result.IOError | (10 << 8)), + IOErrorBlocked = (Result.IOError | (11 << 8)), + IOErrorNoMem = (Result.IOError | (12 << 8)), + IOErrorAccess = (Result.IOError | (13 << 8)), + IOErrorCheckReservedLock = (Result.IOError | (14 << 8)), + IOErrorLock = (Result.IOError | (15 << 8)), + IOErrorClose = (Result.IOError | (16 << 8)), + IOErrorDirClose = (Result.IOError | (17 << 8)), + IOErrorSHMOpen = (Result.IOError | (18 << 8)), + IOErrorSHMSize = (Result.IOError | (19 << 8)), + IOErrorSHMLock = (Result.IOError | (20 << 8)), + IOErrorSHMMap = (Result.IOError | (21 << 8)), + IOErrorSeek = (Result.IOError | (22 << 8)), + IOErrorDeleteNoEnt = (Result.IOError | (23 << 8)), + IOErrorMMap = (Result.IOError | (24 << 8)), + LockedSharedcache = (Result.Locked | (1 << 8)), + BusyRecovery = (Result.Busy | (1 << 8)), + CannottOpenNoTempDir = (Result.CannotOpen | (1 << 8)), + CannotOpenIsDir = (Result.CannotOpen | (2 << 8)), + CannotOpenFullPath = (Result.CannotOpen | (3 << 8)), + CorruptVTab = (Result.Corrupt | (1 << 8)), + ReadonlyRecovery = (Result.ReadOnly | (1 << 8)), + ReadonlyCannotLock = (Result.ReadOnly | (2 << 8)), + ReadonlyRollback = (Result.ReadOnly | (3 << 8)), + AbortRollback = (Result.Abort | (2 << 8)), + ConstraintCheck = (Result.Constraint | (1 << 8)), + ConstraintCommitHook = (Result.Constraint | (2 << 8)), + ConstraintForeignKey = (Result.Constraint | (3 << 8)), + ConstraintFunction = (Result.Constraint | (4 << 8)), + ConstraintNotNull = (Result.Constraint | (5 << 8)), + ConstraintPrimaryKey = (Result.Constraint | (6 << 8)), + ConstraintTrigger = (Result.Constraint | (7 << 8)), + ConstraintUnique = (Result.Constraint | (8 << 8)), + ConstraintVTab = (Result.Constraint | (9 << 8)), + NoticeRecoverWAL = (Result.Notice | (1 << 8)), + NoticeRecoverRollback = (Result.Notice | (2 << 8)) + } + + + public enum ConfigOption : int + { + SingleThread = 1, + MultiThread = 2, + Serialized = 3 + } + + const string LibraryPath = "sqlite3"; + +#if !USE_CSHARP_SQLITE && !USE_WP8_NATIVE_SQLITE && !USE_SQLITEPCL_RAW + [DllImport(LibraryPath, EntryPoint = "sqlite3_threadsafe", CallingConvention=CallingConvention.Cdecl)] + public static extern int Threadsafe (); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_open", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Open ([MarshalAs(UnmanagedType.LPStr)] string filename, out IntPtr db); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_open_v2", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Open ([MarshalAs(UnmanagedType.LPStr)] string filename, out IntPtr db, int flags, [MarshalAs (UnmanagedType.LPStr)] string zvfs); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_open_v2", CallingConvention = CallingConvention.Cdecl)] + public static extern Result Open(byte[] filename, out IntPtr db, int flags, [MarshalAs (UnmanagedType.LPStr)] string zvfs); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_open16", CallingConvention = CallingConvention.Cdecl)] + public static extern Result Open16([MarshalAs(UnmanagedType.LPWStr)] string filename, out IntPtr db); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_enable_load_extension", CallingConvention=CallingConvention.Cdecl)] + public static extern Result EnableLoadExtension (IntPtr db, int onoff); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_close", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Close (IntPtr db); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_close_v2", CallingConvention = CallingConvention.Cdecl)] + public static extern Result Close2(IntPtr db); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_initialize", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Initialize(); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_shutdown", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Shutdown(); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_config", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Config (ConfigOption option); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_win32_set_directory", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Unicode)] + public static extern int SetDirectory (uint directoryType, string directoryPath); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_busy_timeout", CallingConvention=CallingConvention.Cdecl)] + public static extern Result BusyTimeout (IntPtr db, int milliseconds); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_changes", CallingConvention=CallingConvention.Cdecl)] + public static extern int Changes (IntPtr db); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_prepare_v2", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Prepare2 (IntPtr db, [MarshalAs(UnmanagedType.LPStr)] string sql, int numBytes, out IntPtr stmt, IntPtr pzTail); + +#if NETFX_CORE + [DllImport (LibraryPath, EntryPoint = "sqlite3_prepare_v2", CallingConvention = CallingConvention.Cdecl)] + public static extern Result Prepare2 (IntPtr db, byte[] queryBytes, int numBytes, out IntPtr stmt, IntPtr pzTail); +#endif + + public static IntPtr Prepare2 (IntPtr db, string query) + { + IntPtr stmt; +#if NETFX_CORE + byte[] queryBytes = System.Text.UTF8Encoding.UTF8.GetBytes (query); + var r = Prepare2 (db, queryBytes, queryBytes.Length, out stmt, IntPtr.Zero); +#else + var r = Prepare2 (db, query, System.Text.UTF8Encoding.UTF8.GetByteCount (query), out stmt, IntPtr.Zero); +#endif + if (r != Result.OK) { + throw SQLiteException.New (r, GetErrmsg (db)); + } + return stmt; + } + + [DllImport(LibraryPath, EntryPoint = "sqlite3_step", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Step (IntPtr stmt); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_reset", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Reset (IntPtr stmt); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_finalize", CallingConvention=CallingConvention.Cdecl)] + public static extern Result Finalize (IntPtr stmt); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_last_insert_rowid", CallingConvention=CallingConvention.Cdecl)] + public static extern long LastInsertRowid (IntPtr db); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_errmsg16", CallingConvention=CallingConvention.Cdecl)] + public static extern IntPtr Errmsg (IntPtr db); + + public static string GetErrmsg (IntPtr db) + { + return Marshal.PtrToStringUni (Errmsg (db)); + } + + [DllImport(LibraryPath, EntryPoint = "sqlite3_bind_parameter_index", CallingConvention=CallingConvention.Cdecl)] + public static extern int BindParameterIndex (IntPtr stmt, [MarshalAs(UnmanagedType.LPStr)] string name); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_bind_null", CallingConvention=CallingConvention.Cdecl)] + public static extern int BindNull (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_bind_int", CallingConvention=CallingConvention.Cdecl)] + public static extern int BindInt (IntPtr stmt, int index, int val); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_bind_int64", CallingConvention=CallingConvention.Cdecl)] + public static extern int BindInt64 (IntPtr stmt, int index, long val); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_bind_double", CallingConvention=CallingConvention.Cdecl)] + public static extern int BindDouble (IntPtr stmt, int index, double val); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_bind_text16", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] + public static extern int BindText (IntPtr stmt, int index, [MarshalAs(UnmanagedType.LPWStr)] string val, int n, IntPtr free); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_bind_blob", CallingConvention=CallingConvention.Cdecl)] + public static extern int BindBlob (IntPtr stmt, int index, byte[] val, int n, IntPtr free); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_count", CallingConvention=CallingConvention.Cdecl)] + public static extern int ColumnCount (IntPtr stmt); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_name", CallingConvention=CallingConvention.Cdecl)] + public static extern IntPtr ColumnName (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_name16", CallingConvention=CallingConvention.Cdecl)] + static extern IntPtr ColumnName16Internal (IntPtr stmt, int index); + public static string ColumnName16(IntPtr stmt, int index) + { + return Marshal.PtrToStringUni(ColumnName16Internal(stmt, index)); + } + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_type", CallingConvention=CallingConvention.Cdecl)] + public static extern ColType ColumnType (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_int", CallingConvention=CallingConvention.Cdecl)] + public static extern int ColumnInt (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_int64", CallingConvention=CallingConvention.Cdecl)] + public static extern long ColumnInt64 (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_double", CallingConvention=CallingConvention.Cdecl)] + public static extern double ColumnDouble (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_text", CallingConvention=CallingConvention.Cdecl)] + public static extern IntPtr ColumnText (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_text16", CallingConvention=CallingConvention.Cdecl)] + public static extern IntPtr ColumnText16 (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_blob", CallingConvention=CallingConvention.Cdecl)] + public static extern IntPtr ColumnBlob (IntPtr stmt, int index); + + [DllImport(LibraryPath, EntryPoint = "sqlite3_column_bytes", CallingConvention=CallingConvention.Cdecl)] + public static extern int ColumnBytes (IntPtr stmt, int index); + + public static string ColumnString (IntPtr stmt, int index) + { + return Marshal.PtrToStringUni (SQLite3.ColumnText16 (stmt, index)); + } + + public static byte[] ColumnByteArray (IntPtr stmt, int index) + { + int length = ColumnBytes (stmt, index); + var result = new byte[length]; + if (length > 0) + Marshal.Copy (ColumnBlob (stmt, index), result, 0, length); + return result; + } + + [DllImport (LibraryPath, EntryPoint = "sqlite3_errcode", CallingConvention = CallingConvention.Cdecl)] + public static extern Result GetResult (Sqlite3DatabaseHandle db); + + [DllImport (LibraryPath, EntryPoint = "sqlite3_extended_errcode", CallingConvention = CallingConvention.Cdecl)] + public static extern ExtendedResult ExtendedErrCode (IntPtr db); + + [DllImport (LibraryPath, EntryPoint = "sqlite3_libversion_number", CallingConvention = CallingConvention.Cdecl)] + public static extern int LibVersionNumber (); + + [DllImport (LibraryPath, EntryPoint = "sqlite3_backup_init", CallingConvention = CallingConvention.Cdecl)] + public static extern Sqlite3BackupHandle BackupInit (Sqlite3DatabaseHandle destDb, [MarshalAs (UnmanagedType.LPStr)] string destName, Sqlite3DatabaseHandle sourceDb, [MarshalAs (UnmanagedType.LPStr)] string sourceName); + + [DllImport (LibraryPath, EntryPoint = "sqlite3_backup_step", CallingConvention = CallingConvention.Cdecl)] + public static extern Result BackupStep (Sqlite3BackupHandle backup, int numPages); + + [DllImport (LibraryPath, EntryPoint = "sqlite3_backup_finish", CallingConvention = CallingConvention.Cdecl)] + public static extern Result BackupFinish (Sqlite3BackupHandle backup); +#else + public static Result Open (string filename, out Sqlite3DatabaseHandle db) + { + return (Result)Sqlite3.sqlite3_open (filename, out db); + } + + public static Result Open (string filename, out Sqlite3DatabaseHandle db, int flags, string vfsName) + { +#if USE_WP8_NATIVE_SQLITE + return (Result)Sqlite3.sqlite3_open_v2(filename, out db, flags, vfsName ?? ""); +#else + return (Result)Sqlite3.sqlite3_open_v2 (filename, out db, flags, vfsName); +#endif + } + + public static Result Close (Sqlite3DatabaseHandle db) + { + return (Result)Sqlite3.sqlite3_close (db); + } + + public static Result Close2 (Sqlite3DatabaseHandle db) + { + return (Result)Sqlite3.sqlite3_close_v2 (db); + } + + public static Result BusyTimeout (Sqlite3DatabaseHandle db, int milliseconds) + { + return (Result)Sqlite3.sqlite3_busy_timeout (db, milliseconds); + } + + public static int Changes (Sqlite3DatabaseHandle db) + { + return Sqlite3.sqlite3_changes (db); + } + + public static Sqlite3Statement Prepare2 (Sqlite3DatabaseHandle db, string query) + { + Sqlite3Statement stmt = default (Sqlite3Statement); +#if USE_WP8_NATIVE_SQLITE || USE_SQLITEPCL_RAW + var r = Sqlite3.sqlite3_prepare_v2 (db, query, out stmt); +#else + stmt = new Sqlite3Statement(); + var r = Sqlite3.sqlite3_prepare_v2(db, query, -1, ref stmt, 0); +#endif + if (r != 0) { + throw SQLiteException.New ((Result)r, GetErrmsg (db)); + } + return stmt; + } + + public static Result Step (Sqlite3Statement stmt) + { + return (Result)Sqlite3.sqlite3_step (stmt); + } + + public static Result Reset (Sqlite3Statement stmt) + { + return (Result)Sqlite3.sqlite3_reset (stmt); + } + + public static Result Finalize (Sqlite3Statement stmt) + { + return (Result)Sqlite3.sqlite3_finalize (stmt); + } + + public static long LastInsertRowid (Sqlite3DatabaseHandle db) + { + return Sqlite3.sqlite3_last_insert_rowid (db); + } + + public static string GetErrmsg (Sqlite3DatabaseHandle db) + { + return Sqlite3.sqlite3_errmsg (db).utf8_to_string (); + } + + public static int BindParameterIndex (Sqlite3Statement stmt, string name) + { + return Sqlite3.sqlite3_bind_parameter_index (stmt, name); + } + + public static int BindNull (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_bind_null (stmt, index); + } + + public static int BindInt (Sqlite3Statement stmt, int index, int val) + { + return Sqlite3.sqlite3_bind_int (stmt, index, val); + } + + public static int BindInt64 (Sqlite3Statement stmt, int index, long val) + { + return Sqlite3.sqlite3_bind_int64 (stmt, index, val); + } + + public static int BindDouble (Sqlite3Statement stmt, int index, double val) + { + return Sqlite3.sqlite3_bind_double (stmt, index, val); + } + + public static int BindText (Sqlite3Statement stmt, int index, string val, int n, IntPtr free) + { +#if USE_WP8_NATIVE_SQLITE + return Sqlite3.sqlite3_bind_text(stmt, index, val, n); +#elif USE_SQLITEPCL_RAW + return Sqlite3.sqlite3_bind_text (stmt, index, val); +#else + return Sqlite3.sqlite3_bind_text(stmt, index, val, n, null); +#endif + } + + public static int BindBlob (Sqlite3Statement stmt, int index, byte[] val, int n, IntPtr free) + { +#if USE_WP8_NATIVE_SQLITE + return Sqlite3.sqlite3_bind_blob(stmt, index, val, n); +#elif USE_SQLITEPCL_RAW + return Sqlite3.sqlite3_bind_blob (stmt, index, val); +#else + return Sqlite3.sqlite3_bind_blob(stmt, index, val, n, null); +#endif + } + + public static int ColumnCount (Sqlite3Statement stmt) + { + return Sqlite3.sqlite3_column_count (stmt); + } + + public static string ColumnName (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_name (stmt, index).utf8_to_string (); + } + + public static string ColumnName16 (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_name (stmt, index).utf8_to_string (); + } + + public static ColType ColumnType (Sqlite3Statement stmt, int index) + { + return (ColType)Sqlite3.sqlite3_column_type (stmt, index); + } + + public static int ColumnInt (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_int (stmt, index); + } + + public static long ColumnInt64 (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_int64 (stmt, index); + } + + public static double ColumnDouble (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_double (stmt, index); + } + + public static string ColumnText (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_text (stmt, index).utf8_to_string (); + } + + public static string ColumnText16 (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_text (stmt, index).utf8_to_string (); + } + + public static byte[] ColumnBlob (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_blob (stmt, index).ToArray (); + } + + public static int ColumnBytes (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_bytes (stmt, index); + } + + public static string ColumnString (Sqlite3Statement stmt, int index) + { + return Sqlite3.sqlite3_column_text (stmt, index).utf8_to_string (); + } + + public static byte[] ColumnByteArray (Sqlite3Statement stmt, int index) + { + int length = ColumnBytes (stmt, index); + if (length > 0) { + return ColumnBlob (stmt, index); + } + return new byte[0]; + } + + public static Result EnableLoadExtension (Sqlite3DatabaseHandle db, int onoff) + { + return (Result)Sqlite3.sqlite3_enable_load_extension (db, onoff); + } + + public static int LibVersionNumber () + { + return Sqlite3.sqlite3_libversion_number (); + } + + public static Result GetResult (Sqlite3DatabaseHandle db) + { + return (Result)Sqlite3.sqlite3_errcode (db); + } + + public static ExtendedResult ExtendedErrCode (Sqlite3DatabaseHandle db) + { + return (ExtendedResult)Sqlite3.sqlite3_extended_errcode (db); + } + + public static Sqlite3BackupHandle BackupInit (Sqlite3DatabaseHandle destDb, string destName, Sqlite3DatabaseHandle sourceDb, string sourceName) + { + return Sqlite3.sqlite3_backup_init (destDb, destName, sourceDb, sourceName); + } + + public static Result BackupStep (Sqlite3BackupHandle backup, int numPages) + { + return (Result)Sqlite3.sqlite3_backup_step (backup, numPages); + } + + public static Result BackupFinish (Sqlite3BackupHandle backup) + { + return (Result)Sqlite3.sqlite3_backup_finish (backup); + } +#endif + + public enum ColType : int + { + Integer = 1, + Float = 2, + Text = 3, + Blob = 4, + Null = 5 + } + } } diff --git a/SQLiteLegacy.cs b/SQLiteLegacy.cs new file mode 100644 index 00000000..4d0874b8 --- /dev/null +++ b/SQLiteLegacy.cs @@ -0,0 +1,151 @@ +using CefSharp; +using System; +using System.Collections.Generic; +using System.Data.SQLite; +using System.IO; +using System.Threading; + +namespace VRCX +{ + public class SQLiteLegacy + { + public static readonly SQLiteLegacy Instance; + private readonly ReaderWriterLockSlim m_ConnectionLock; + private readonly SQLiteConnection m_Connection; + + static SQLiteLegacy() + { + Instance = new SQLiteLegacy(); + } + + public SQLiteLegacy() + { + m_ConnectionLock = new ReaderWriterLockSlim(); + + var dataSource = Program.ConfigLocation; + m_Connection = new SQLiteConnection($"Data Source=\"{dataSource}\";Version=3;PRAGMA locking_mode=NORMAL;PRAGMA busy_timeout=5000", true); + } + + internal void Init() + { + m_Connection.Open(); + } + + internal void Exit() + { + m_Connection.Close(); + m_Connection.Dispose(); + } + + public void Execute(IJavascriptCallback callback, string sql, IDictionary args = null) + { + try + { + m_ConnectionLock.EnterReadLock(); + try + { + using (var command = new SQLiteCommand(sql, m_Connection)) + { + if (args != null) + { + foreach (var arg in args) + { + command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value)); + } + } + using (var reader = command.ExecuteReader()) + { + while (reader.Read() == true) + { + var values = new object[reader.FieldCount]; + reader.GetValues(values); + if (callback.CanExecute == true) + { + callback.ExecuteAsync(null, values); + } + } + } + } + if (callback.CanExecute == true) + { + callback.ExecuteAsync(null, null); + } + } + finally + { + m_ConnectionLock.ExitReadLock(); + } + } + catch (Exception e) + { + if (callback.CanExecute == true) + { + callback.ExecuteAsync(e.Message, null); + } + } + + callback.Dispose(); + } + + public void Execute(Action callback, string sql, IDictionary args = null) + { + m_ConnectionLock.EnterReadLock(); + try + { + using (var command = new SQLiteCommand(sql, m_Connection)) + { + if (args != null) + { + foreach (var arg in args) + { + command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value)); + } + } + using (var reader = command.ExecuteReader()) + { + while (reader.Read() == true) + { + var values = new object[reader.FieldCount]; + reader.GetValues(values); + callback(values); + } + } + } + } + catch + { + } + finally + { + m_ConnectionLock.ExitReadLock(); + } + } + + public int ExecuteNonQuery(string sql, IDictionary args = null) + { + int result = -1; + + m_ConnectionLock.EnterWriteLock(); + try + { + using (var command = new SQLiteCommand(sql, m_Connection)) + { + if (args != null) + { + foreach (var arg in args) + { + command.Parameters.Add(new SQLiteParameter(arg.Key, arg.Value)); + } + } + result = command.ExecuteNonQuery(); + } + } + finally + { + m_ConnectionLock.ExitWriteLock(); + } + + return result; + } + } +} diff --git a/ScreenshotHelper.cs b/ScreenshotHelper.cs index b2b26d8e..6868d949 100644 --- a/ScreenshotHelper.cs +++ b/ScreenshotHelper.cs @@ -181,7 +181,11 @@ namespace VRCX return new PNGChunk(type, chunkData); } - // parse LFS screenshot PNG metadata + /// + /// Parses the metadata string of a vrchat screenshot with taken with LFS and returns a JObject containing the parsed data. + /// + /// The metadata string to parse. + /// A JObject containing the parsed data. public static JObject ParseLfsPicture(string metadataString) { var metadata = new JObject(); diff --git a/Util.cs b/Util.cs index 7151ce6a..18689fb3 100644 --- a/Util.cs +++ b/Util.cs @@ -1,3 +1,4 @@ +using System; using CefSharp; namespace VRCX @@ -11,7 +12,7 @@ namespace VRCX repository.Register("SharedVariable", SharedVariable.Instance, false); repository.Register("WebApi", WebApi.Instance, true); repository.Register("VRCXStorage", VRCXStorage.Instance, true); - repository.Register("SQLite", SQLite.Instance, true); + repository.Register("SQLite", SQLiteLegacy.Instance, true); repository.Register("LogWatcher", LogWatcher.Instance, true); repository.Register("Discord", Discord.Instance, true); repository.Register("AssetBundleCacher", AssetBundleCacher.Instance, true); diff --git a/VRCX.csproj b/VRCX.csproj index 6ac0542d..1d0526d3 100644 --- a/VRCX.csproj +++ b/VRCX.csproj @@ -1,4 +1,4 @@ - + @@ -87,11 +87,13 @@ + + @@ -101,7 +103,7 @@ - + @@ -123,6 +125,8 @@ + + Form @@ -222,6 +226,7 @@ - xcopy /y "$(ProjectDir)OpenVR\win64\openvr_api.dll" + xcopy /y "$(ProjectDir)OpenVR\win64\openvr_api.dll" +xcopy /y "$(ProjectDir)lib\sqlite3.dll" \ No newline at end of file diff --git a/WebApi.cs b/WebApi.cs index ac823abc..12e658fd 100644 --- a/WebApi.cs +++ b/WebApi.cs @@ -60,8 +60,8 @@ namespace VRCX internal void LoadCookies() { - SQLite.Instance.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS `cookies` (`key` TEXT PRIMARY KEY, `value` TEXT)"); - SQLite.Instance.Execute((values) => + SQLiteLegacy.Instance.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS `cookies` (`key` TEXT PRIMARY KEY, `value` TEXT)"); + SQLiteLegacy.Instance.Execute((values) => { try { @@ -92,7 +92,7 @@ namespace VRCX using (var memoryStream = new MemoryStream()) { new BinaryFormatter().Serialize(memoryStream, _cookieContainer); - SQLite.Instance.ExecuteNonQuery( + SQLiteLegacy.Instance.ExecuteNonQuery( "INSERT OR REPLACE INTO `cookies` (`key`, `value`) VALUES (@key, @value)", new Dictionary() { {"@key", "default"}, diff --git a/WorldDBManager.cs b/WorldDBManager.cs new file mode 100644 index 00000000..768e963d --- /dev/null +++ b/WorldDBManager.cs @@ -0,0 +1,423 @@ +using System.Linq; +using System.Text; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Runtime.Serialization.Formatters.Binary; +using System.Threading.Tasks; +using CefSharp; +using Newtonsoft.Json; + +namespace VRCX +{ + public class WorldDBManager + { + public static WorldDBManager Instance; + private readonly HttpListener listener; + private readonly WorldDatabase worldDB; + + private string currentWorldId = null; + private string lastError = null; + + public WorldDBManager(string url) + { + Instance = this; + // http://localhost:22500 + listener = new HttpListener(); + listener.Prefixes.Add(url); + + worldDB = new WorldDatabase(Path.Combine(Program.AppDataDirectory, "VRCX-WorldData.db")); + } + + public async Task Start() + { + listener.Start(); + + while (true) + { + var context = await listener.GetContextAsync(); + var request = context.Request; + var responseData = new WorldDataRequestResponse(false, null, null); + + if (MainForm.Instance?.Browser == null || MainForm.Instance.Browser.IsLoading || !MainForm.Instance.Browser.CanExecuteJavascriptInMainFrame) + { + responseData.Error = "VRCX not yet initialized. Try again in a moment."; + responseData.StatusCode = 503; + SendJsonResponse(context.Response, responseData); + continue; + }; + + switch (request.Url.LocalPath) + { + case "/vrcx/data/init": + responseData = await HandleInitRequest(context); + SendJsonResponse(context.Response, responseData); + break; + case "/vrcx/data/get": + responseData = await HandleDataRequest(context); + SendJsonResponse(context.Response, responseData); + break; + case "/vrcx/data/lasterror": + responseData.OK = lastError == null; + responseData.Data = lastError; + lastError = null; + SendJsonResponse(context.Response, responseData); + break; + case "/vrcx/data/getbulk": + responseData = await HandleBulkDataRequest(context); + SendJsonResponse(context.Response, responseData); + break; + case "/vrcx/status": + context.Response.StatusCode = 200; + context.Response.Close(); + break; + default: + responseData.Error = "Invalid VRCX endpoint."; + responseData.StatusCode = 404; + SendJsonResponse(context.Response, responseData); + break; + } + } + + } + + /// + /// Handles an HTTP listener request to initialize a connection to the world db manager. + /// + /// The HTTP listener context object. + /// A object containing the response data. + private async Task HandleInitRequest(HttpListenerContext context) + { + var request = context.Request; + var responseData = new WorldDataRequestResponse(false, null, null); + + if (request.QueryString["debug"] == "true") + { + if (!worldDB.DoesWorldExist("wrld_12345")) + { + worldDB.AddWorld("wrld_12345", "12345"); + worldDB.AddDataEntry("wrld_12345", "test", "testvalue"); + } + + currentWorldId = "wrld_12345"; + responseData.OK = true; + responseData.StatusCode = 200; + responseData.Data = "12345"; + return responseData; + } + + string worldId = await GetCurrentWorldID(); + + if (String.IsNullOrEmpty(worldId)) + { + responseData.Error = "Failed to get/verify current world ID."; + responseData.StatusCode = 500; + return responseData; + } + + currentWorldId = worldId; + + var existsInDB = worldDB.DoesWorldExist(currentWorldId); + string connectionKey; + + if (!existsInDB) + { + connectionKey = GenerateWorldConnectionKey(); + worldDB.AddWorld(currentWorldId, connectionKey); + } + else + { + connectionKey = worldDB.GetWorldConnectionKey(currentWorldId); + } + + responseData.OK = true; + responseData.StatusCode = 200; + responseData.Data = connectionKey; + return responseData; + } + + /// + /// Handles an HTTP listener request for data from the world database. + /// + /// The HTTP listener context object. + /// A object containing the response data. + private async Task HandleDataRequest(HttpListenerContext context) + { + var request = context.Request; + var responseData = new WorldDataRequestResponse(false, null, null); + + var key = request.QueryString["key"]; + if (key == null) + { + responseData.Error = "Missing key parameter."; + responseData.StatusCode = 400; + return responseData; + } + + var worldIdOverride = request.QueryString["world"]; + + if (worldIdOverride != null) + { + var world = worldDB.GetWorld(worldIdOverride); + + if (world == null) + { + responseData.OK = false; + responseData.Error = $"World ID '{worldIdOverride}' not initialized in this user's database."; + responseData.StatusCode = 200; + responseData.Data = null; + return responseData; + } + + if (!world.AllowExternalRead) + { + responseData.OK = false; + responseData.Error = $"World ID '{worldIdOverride}' does not allow external reads."; + responseData.StatusCode = 200; + responseData.Data = null; + return responseData; + } + } + + if (currentWorldId == "wrld_12345" && worldIdOverride == null) + worldIdOverride = "wrld_12345"; + + var worldId = worldIdOverride ?? await GetCurrentWorldID(); + + if (worldIdOverride == null && (String.IsNullOrEmpty(currentWorldId) || worldId != currentWorldId)) + { + responseData.Error = "World ID not initialized."; + responseData.StatusCode = 400; + return responseData; + } + + var value = worldDB.GetDataEntry(worldId, key); + + responseData.OK = true; + responseData.StatusCode = 200; + responseData.Error = null; + responseData.Data = value?.Value; + return responseData; + } + + /// + /// Handles an HTTP listener request for bulk data from the world database. + /// + /// The HTTP listener context object. + /// A object containing the response data. + private async Task HandleBulkDataRequest(HttpListenerContext context) + { + var request = context.Request; + var responseData = new WorldDataRequestResponse(false, null, null); + + var keys = request.QueryString["keys"]; + if (keys == null) + { + responseData.Error = "Missing/invalid keys parameter."; + responseData.StatusCode = 400; + return responseData; + } + + var keyArray = keys.Split(','); + + var worldId = await GetCurrentWorldID(); + + if (String.IsNullOrEmpty(currentWorldId) || (worldId != currentWorldId && currentWorldId != "wrld_12345")) + { + responseData.Error = "World ID not initialized."; + responseData.StatusCode = 400; + return responseData; + } + + var values = worldDB.GetDataEntries(currentWorldId, keyArray).ToList(); + + /*if (values == null) + { + responseData.Error = $"No data found for keys '{keys}' under world id '{currentWorldId}'."; + responseData.StatusCode = 404; + return responseData; + }*/ + + // Build a dictionary of key/value pairs to send back. If a key doesn't exist in the database, the key will be included in the response as requested but with a null value. + var data = new Dictionary(); + for (int i = 0; i < keyArray.Length; i++) + { + string dataKey = keyArray[i]; + string dataValue = values?.Where(x => x.Key == dataKey).FirstOrDefault()?.Value; // Get the value from the list of data entries, if it exists, otherwise null + + data.Add(dataKey, dataValue); + } + + responseData.OK = true; + responseData.StatusCode = 200; + responseData.Error = null; + responseData.Data = JsonConvert.SerializeObject(data); + return responseData; + } + + /// + /// Generates a unique identifier for a world connection request. + /// + /// A string representation of a GUID that can be used to identify the world on requests. + private string GenerateWorldConnectionKey() + { + // Ditched the old method of generating a short key, since we're just going with json anyway who cares about a longer identifier + // Since we can rely on this GUID being unique, we can use it to identify the world on requests instead of trying to keep track of the user's current world. + // I uhh, should probably make sure this is actually unique though. Just in case. I'll do that later. + return Guid.NewGuid().ToString(); + } + + /// + /// Gets the ID of the current world by evaluating a JavaScript function in the main browser instance. + /// + /// The ID of the current world as a string, or null if it could not be retrieved. + private async Task GetCurrentWorldID() + { + JavascriptResponse funcResult = await MainForm.Instance.Browser.EvaluateScriptAsync("$app.API.actuallyGetCurrentLocation();", TimeSpan.FromSeconds(5)); + + try + { + funcResult = await MainForm.Instance.Browser.EvaluateScriptAsync("$app.API.actuallyGetCurrentLocation();", TimeSpan.FromSeconds(5)); + } + catch (Exception ex) + { + return null; + } + + string worldId = funcResult?.Result?.ToString(); + + if (String.IsNullOrEmpty(worldId)) + { + // implement + // wait what was i going to do here again + // seriously i forgot, hope it wasn't important + return null; + } + + return worldId; + } + + /// + /// Sends a JSON response to an HTTP listener request with the specified response data and status code. + /// + /// The HTTP listener response object. + /// The response data to be serialized to JSON. + /// The HTTP status code to be returned. + /// The HTTP listener response object. + private HttpListenerResponse SendJsonResponse(HttpListenerResponse response, WorldDataRequestResponse responseData) + { + response.ContentType = "application/json"; + response.StatusCode = responseData.StatusCode; + response.AddHeader("Cache-Control", "no-cache"); + + // Use newtonsoft.json to serialize WorldDataRequestResponse to json + var json = JsonConvert.SerializeObject(responseData); + var buffer = System.Text.Encoding.UTF8.GetBytes(json); + response.ContentLength64 = buffer.Length; + response.OutputStream.Write(buffer, 0, buffer.Length); + response.Close(); + return response; + } + + /// + /// Processes a JSON request containing world data and logs it to the world database. + /// + /// The JSON request containing the world data. + public async void ProcessLogWorldDataRequest(string json) + { + // Current format: + // { + // "requestType": "store", + // "connectionKey": "abc123", + // "key": "example_key", + // "value": "example_value" + // } + + // * I could rate limit the processing of this, but I don't think it's necessary. + // * At the amount of data you'd need to be spitting out to lag vrcx, you'd fill up the log file and lag out VRChat far before VRCX would have any issues; at least in my testing. + // As long as malicious worlds can't permanently *store* stupid amounts of unculled data, this is pretty safe with the 10MB cap. If a world wants to just fill up a users HDD with logs, they can do that already anyway. + + WorldDataRequest request; + + try // try to deserialize the json into a WorldDataRequest object + { + request = JsonConvert.DeserializeObject(json); + } + catch (JsonReaderException ex) + { + this.lastError = ex.Message; + // invalid json + return; + } + catch (Exception ex) + { + this.lastError = ex.Message; + // something else happened lol + return; + } + + if (String.IsNullOrEmpty(request.Key)) + { + this.lastError = "`key` is missing or null"; + return; + } + + if (String.IsNullOrEmpty(request.Value)) + { + this.lastError = "`value` is missing or null"; + return; + } + + if (String.IsNullOrEmpty(request.ConnectionKey)) + { + this.lastError = "`connectionKey` is missing or null"; + return; + } + + // Make sure the connection key is a valid GUID. No point in doing anything else if it's not. + if (!Guid.TryParse(request.ConnectionKey, out Guid _)) + { + this.lastError = "Invalid GUID provided as connection key"; + // invalid guid + return; + } + + // Get the world ID from the connection key + string worldId = worldDB.GetWorldByConnectionKey(request.ConnectionKey); + if (worldId == null) + { + this.lastError = "Invalid connection key"; + // invalid connection key + return; + } + + // Get/calculate the old and new data sizes for this key/the world + int oldTotalDataSize = worldDB.GetWorldDataSize(worldId); + int oldDataSize = worldDB.GetDataEntrySize(worldId, request.Key); + int newDataSize = Encoding.UTF8.GetByteCount(request.Value); + int newTotalDataSize = oldTotalDataSize + newDataSize - oldDataSize; + + // Make sure we don't exceed 10MB total size for this world + // This works, I tested it. Hopefully this prevents/limits any possible abuse. + if (newTotalDataSize > 1024 * 1024 * 10) + { + this.lastError = $"You have hit the 10MB total data cap. The previous data entry was *not* stored. Your request was {newDataSize} bytes, your current shared byte total is {oldTotalDataSize} and you went over the table limit by {newTotalDataSize - (1024 * 1024 * 10)} bytes."; + // too much data + //throw new Exception("Too much data"); + return; + } + + + worldDB.AddDataEntry(worldId, request.Key, request.Value, newDataSize); + worldDB.UpdateWorldDataSize(worldId, newTotalDataSize); + } + + public void Stop() + { + listener.Stop(); + listener.Close(); + worldDB.Close(); + } + } +} \ No newline at end of file diff --git a/WorldDataRequestResponse.cs b/WorldDataRequestResponse.cs new file mode 100644 index 00000000..0523e3f9 --- /dev/null +++ b/WorldDataRequestResponse.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace VRCX +{ + public class WorldDataRequestResponse + { + /// + /// Gets or sets a value indicating whether the request was successful. + /// + [JsonProperty("ok")] + public bool OK { get; set; } + /// + /// Gets or sets the error message if the request was not successful. + /// + [JsonProperty("error")] + public string Error { get; set; } + /// + /// Gets or sets the data returned by the request. + /// + [JsonProperty("data")] + public string Data { get; set; } + /// + /// Gets or sets the response code. + /// + /// + [JsonProperty("statusCode")] + public int StatusCode { get; set; } + + public WorldDataRequestResponse(bool ok, string error, string data) + { + OK = ok; + Error = error; + Data = data; + } + } + + public class WorldDataRequest + { + [JsonProperty("requestType")] + public string RequestType; + [JsonProperty("connectionKey")] + public string ConnectionKey; + [JsonProperty("key")] + public string Key; + [JsonProperty("value")] + public string Value; + } +} diff --git a/WorldDatabase.cs b/WorldDatabase.cs new file mode 100644 index 00000000..34030371 --- /dev/null +++ b/WorldDatabase.cs @@ -0,0 +1,270 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SQLite; + +namespace VRCX +{ + [Table("data")] + public class WorldData + { + [PrimaryKey, AutoIncrement] + [Column("id")] + public int Id { get; set; } + [Column("world_id"), NotNull] + public string WorldId { get; set; } + [Column("key"), NotNull] + public string Key { get; set; } + [Column("value"), NotNull] + public string Value { get; set; } + [Column("value_size"), NotNull] + public int ValueSize { get; set; } + [Column("last_accessed")] + public DateTimeOffset LastAccessed { get; set; } + [Column("last_modified")] + public DateTimeOffset LastModified { get; set; } + } + + [Table("worlds")] + public class World + { + [PrimaryKey, AutoIncrement] + [Column("id")] + public int Id { get; set; } + [Column("world_id"), NotNull] + public string WorldId { get; set; } + [Column("connection_key"), NotNull] + public string ConnectionKey { get; set; } + [Column("total_data_size"), NotNull] + public int TotalDataSize { get; set; } + [Column("allow_external_read")] + public bool AllowExternalRead { get; set; } + } + + internal class WorldDatabase + { + private static SQLiteConnection sqlite; + private readonly static string dbInitQuery = @" +CREATE TABLE IF NOT EXISTS worlds ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + world_id TEXT NOT NULL UNIQUE, + connection_key TEXT NOT NULL, + total_data_size INTEGER DEFAULT 0, + allow_external_read INTEGER DEFAULT 0 +); +\ +CREATE TABLE IF NOT EXISTS data ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + world_id TEXT NOT NULL, + key TEXT NOT NULL, + value TEXT NOT NULL, + value_size INTEGER NOT NULL DEFAULT 0, + last_accessed INTEGER DEFAULT (strftime('%s', 'now')), + last_modified INTEGER DEFAULT (strftime('%s', 'now')), + FOREIGN KEY (world_id) REFERENCES worlds(world_id) ON DELETE CASCADE, + UNIQUE (world_id, key) +); +\ +CREATE TRIGGER IF NOT EXISTS data_update_trigger +AFTER UPDATE ON data +FOR EACH ROW +BEGIN + UPDATE data SET last_modified = (strftime('%s', 'now')) WHERE id = OLD.id; +END; +\ +CREATE TRIGGER IF NOT EXISTS data_insert_trigger +AFTER INSERT ON data +FOR EACH ROW +BEGIN + UPDATE data SET last_accessed = (strftime('%s', 'now')), last_modified = (strftime('%s', 'now')) WHERE id = NEW.id; +END;"; + public WorldDatabase(string databaseLocation) + { + var options = new SQLiteConnectionString(databaseLocation, true); + sqlite = new SQLiteConnection(options); + sqlite.Execute(dbInitQuery); + + // TODO: Split these init queries into their own functions so we can call/update them individually. + var queries = dbInitQuery.Split('\\'); + sqlite.BeginTransaction(); + foreach (var query in queries) + { + sqlite.Execute(query); + } + sqlite.Commit(); + } + + /// + /// Checks if a world with the specified ID exists in the database. + /// + /// The ID of the world to check for. + /// True if the world exists in the database, false otherwise. + public bool DoesWorldExist(string worldId) + { + var query = sqlite.Table().Where(w => w.WorldId == worldId).Select(w => w.WorldId); + + return query.Any(); + } + + /// + /// Gets the ID of the world with the specified connection key from the database. + /// + /// The connection key of the world to get the ID for. + /// The ID of the world with the specified connection key, or null if no such world exists in the database. + public string GetWorldByConnectionKey(string connectionKey) + { + var query = sqlite.Table().Where(w => w.ConnectionKey == connectionKey).Select(w => w.WorldId); + + return query.FirstOrDefault(); + } + + /// + /// Gets the connection key for a world from the database. + /// + /// The ID of the world to get the connection key for. + /// The connection key for the specified world, or null if the world does not exist in the database. + public string GetWorldConnectionKey(string worldId) + { + var query = sqlite.Table().Where(w => w.WorldId == worldId).Select(w => w.ConnectionKey); + + return query.FirstOrDefault(); + } + + /// + /// Sets the connection key for a world in the database. If the world already exists in the database, the connection key is updated. Otherwise, a new world is added to the database with the specified connection key. + /// + /// The ID of the world to set the connection key for. + /// The connection key to set for the world. + /// The connection key that was set. + public string SetWorldConnectionKey(string worldId, string connectionKey) + { + var query = sqlite.Table().Where(w => w.WorldId == worldId).Select(w => w.ConnectionKey); + + if (query.Any()) + { + sqlite.Execute("UPDATE worlds SET connection_key = ? WHERE world_id = ?", connectionKey, worldId); + } + else + { + sqlite.Insert(new World() { WorldId = worldId, ConnectionKey = connectionKey }); + } + + return connectionKey; + } + + /// + /// Adds a new world to the database. + /// + /// The ID of the world to add. + /// The connection key of the world to add. + /// Thrown if a world with the specified ID already exists in the database. + public void AddWorld(string worldId, string connectionKey) + { + // * This will throw an error if the world already exists.. so don't do that + sqlite.Insert(new World() { WorldId = worldId, ConnectionKey = connectionKey }); + } + + /// + /// Gets the world with the specified ID from the database. + /// + /// The ID of the world to get. + /// The world with the specified ID, or null if no such world exists in the database. + public World GetWorld(string worldId) + { + var query = sqlite.Table().Where(w => w.WorldId == worldId); + return query.FirstOrDefault(); + } + + /// + /// Gets the total data size shared across all rows, in bytes, for the world with the specified ID from the database. + /// + /// The ID of the world to get the total data size for. + /// The total data size for the world, in bytes. + public int GetWorldDataSize(string worldId) + { + var query = sqlite.Table().Where(w => w.WorldId == worldId).Select(w => w.TotalDataSize); + + return query.FirstOrDefault(); + } + + /// + /// Updates the total data size, in bytes for the world with the specified ID in the database. + /// + /// The ID of the world to update the total data size for. + /// The new total data size for the world, in bytes. + public void UpdateWorldDataSize(string worldId, int size) + { + sqlite.Execute("UPDATE worlds SET total_data_size = ? WHERE world_id = ?", size, worldId); + } + + /// + /// Adds or updates a data entry in the database with the specified world ID, key, and value. + /// + /// The ID of the world to add the data entry for. + /// The key of the data entry to add or replace. + /// The value of the data entry to add or replace. + /// The size of the data entry to add or replace, in bytes. If null, the size is calculated from the value automatically. + public void AddDataEntry(string worldId, string key, string value, int? dataSize = null) + { + int byteSize = dataSize ?? Encoding.UTF8.GetByteCount(value); + + // check if entry already exists; + // INSERT OR REPLACE(InsertOrReplace method) deletes the old row and creates a new one, incrementing the id, which I don't want + var query = sqlite.Table().Where(w => w.WorldId == worldId && w.Key == key); + if (query.Any()) + { + sqlite.Execute("UPDATE data SET value = ?, value_size = ? WHERE world_id = ? AND key = ?", value, byteSize, worldId, key); + } + else + { + sqlite.Insert(new WorldData() { WorldId = worldId, Key = key, Value = value, ValueSize = byteSize }); + } + } + + /// + /// Gets the data entry with the specified world ID and key from the database. + /// + /// The ID of the world to get the data entry for. + /// The key of the data entry to get. + /// The data entry with the specified world ID and key, or null if no such data entry exists in the database. + public WorldData GetDataEntry(string worldId, string key) + { + var query = sqlite.Table().Where(w => w.WorldId == worldId && w.Key == key); + + return query.FirstOrDefault(); + } + + /// + /// Gets the data entries with the specified world ID and keys from the database. + /// + /// The ID of the world to get the data entries for. + /// The keys of the data entries to get. + /// An enumerable collection of the data entries with the specified world ID and keys. + public IEnumerable GetDataEntries(string worldId, string[] keys) + { + var query = sqlite.Table().Where(w => w.WorldId == worldId && keys.Contains(w.Key)); + + return query.ToList(); + } + + /// + /// Gets the size of the data entry, in bytes, with the specified world ID and key from the database. + /// + /// The ID of the world to get the data entry size for. + /// The key of the data entry to get the size for. + /// The size of the data entry with the specified world ID and key, or 0 if no such data entry exists in the database. + public int GetDataEntrySize(string worldId, string key) + { + var query = sqlite.Table().Where(w => w.WorldId == worldId && w.Key == key).Select(w => w.ValueSize); + + return query.FirstOrDefault(); + } + + public void Close() + { + sqlite.Close(); + } + } +} diff --git a/html/src/app.js b/html/src/app.js index 9a9aeecd..ac9d5d37 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -2092,6 +2092,47 @@ speechSynthesis.getVoices(); }); }); + API.getUserApiCurrentLocation = function () { + return this.currentUser?.presence?.world; + }; + + // TODO: traveling to world checks + API.actuallyGetCurrentLocation = async function () { + const gameLogLocation = $app.lastLocation.location; + console.log('gameLog Location', gameLogLocation); + + const presence = this.currentUser.presence; + let presenceLocation = this.currentUser.$locationTag; + if (presenceLocation === 'traveling') { + console.log("User is traveling, using $travelingToLocation", this.currentUser.$travelingToLocation); + presenceLocation = this.currentUser.$travelingToLocation; + } + console.log('presence Location', presenceLocation); + + // We want to use presence if it's valid to avoid extra API calls, but its prone to being outdated when this function is called. + // So we check if the presence location is the same as the gameLog location; If it is, the presence is (probably) valid and we can use it. + // If it's not, we need to get the user manually to get the correct location. + // If the user happens to be offline or the api is just being dumb, we assume that the user logged into VRCX is different than the one in-game and return the gameLog location. + // This is really dumb. + if (presenceLocation === gameLogLocation) { + console.log('ok presence return'); + return presence.world; + } + let args = await this.getUser({ userId: this.currentUser.id }); + let user = args.json + + console.log('presence bad, got user', user); + if (!$app.isRealInstance(user.location)) { + console.warn( + 'presence invalid, user offline and/or instance invalid. returning gamelog location: ', + gameLogLocation + ); + return gameLogLocation; + } + console.warn('presence outdated, got user api location instead: ', user.location); + return this.parseLocation(user.location).worldId; + }; + API.applyWorld = function (json) { var ref = this.cachedWorlds.get(json.id); if (typeof ref === 'undefined') { diff --git a/lib/sqlite3.dll b/lib/sqlite3.dll new file mode 100644 index 0000000000000000000000000000000000000000..1544c2dbee02632c49352bbe79e077731363a04c GIT binary patch literal 2889728 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

aiGJ3|IPxLd@fZ zb?4_3^S30r5cA67!I`sD#Qa|8MNuvghl4Fl^y9InYMV@$OnKp!JInx8e*e`D2R&$5 zMl;I9(S}mJ2F2y~p-4qZaie+0EL(SKqxtmCflNEd8`64>Y{8(|QxR6_QD4K-OsrTs z04Ja)?)kQN({1i~uJS0~+gwh=!T>9&^FHm4U{MUhuni&?X5cava6=VMM#{8k~F*oV5ODKw-5{)j(O3~*)>9fnsV3zZff zcm7Ao%lG#SQ-`&YNOk$nm4KC7CP~T5_pJrWZj8#3dy`X$%l95)oXhukNo<)|L_a8( z?A>C!$ZL!2c5?A|V#ll}Ci>{jWCp)uOyPkdMrpig-aSV^Z|={X5{&Q+RRYeYFhj2^ z^a?lnpCn-*^IxF!iKZn@`-mk`p9q1Ne#B+u75;tDyr6NqdXe8HC?9LGa6-Iax}rvv zCEHogzhkVQ_54n@->l+xXQeLt@L2Zow`8UEG{M^vapciEv?n0_8bU*C`q0xH%AD0# zXEIncZl4ck)o%`;FAr?K_$1L>_sT&L!4F01VGv32fH=in1ZS-LpC3F{Nb!NtePCa{ znDVHkq_)^f^@Hg4ti3PK8nJXRe*@bx_}a%oU;(9eDvsC-xE9u3+@TJKq zNhBK{y`$%Lr9(6wp9+dD{BZu0KcrzE;6`Jvd(p<=1XEKF?$~*1SS}^f;w;!7{=%ix zgxj5*!E$NZ_PThZytdR4ar-Cj!moa}$v8RVj(s&Zki#}OWR`th$finwLAxw(62cGY zbi3?+OKztv$=gM-n(w(>;56Q#<)N_bvb=Dyv7rpj^IOKqzL&?tNkHgxv*CNR_|w~o zba|!>TVl2iCg_J{u}!;0G&Z99@ii$L8$k*LXx%ClxcpMYnL7QKUX zV|_Odl=yzkfBR1$D{G2*gV+$P*|N$_K8K$A*r(0$yLR$I==DV#aTYmeJtph;eW8`4 zWkJ_UiL!G&))7mP*a=d$f!H+!ml3q{;SDxfdP~5we#w6YYSsm7)&y`0lBdRNWuiXV z$oG=np6SDCN1Yw-2Q@2wVoD|n5+GOnR%_UR(o7 z$1iPzFDP)?ubeTwqv406Yx=+XT1#zc*`EdHV>XT3&8r)2;7sO^z&&{H1sfo-Nd9x< z<-l4)pyb+ZSMpOji~q*L4INWDqcGG92XEQpZ_S$rXD;U&VS2-2H`^;dv&t@WFI^z} zeiF#pWHjh|KZJNr=MuVhU0*~w;Zry1U)qs`f#%iK#I5o7{9LRy65>V_?1_Wo4NPK%SS=vpr>>HmSs z;!Io7ZQPDG3qzXw|48ot1oy6ydxH}L6JTwTZXJ^@(FD6LyH{7?&04#u0eSb>QPI?;eZQs`-oL{bYmr z*z{y(F{I>QF@I6nwIS`+6BU1_(k;`2Ww9&aCmIKXFepp>@vG8cW5?#t^=prQVC6sh z3E);FP#fQNv&Az$6w2l#^lORdpcL{Jr zOL(|fa!am<8b!7e5Ax<=Dr=h<=?T=lsCz!D4fxA`t2j_v-POc`l;)W$o5bxJ4O8L8 z9TmQ!nwJV!r7C=OhP2%_N{Sjr1XvKLc|mV{Gt;yt0C&0Ua-I>sM4PgYsC-}Pv8d$Z zHJkZpt!sF)7hk^LGg&UIaaF+M7Vf^9LGe-Tz&k*=$b|{%SyW-H9lgyjy3bbrC!iKK zy&9SW?;}D9(u{RXY-Nb&ioK_uJNGzO#(ID8dd1tV0hU6*G6*h9?nR-(80l!eW@^Y8 zft-Mte`~g0Q%RKSte$~T%9vKGJS6?PWe%L$1ib$7V4$)tXW2@;A2ThnsIc=4Y-&tl zneaVm{zUB#VcOX&wl{aP*uPah721)v6m|sFE*Y2TTHxNOZw zlQTk%Tw?YkK`>SlS-cQy^YzxMY}&&FZpY?KGid-5O>4!D_@#<+Pl2I-+kkVwU)RZr zj62Z6wv*Ed2wOCRZLl9pq&!_NJ&|ubC+0b?`Q~PpfUQ`dXZ!_4_v$6khn2dXv00Dx z$Beu!X~3m&oe0!~3Kg3D_wdh>0zkma5pv z+^<#mqvy}fUy-i`&&(7x=gmu!&Y=qfNC-o0ZZt2U=7d+ryN$?Yj$D3riOUO)Q}#PI zst4g-(Fvn05slnv4&DOg9-Chjy*4i`%pG3tmg9z{fyx4Fi@MS`nvwG~plSGO5lH@H zqMs1v8_kPWrparIQI(vM6aEY^1cSF_X_v?o&6H%?!MB*M_=%4OaMEJ)n{}(%UpnR_ zUbfy=Q?*G=)#F=)2u@DWX7hV*GeJLdCJ3g1nxKhkW`31S5U+zWJN6(ZUEwbs#p@{8w`;g7~zc9ip8cWlWbdSjD7+If8<=z)bcLcVpj9n0= za4Xq+;T)g%QEc15UWHRH_rpxnx@IWLteBWNiiz3wGm_=tEfh&Zu%o${S`u9jMZr}E zo+eqn)QK241m-=3D`{3fyv}|SK|~NJ^`2i%m|JEkEg&oZWJxh{=Q@R8i_{Y%K3!pO4kQRKE+_ha zTIg(11L-q*PxOGr+g7tLHl|RZu072{c+Qn=s;!c}G026^b>5o39Plem0sgmG}2 zp;ko|p?+`?!oB~%qPY^k8NDa*=>NVA?7(}Vd}p}|rF_TW#9##!0OHKS*j3vrj8FN& za`LCTF{8j1VYe&c?2(&yan@HCxHUYl%Sd|&nDt7OQ zwz2|Piw*D8>e>kE@!YW|^ZpsTs@g1;J4V>8CxM`VG#1GlVK81*jeT#C0dYfHY)}$~ zt>!aN^#_!JaSE>^3}8n#@+I@3yur>X4wa#=c;8xD2sFNx70jq{D~7S$m09MmWBrj5 zLc1#%pFbx+0M(T67T=1q+HOa44Q$W6jU2vbdP@h53TBl~)$^qrwO$005Zn?_;D*|V zd)G2aDF>VHWuOggoKJ3ql`m4cH<&M1X|A@(eE5y%{ZwbnN2Sr5?%BNr-xT?2YBU?n z5$m}MVihwIcVd+0C@}faFMB2i|61HuKcM?L{#JqbkxFUJULVKa)Y^K zis&_n7?)P}9vHIVzgk`z(llCLAWs{h=V^I9w}{d3UBY)sqLw!3#?LPjWC8ibb#^z} z`m%EIiD|)_1`N7n3CzqD!=7XrLL-SYbmjl?n3YeZr#e_k2ZJ>=@HepH5u579f<`rf)?TbPnMM;aoyC4=BzCGlzN-nNkT@iz+`yHzG6XmDE*Zc}rTn1p}qN>4A7S z?MXL5C@O8rOJ!5twF4k8q?Y^J^JTfmBh zc1@K}C-r<%cXmycPbc*ZQnzf|d#| zH}Ic~iDFDnp;)#%ahCFIH2{xl%Ap$F-DFOrVu{8zs%W3hEeiFw9bZY}>NkeCX89UF zNS}qo9(+>)Mjc=#V8le|S%q)MOxkai(r@AkpZewbR zR2qG=G`gPZ`X9SM5@zQCIKrq zU6PWg@0XXz>C;q}+-j!~_|a9w$g>g0?xUBFRa)hfDoW3?f!y{t(_GP-QGapn)#m70 zx=GLUIQI}6b0L(N$V5iYQhH|_%t`Ej*;sY!$>)^P>WA#(rmiVxGTZgWce3Jh;eVIA z!KiwhvhqXC$c-{@ zFxibCov*gMd1{k$&)i3vRN;F?V70nB#ZTG>bLB+tvUvX1;~5Zn7%0wZP@E02^{{7wYZygw+QPsn zEr=zzYz4vDMh!~ zE6kpw?e>kc^T>{-ny*Blmyh=gAMkmg;Fq9$le5jCO9jkq2B=C?^Bv+k#VnVxVuBc6f6z0F^rG87bYwdgen_o4*5 z3EPB?C+rJ>ysh|^RS_HfVs`)(Wuv*2GLU7)b}N4nX*|^q2*TS-rC&&HrV ztuHx-o@z7RIJAGV3d#EHb)D_3E1jfjR<>gmd#beOD!VQJ7hhN`rC<|X3%0Y5Sk*I> zG=bl<+ouJgZy?-(qJvIn4+1h~Ds~*l?H~M#+v8FCr$pNDD*o+vc#l~1eAN|sd)tgx z8xQm{ni|dF8QTTcl(EFuG?`?u;Yyc&q|UFcM64|2#vbGTH18;ub9&j_KNQK;WArtn zDgqZA(GSwXALz!tHlevAbYay&a+RqT_U8JKA_kE zsR>{veoHD7T02=yqkWc&_^|T7Eh$Fs21&7Z#!g~n)hPCLJMj?`qvOutgRC@*ZkS#F z11g@OXTLs1-`l3I!rXf9DZgWYjr;rR8EXV#X>1!W z`C@&Oz5V>ob+qSI?cFbEr#z2MZ=gy4muzx$!$-PyLgPo;rCCosHPZEwHXx%17~Hux z*uR>}oBLd-5Rr`Dc&=Et4Zvy6`pNYpVV_Oi&BK3HtP;*dZXGecmU5fwh%T;n=~_i& zAYO^Jv+|u}#S&KK7Jgg#ZQyqmzmM_zAl&!@^CzttF2pP%KzI8c9j9Px=U&wIuCP@k z^o7n>xBCNJPms+1AhX7H2)h0-e+AVv2Nxkg!(r}vxI2&B4mU|&K7zj zp8J!yuyvj{Z!VIag!?%aw!J`6-zubz;Qi#@>14Xv&XgUSnBDf9&KYiYGEB5HAi6GZ z60Wve_%CYpt@Xa=f-3YpYpDgyev^tTW zh>V-kB(P3|(UjezVT%4l9*St}8VTtMfQ0nCp9mxW*h*}7SR&Kfs#f8&BZ**I^fIi1 zi#xc+Y|s8BAGZBmr6TeM^c-a6U#$waoh^A!dzT+fq+p{{xUbQ7)AX9nm|}_LuT$xn z&3Y_zQ}|k87{hXXcuf-84-_ZJHZ&fhddJ&xGpRu1TXDoIy{Hj=)icE_Z~i@!V&uLq zDHP(4{)iZX_7qzti7ica7B##tb=#Blkt)W;^kWHFxnEPwI=Y1Us@Vl9OYSN@ z5=W^^>?&da6*jjZB?8r<&G1WA!qG%XrT>%n@PDUz2mW@E7n4H}zyP8MiNSoaw!DYMU?0U2L`^1y3r%P_DH12x!F+25&W?>xidEg$t@W(e8B z)NpqZyGpzZ%W_vMD20AslK=y++!K1x*sEt8)IFZ1*Xf?c*-OuUFkP#=n|&W$T;$Sj zy;Y8mac!RN`Aoa@M)gsNZLQ4ly60J4o6O|CX#VnkB!RgNdMoMA#Fe~x7AUo0L})!9 zE`?jwj5IQW?HQE?<`2d&pD{FhDiN@1)-yKYC&K*Baa|^P6rGkSls+m>R+qj%gTM=Y zN)7Sg9~gK`V$0{x-u%PYFK{?Sa@C&au2! zrGld;Z+qb{eLgDD-Cmw*U-7FHDDSe&E>$&c_3ktU2cDMR*rdVVZc0r>>b$T_Jo7p& z$siS<(sNGUGBFKpD_hw^=Hz^fMqp1Z&D}F;RA#96Q-X3OE;Tkq+tNZ6^52N)zO>M= z=(3VDrX)*Jz0q1E0ncceB#IQS#7XLNP}yZ;k{NnCNyuRjPH3GHdRdc7VhD9QGfwkE zXg)ce{{S9m=RMJFy=4-(L5+P(MD4gv(_Hs^x-cn^NeK7xG%wAwD#s-HBB8Z3gOF8O z5?errQ~Pojxs!|X<><9;{o%AL9`dW^#i!Z`pq$URUSdA~GeH1b6#`gK9ES!&0x=)R z0G57YKA!r7SI=OW;1N8_-8g9kh`>47DhpabT`|#mYY~bZ%3~es_K~p}Ab;ePS`W!< zw0vHQs?|n{zTB`oFG-hhYQJ_tauxvwcN_0M#iONt6zwbVjVBS%ON234gh_+k%LfX= zI=#Rga|Q-MM@By@3J%JL?Y%F5 zBd$urFIK1H-?6@euNNpi5x4BQDuL?|H=W_SCLPGwt9wQ-8wf6v9`1)k2HT9gXLBMQ z>#4FfsZICc>Ta73blI!G{+H0=O48?Y2vRlQM9mhOsvR-)#IQFM>3isUC7}ufgU(k^ z>rJbYn9~X4Qz*>Is>hJ$e>c4L% zZYME1?sC;al>>%fP)T4%Q3+VNL8(9y^!vw2Bcxnlm;QlMHJaIv5+j$791R6aRlZYH zzAp@6yG+L+AKmw}qlD=m-2lnvGuo=eR@z5MP(kaW{v%Rp$3Y-DbQ%6+td`QuGsEq+ zWO&p{)4tW4bnWrB66OCjF^;&4jq?AB2)}XUsjLSY z7Zv!+4(P^_#e4>h=ac$G0V7?#TzI{~;s*4;u>K{^lwEiU?G2zna`AoXu$b8WG6PPm022)VKr(4%JX8mi=?V}rOp=ua^)r99^RJnQ6N0DkhMdG z8!HEFRC>)5hks_7ho2}AG<1sIQtl>?D^VH{Es|8H*x+|O&XzAPZ4*B) zqt{vaA-<^&9H1e*$jbeUO%xsX!S9lr`uwr<#RftbN>15deI#JzZu5|&c3wn6lJW-S zm;|>|2;${5^2(+rag8KGZd52zW*7+yptgO7o&fM$%1h-!h2C-UO;-6n;VV(TS|`a| z_2cBMhkL8Ci3^xXHFq*|JDmB+$9-{ z5dGT~tobJF7b}?YO}>s7pzjWN4rk&r9v{vTUw)v0VRrJg@rr#Z{o+(@^^&&I2}>zxdMtmw4c1h%&4j$I@T1 zsV)5w4wSpfb8y~(Raf!ZCP&j2=57wKSrBmWx+=J&5IZCS(OirOq6GdaU?J#Pv&3W0 zKHkQ8GAT#``)ng=X6aoHxOh(>BYxM5gUFO-d?>Av85?{^Y-o3^G2gosJlgCo1NNSk{_{}mI{R!mDLcSho<#sdQ* zyT(WU)H~7`i6rt?9JOL{+KP$kE2hE0ZO&9%cpo#>Wxr0d_bc1A_#e4lD~yVM?9ruX z$)1%pikfK)Pf4v$_x&39y#4w<`}NbE>{tBA*P-JYH(dN5-FM1@Q{{Dytswe3wRz9) zJm!si)3GM5c#(;9abqVQ%ZP2iJVQj5>nBmnSG+{b&9mc@w!M68_rW0HzG6}Qay0lP z@h<9)l?Y&U`-=UA*|D?=DJ)r5lH`xU+OJcRa6WkK1+i?Og_Nj5uas(^(&kaTPDIjO z3G?3xe*UZbD*Af?qY(|%ps}7;gqaya6l^gcz#qGs;coiFNI0=}sK3wDRo6SdtGj*A z==MFc+xP5l-*dZuuZ*ykDyqwWsrFW`=s7+59ycv6PeqVk?Wws+wqD&!6*5X*e725W zXU_jkrtr!2ZWpoOp9P&&RpQqbZb2BXgaZK96g~TjYK?u2~Sm4gST{Sx?>h{oMf4& z`9<*@&~3K-9P2sx;2Q&+sA}pjH5cTI#Qfve=lDvO_PxH+x2lL@!T7jUcaLx-@5>;z zc;oqRq64j}nqu_ZY;NhL%1!KRwOGx@X5Xq&l=HMNd0rk9z|z8pRY3+~^DwLyKJtJ6HWIi(ZGfQ23Qh!5eGWDNF{mP!D)f5?fIK;N9{!h&9_>2w7 z$}tQtl|T3pl@9^t50Z+DH>gVeMw2;>dKn>e#of%z&l~DffQ*IWt?V|BZ27KVXl)a9k$JpQ_~#j3LbHdAzz9&zV(&KC^h# zY6zceZXTgf=^T8-#CpfednYbmUBVojXMG>clN>oj+nA?58sTFEq_ENx)AM5b2^eoU zDHxmU4#s8{cvmbu-n(LMQQ}Cczwrd&1a5(Hf65x+GMB;_48$tHF{w-_@G7^6uFRkp z%0{7V*yU?w-~L~c9R^-~f%C1bKbf~Z+T#)L3Qy#`3(MCH6M0&6(QI2y5La*sOt-=4 z3Jr{xr#svrSk|IQjsZCGSHQUC=oay!%)c!Ir~3THnJp9K3_>VO5NU4hmXGDbI6FHa zC>8&9kB=x z6mPh=N(09X;qPNdqL=R}($NWCG?Z%7!-E7#>Q8MF>oZ;r#=hp2_QE5LG)fQidD4~* z!Fd%)u?bH1$?26&qhIFB^hGd)(T_&RR0i(m|43>)g6Pc9Koq^&AKa_ey(5)J+TGy{ zpYg5_b0^WpeifdVwVRLNj7D!LN(*O3&#q3h4_y6@h3Gs_aO*W2{ISedwDKq|5zYSA z%(VJF3-gzs&BTc+gk;*JGC@7R?h0J9ER)0@*Izc1&E)1#cO==K$?D6ELaCV2xp~% z?YCjcX25keH{}egl@a2k*xi!ZD(fpjwcE(hj|^2-YoKL%qHdYnq(}(27bdQ#R)9K`!NGzm?h8upFBFW^ge>mbRo47-yl<{UgZo7o)wn{OT!|0#22*=1~ zve*pG)e*kUdD0n-;L^Fisa7s(f|DZ3nHV`&N|_in=hw?$HGebto15HJotypKaI!zI zm>=cin+7;^d34HWnKiGN#}4kx$(qC+ z`o3-?w8yLaG`^d)cN^yK;j-SKV-`mA8GOd;#(pf~2p0ph?t%E&gSY8Mzds773y7kL ztqQ(&md~@c!(ks<-2G572_J`A$yqOgpK;hRStNK~e)fT{B&Fk_bde=*3rzm(U9q)qoA z*^CBrz`g0Hbxd?u3F1zz4^XS1jb3xgflpEInB>+C;b4ny`^Lm!9j551420UjrNKjI zI0$uh3ZeFzzx`1+gnC8?Lam#Z^bv~)6P1$-Y5Js8(=Y7*l&y$8JUL1y0}E&PSBxs~ zV+G;7>kk9By(Clg?4*+emos;;R?q;nvxjrkF>e#+djV{Y1ma79*a(aG6hIIfr^vSo zh)4s^D-_8*SdXS&*@^Gm%j4i~TmJXh)CN6grL#d@5Ii8e<6_8>cwAe`jYhs?cc(;8v^NBN` zKPan!5u}qjkarA_11To{W(JIlFcKps{=}PY%9HKiKbxO>DE=2EaJb8S*?44e=w1a+ zpp&t|`6}n|c)w>&?Qnr(K9~T*;0?;8!WX*K`qbtJlw8#0FJ6;UKnm1s5&a}*+0WZr zAek35(DOiw^wiavf^Txjm(UTndBF%#w5=>MBi~Sg0`sQzdAu&%_QNF9 z+k13sQ+-OL+By$Qz{(9tl7f08B_x|_xyq8e#wi5UdzqLnQ18-C5r1a@-I7!OWale^ z`D&gnG02ehyBKHR_)sj?l*8^8GmL$a!ZeY%+{v#aiCNxij=H0lGPo9=QdT|#85GGL z&)P$ADJA9m3Uk42W+XEnE8=V@U)wo9Jv8Sl-&IvALqwa*17nMYCU?$jxm$bTLNWg>}k4h!Zqm{H> zR5n_>{R)l3d$YCLrO`KpTja|`?26ws68G`&-5Gp(j)u4SVtgVWM6u?Plac_ z7T?8}zx2xVEUj)HeX6Kmx9~6$Y6l2=!)th#MB68XE6;2VP4$=A^PtrS$Vd%Zz1J?G z#m*p5-kf>XI19a)ayRmxwp(+n#gBs<;eAbrjV)>`AX~KE7yfPB_srO|1;32!^RZ(e z+dIOwY7%)?_u@Zj$R?|~d`0G2)S}mX5WoN#(otTGiM53)Qsa}mw6F+k6b!N?n9(jx z(;^)&5^}p#wRum+0PCIZu2@3A7oULl_SP^L8mkyyDBYiDHN$li%Y3dxP=(zRrWbUx z58b3QlCO#$sm_`Y^-pyR{#LjCbo9jTnPN2rGd`4lNz8;5!6Meho**LwVpWf>>E~zR zivrPSK?oU^y{-`O+RdX7m1TXj`d8>vh4BJd$t^Dt6f0#ln*tfQe_e~&VZZTa(%)@) zb`(zzwUZ-D(xHqdL9w$Dd~qLCd1#m~vM)2#i~rr>6D#W93Kun}o#hiF6s|;n7!u)v z=CrZ4aR$}4@Uy!gq_`gkkn$_^ajBf1m3(lz z{NQR5Oq|@o$Y4i%G3-5Yg&1sZE2nji87C~!7fQOqcsG&ZH#U)BLUU#*vUJewKD9AL zYS8c&7&$_-v*7Nq5Ng@J-@B!OKGA(vc$hzaIU?BIEx`W^B6jl z5<`>p<^`Z@HAT`L`tcN%L@O~ytoSu9SE1KVkSuND4M%*VT-U8;Qx4!HeybGFV^i`#WpsYCbtS8Wyb^9wkgh5)p2g0z zJYdP~3`PdCQI8?hEHYKXmuKPKU*4~}L!UyMiaybOst>CAq2{g~f(ca8lte@u;j3aj zz9lqN`0goqoU$L^BKG4aW$R);KL3s+>b2zX6za8{NTp0vA^|IR-_RuL^)m^Hno%#6 zC3lij2-NFhVv@A4%JQf0c0_#X)wK1EQ~ccXKmpt=;QwRqP2i&{ug3qGEHGr@4vsF`zSKCftz;1QEd^7>!2U5oTCq8=M4~UPrKM)xNgyT3hMr`XZ>+1T+a! z1aSjxD_WO3PHk~xvFiN4=eaXk01;dJ{(k@eUp}8O_dd&gw)33lob#LoDl)P+Q;V4l zzbv_{s@7%f_QtNX2d`rMZr$kTHAX=|2@iih<);<}jOWa)A34E#&4@Q-$tX1zP2a1F zJeu!QV_Yrh(;a#H&B*hkqw=CVE9PVcdwFtShQ1&LF>NRdR00{@9DkE$MWNUofTK`X zLIGngEXMWDhUG}Ul!qkZG`x@;?=*H+%y)!7@Kh|I57fZvKv5_cca!t_yR{WuG8`#M?ahR7TTe9U%j@o&{Ox~ixw3CZBb zz9H1J)stgSOj_JIFsx8n$o4Ca$2i$?QK=l&`79@@Z11}t4c$KdS%trg#(1XPU)57dv-mE zby`f^?6+3s*!RgyshgkXNmfsVSaq6P-xAJihErAvGYmps!6S1h3+Z{3tU=r2$O;kj78ptHy;x-Q{zx3^|ZuWT9xDZT@zY-4?9| zin?}e)^a))y{6QY96hyDYn?d&rODj<3+w(}RT21s0lgL@f-a&eK>4(?4+%yFg@Z8| zhGt&O1dZ(#*G~;Ph(;HmEix(Nj^dR}r}!iZ^Xt(b-^;FKeoidg094%B0&Vh^bB4oc zNwx%xVe90zPx`f3z4o2agGi#rP%fo6nmZOE(R+d~$-l5%`TY#ptNw(DRQR_LFszf4 zW~rn`tENhbmmE)czRe3ipXjNrUc4FbT3Quoh|YD0>SJSqckzoPU{CD__5psvkBfGfsy3dt?&Zx@)W>A zlEl$fuzg2zZYR!E+d7utESbirsf_v$>anU$m$Dt-*+{CznZJwhEoD1~j-rHHuX3`l zJ!=<9{}`R>RZ3(ce1YH}l3irm%#Ap=Vw*7IjBLV(UnCRyGeQ*z#<1Wl9ftw|)iv%e z0xC>bn3lP>V74hPBwr9DNAL|f%N~SIAu$d^Uc{{>z6!TD zHV1o~KbekxyADeu*TXRzx=63Mp(yCm>nFH4D^orcJq22$Fv@0VcYj;_J)ZQ6t0#sKNp_Y9 z;^^5NFZr$Hr(DCI&=B<$DE&K}dK<4HKY28o2|1#??FzHPua+h(%y8 zKyZQ+d;cb%_EJq*V@Y*FhOvMDaRvwjZ1h|!YLE@R^nzA*|MPT&70uFdv_}sAh=DA6 zRwnG<5DFe-nPk7Ylq(<weg*$M;}vjhY5=wt$D!GAP7W#&)^?*LqnSn zjbqPRwJcHJgIp*DqBW1V`Zi3`>pySWx?o<}8*<@tHgwyAC`Scs$#8tqu9i20B{h{T z(+{&8r^ad?Fz>sim(XyS;PGWC+?r)ONl(g4!C!Dx^ML7G+>50kfg7UAH|G;}q~`I& zeSu2f<6Xb=1M52rx_)OeAEa6{Qp0D$^V?Y?Ye-s?*l~yFw*fSTH@z?0b24E!Et_)9 z_nJOj0Z6%C`I`8KuX!*D2PyC|{)z7J(bfqc=lvG=zx_ zKUf8fFmrmF@A34k@%#)Ov9&UpDuP-!aHu&;KtcP5bnjl}EG-2R-)$(9gFwmGXF=z4 zUgmFFjB6-vnpbBpYvQR-_Wi_;=I3|T&uZ)E8SAIr`gzg%dENT?tM&6YeguzZaduR< zsrt|b#5E0;D`8-=@Fz479)3LkgWj@-Q6BQCIgz_oPUU3bTr%j;Fgir`on%LbU(Nrv zV4;zHI;j9-ZZ!MiR699s*)@{Ozqagu<{fX#;i;^-E&EhbrDaa6eN-;LeliY_^Y!PM zvIxU(nuMl(9Zt0MBV|y9*OMaKXd9R^@i*-iBk=< zoooH**3Ve$=LgnLz4ddg^%Jsw7Vy)R8rgpVTec_jUPyT-eEyJ z4C7`JmC$8@JS6i+N>w+?5B!b|W{w?k!8>IU_oq+o}vD6{|4{Yxpb zzRs@xDKJizMV?k}o)&UilzdHO?&VoCM;cXi>>&4W3{-5v3gsG7I3%IyS6@g`s25|8 z_TZ??jTU90lGz^F>t5jWQqOo%Ng>dNi>D6B=Z6+tPjf~@EV;_o=R#~ zNjN(Y-a~{@GH(Y5-~Hy`>+zA1?PX29V!(^3syCJw_O!f}MG&`%{(3ZNHk*B}6@ltD zg`dRmEnu`+0@dlCaf?4Zo7y&9oyX=*Bt(m#(F9hl!~ct=Zip;A#TF`5#A`!zWfy zwtA#}*eTd>PLjhqG$4>VXmCZb(R{Z_&a!Rs8!62a-z+<-PPB{Y|I{ah>=A{O*+Lji zgTMb}{$LxFWEjJy)jfA*If#2%h?d)$;z?XsA`yY7;TtJ)ZzgHBrQ*{wwEJlr{G4^8 zCS#2XglyAep_}3IGxW-J)5m+BZYNQ%e0_QrF4C_z*JHgVa*G#873s~{R|#0}RA4Q_ zo&c2nY%!^TvY%@H{9U2Cq(w$B)w}e%u*e3d;S9p^J#XHeE}(iMmB@r0kSZ~cbV0j0 zC@UBn*jJByo-qqp{Xw3${JOB#cq-{UEz+8L^JJco>e+7TFO#@(s`Shv2>!ZX&w5G2 zARN`Hcu#2pIImOP@GiY#k#1x*G)*fA!icw*Lxa2dx-vhaT-$H?C$ zIp8rAgmS5rQV_aZG64p97gjK!ph3X^QIX^AT)hgXd<9@L21E)^bU>KbCUp6O$QgL$m-*0TwnR@k=#L`_0g! z8@_Iadd)xJ4BdBAYKD5H1`E>et%lDG{eetoXfe^nJ7(xKUXq2kOOBEMvgBAZ6elG$ zLo+2)whIjIG}$F;Kx(VVq{ZK7iiS;s|M&=j7*hgUbhCEndWbTh(cJwu5MjRe#`yd(>+S4Hw4OjW{V)3c-`a-~HgypNIW15Z;cNCX(x8kYg#itv@#37{@}FvmP|+>7QdLBZdhy(;|kBk@TJK^mckI_T|V1x{$&jxJeDL211T(L z;W0fn8Kfs0D!r7gzMChhXp163Efp+MTT}U|wm95F-N##zaX^utX9T6C@B7X(@^&+C zp=>|*k)@qVmZ^9<-ttQi6ZtTte?L#-%RyDF7ku{1=GNZ``bJeyt<*+~2`~fUUTpVk za4f+=B;5mH&DNSO0NX0#eYur~OFultrOSj*(;AiktjZU)n->dA#)fh2^+!Qub8=

Yvnp*_hhHDM_F8LUBI~kJi=qIH&Vx%zMdL_td$QRAdBGPGAqz?am23&^7Nq>i z_$Jj)jb`-rjG;zW7tu6+6NF%Li6%rQ~4krAIDGuNvWYyNO37M{$(0s#p+ULOhEHB>x;O+NG{YCUr9LvF^Q;bqen!kgW5(a0je-E z+T#*A2w}a0QjxU+mWOGvfAZ7dX=>9NH%gz_^CzxD^uAub9C-c7Kky!{3mtgEC{ zFNxLeteZoBYd-#>mo1K-cUH_w3Jks>H3 z=lF35E-vtlw?r2^5M8*`Rvlc{oZ{POBkhU$!bmMJ8LHu^C@R|^;YzQ#Tbw}gjaofA zeyQKM+0v}@JtXuB*yp-B!9Wu|73a;CaAEoO@m%KDazKgy6DMwy;I zuOjBK$euH`C4WZ-rQZ#K-I!T?c_t=Nw?y*z^=EEOzNH&YVQEsBl=FSM=C-7la@3_qGzs08neFBWNNGH z7#cpAMEbzjPF5v!Zkk`vo^Bo)%L>zDU(9V*$Fkh2#IVwNS;Hz8ycItCL^-MIw8n?& zme_aVEC~@5&L*U{E{P=jygA{ImZTH6BT~v}5O>-v^h&LdZw-I#{B1*dLukpM;ir~ z1wGq*?eJrC`k!)~;Tj=3I;V%NEfbmwju{$STt;n7`_wXr)%PITim%7xqPcl;GA%gG zvqqgzvBGg zi#Dz4cdB7-S-r8LVqk7FJt&h2X?F`RqSMs0%cuFjs;P(3dn0tLeDIeSs*%N$^o7{Y zB4*ua=E5s6toR8KTVl-K^att_f^opr&^O$#=7)D$ColAE6KT{*77mpM{C|o3QHkPz zBTtf(Lr%Pa2GrXZR~=_dO`UFB;!-U1dt^q2uO-K(HEvNQ^9OdeF*x1E7D~{@J=T{k z8p_K{vhbIZW8}XtIYRo~!AFvXdq`Em2Z^s}gK(U&Sal&vvd7r$HB9=?v)9<+tu(bp zp@1X9PbYywm!k2+Ds#1`^g$qSb!x#_O(0) zj5B`scYf;k`iHbpaNbZeUx85eh3a$73yw);prMz4x=N$d??TNb3#(`*{yL8y6|X#5 zxOJ+uE8=ib(!?e829=P19!+?LJg46+F6@nLgIB$>U61CUCQsTJWV+ciN{A2|>@ucn^;}K###vX8Rzdhc{kpt(wYxwFs?D2tq5P&Own0!*;AcM9d!(X~m zP48{i^q!gO7}Hy+y25?Y2b5ryA0?=ChqPu2FZd~z93$V}S?MrU2|N=p=1&t1!)eC+ zc8-yb!$82-(?hnYh1u@>#KkA%xQHF;e?Z_|u-y2i@mrB((_FG}5{)E&BP1-iraAba z9<6pKex>*;F!zY?yvpRr6q@yDcfexiwKKKqYPkHH?@bFO2%20Y=YewX{z(euiswK< zt_=+sdo(gNK;Y9Gy5m=mDiq#ZIxjoCw_?GY3cX4Xj}ciWh?S)e;7G}MRWR$HH#r$I zr=gsf*VV~1oULT_T~VwFdfmex;(Ji652UIPs8eBA-#||$i&z8Fb^49@7J3Eu{z+C2 zjWX^Ql5vSskwUMUVAnBV*T}gUq3q;_%rPaMn006hv+e=2{stD(!mKZt$DQAaS;b#I zcv~>*9t*R6lE$p320Jn9Yx`o>wNt6loJYv%#H;u7mYO)fG1;Yd^WPO-y_6gf+BOTXJ}cF&Ha5to-Amn>hR8Pj8JW4e?o&`Wxa9_xU0=Gga~5UZ<3b6s|Bia!^e{nsQ<`6q?Ll;)&Efw zo&6Qb>;=KADnsz<>ng1SuO?_eg;xbul7%;s&<(HNs1ou&HU+Ofo5rhU@)?C!F<(#P z)uSZQ$e(33A$au`Dhpn!=ueO>Bulg!{0~Z_*UhUZbeu+BR9lsvF z$5-jw55M+K1WZ~tKW90v$ zv(ghPC52m!`Fr+7tMe2-0p-S5AeK>|A4HYJMo~}R9Ee`;PHfnpQuT!s$8}FFfPNjn zGy%2L6lOmu+Eoa8k+G)}o zoms4F-t96j&HH?(_Oxk#s7Dv|YStb?NNco+_UaPz?FY$@R+q+Qn~TJ7A~yL(&D{ZP z3MCBtBcEUbw1>#M95O+852^eyC=!hsr+LNEfMZJDL}tQ70JKgedg6# zg^MngDF*T!@{r7b@jdl!t-?HB@b^nyR$-7;Nozclj}Q-!^6_H%9^EugxB6QmKK9Dx z0JtVHyVxey0`3wipwa_|yEK6ctGl#o5|)(JC2iF%i$;~|#zeOso#K|D%r2k7P0L1e z>(iFDK$SCs@0?&(WOS{aztQo%0%?&2Zji}id_jqF)y1#eaB}gh7wn@|-g)agQ5X%> z%5kS&)?BtVQEc7(-gUbifJ&~kP0|(Hr^M?Js4n%%vLuS;uq5}c_#!zX{FJ@Uh3YXt=wXaTX5(8*77rakP9W+n7BNPt_1xZSWmU1Iadj z^on(=lv7*Ire32u4#!3b0-7Sw+s&(yjYj99U!Hw*fkY7XF@nM;KX75mxGNCL@0Az~ zCz0QqJYDla8**jA1saDuljYZZFY@qO!+h)m=?2uQfN2UI$O1PjtNy@fW>(WyE2Gt1V zelO+HsTYx|ROaJjRQ?pViVu#-K}mFhD~>TY7=#_{k1Wt_A@&3@xn z;nq_z#gS4*?Qx9{l{E`hbZ2ve2p>I$0peQZQiyL={s1XTo7bVjq#l61O^jFNC(ZK?+9^FUHXK4Pzsqx zlOpnoqc_NmhU%~Y3S-b9kMUVNSlCG3u2RWN$BK*9wC#9XPJ*j==~T!1lgc6(iy;rm z{0k^!O?rkrNpzS?t=jj=J1d1C`f*Z3u1cm?W%>vcwOD4!XbYg)DsmJAsUpBZkV@d8 zOQuYkyngvfQ!;Ib@%QG$OxxmdnYL^B8^OEHo}K=eArBdu>DPn(W_`18>H8Aj&%pOH z@cj(@FU~-l=W;>k@q){wz*OB`*Mb29UZpXJ!1mpDYqN{*!zyZ?96Q*3z3 zyIq>eS0N}m{C^?WU#?EFy=8Cs4TJ?d{~%&$4i*eX*C$R&YnUAKTtnq^of7H&RLg@= zArYHJ#zC)MGhe>W(i;*5yp+y*@WikA*hP+nCgSZJWGyH09k@MFrW0|Ad@9PP)OR_h z%Z1{rlc-l$k_dr@Kka5ERcJR)`)My*f_d3&j(>zBS$bmD%(CiEG^=@PPy0ETDH|=tlNF#Ftl>qx{-yb9s<={QR@ss z=emn{4Sj??dhiU7u{E9tKnrTYaFG2x`D;sq1Ge2<~fK5~6@{%0A5%u+6(5!bI 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