diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 5f60c05a..4b837f63 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -28,7 +28,7 @@ using System.Linq; using System.Net; using System.Reflection; using MaxMind; -using Mono.Data.Sqlite; +using System.Data.SQLite; using MySql.Data.MySqlClient; using Newtonsoft.Json; using Rests; @@ -45,6 +45,7 @@ using TShockAPI.CLI; using TShockAPI.Localization; using TShockAPI.Configuration; using Terraria.GameContent.Creative; +using System.Runtime.InteropServices; namespace TShockAPI { @@ -190,6 +191,50 @@ namespace TShockAPI instance = this; } + + static Dictionary _nativeCache = new Dictionary(); + static IntPtr ResolveNativeDep(string libraryName, Assembly assembly, DllImportSearchPath? searchPath) + { + if (_nativeCache.TryGetValue(libraryName, out IntPtr cached)) + return cached; + + IEnumerable matches = Enumerable.Empty(); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + var osx = Path.Combine(Environment.CurrentDirectory, "runtimes", "osx-x64"); + matches = Directory.GetFiles(osx, "*" + libraryName + "*", SearchOption.AllDirectories); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + var lib64 = Path.Combine(Environment.CurrentDirectory, "runtimes", "linux-x64"); + matches = Directory.GetFiles(lib64, "*" + libraryName + "*", SearchOption.AllDirectories); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + var x64 = Path.Combine(Environment.CurrentDirectory, "runtimes", "win-x64"); + matches = Directory.GetFiles(x64, "*" + libraryName + "*", SearchOption.AllDirectories); + } + + if (matches.Count() == 0) + { + matches = Directory.GetFiles(Environment.CurrentDirectory, "*" + libraryName + "*"); + } + + var handle = IntPtr.Zero; + + if (matches.Count() == 1) + { + var match = matches.Single(); + handle = NativeLibrary.Load(match); + } + + // cache either way. if zero, no point calling IO if we've checked this assembly before. + _nativeCache.Add(libraryName, handle); + + return handle; + } + /// Initialize - Called by the TerrariaServerAPI during initialization. [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")] public override void Initialize() @@ -206,6 +251,9 @@ namespace TShockAPI //TShock handles this args.Result = OTAPI.HookResult.Cancel; }; + // if sqlite.interop cannot be found, try and search the runtimes folder. this usually happens when debugging tsapi + // since it does not have the dependency installed directly + NativeLibrary.SetDllImportResolver(typeof(SQLiteConnection).Assembly, ResolveNativeDep); Main.SettingsUnlock_WorldEvil = true; @@ -266,7 +314,7 @@ namespace TShockAPI { string sql = Path.Combine(SavePath, Config.Settings.SqliteDBPath); Directory.CreateDirectory(Path.GetDirectoryName(sql)); - DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); + DB = new SQLiteConnection(string.Format("Data Source={0},Version=3", sql)); } else if (Config.Settings.StorageType.ToLower() == "mysql") { diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 71ffca84..576bc974 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -35,6 +35,7 @@ + @@ -45,9 +46,6 @@ ..\prebuilts\HttpServer.dll - - ..\prebuilts\Mono.Data.Sqlite.dll - @@ -64,7 +62,7 @@ - + diff --git a/prebuilts/Mono.Data.Sqlite.dll b/prebuilts/Mono.Data.Sqlite.dll deleted file mode 100644 index ce600dbc..00000000 Binary files a/prebuilts/Mono.Data.Sqlite.dll and /dev/null differ diff --git a/prebuilts/sqlite3.def b/prebuilts/sqlite3.def deleted file mode 100644 index caa046e3..00000000 --- a/prebuilts/sqlite3.def +++ /dev/null @@ -1,261 +0,0 @@ -EXPORTS -sqlite3_aggregate_context -sqlite3_aggregate_count -sqlite3_auto_extension -sqlite3_backup_finish -sqlite3_backup_init -sqlite3_backup_pagecount -sqlite3_backup_remaining -sqlite3_backup_step -sqlite3_bind_blob -sqlite3_bind_blob64 -sqlite3_bind_double -sqlite3_bind_int -sqlite3_bind_int64 -sqlite3_bind_null -sqlite3_bind_parameter_count -sqlite3_bind_parameter_index -sqlite3_bind_parameter_name -sqlite3_bind_pointer -sqlite3_bind_text -sqlite3_bind_text16 -sqlite3_bind_text64 -sqlite3_bind_value -sqlite3_bind_zeroblob -sqlite3_bind_zeroblob64 -sqlite3_blob_bytes -sqlite3_blob_close -sqlite3_blob_open -sqlite3_blob_read -sqlite3_blob_reopen -sqlite3_blob_write -sqlite3_busy_handler -sqlite3_busy_timeout -sqlite3_cancel_auto_extension -sqlite3_changes -sqlite3_clear_bindings -sqlite3_close -sqlite3_close_v2 -sqlite3_collation_needed -sqlite3_collation_needed16 -sqlite3_column_blob -sqlite3_column_bytes -sqlite3_column_bytes16 -sqlite3_column_count -sqlite3_column_database_name -sqlite3_column_database_name16 -sqlite3_column_decltype -sqlite3_column_decltype16 -sqlite3_column_double -sqlite3_column_int -sqlite3_column_int64 -sqlite3_column_name -sqlite3_column_name16 -sqlite3_column_origin_name -sqlite3_column_origin_name16 -sqlite3_column_table_name -sqlite3_column_table_name16 -sqlite3_column_text -sqlite3_column_text16 -sqlite3_column_type -sqlite3_column_value -sqlite3_commit_hook -sqlite3_compileoption_get -sqlite3_compileoption_used -sqlite3_complete -sqlite3_complete16 -sqlite3_config -sqlite3_context_db_handle -sqlite3_create_collation -sqlite3_create_collation16 -sqlite3_create_collation_v2 -sqlite3_create_function -sqlite3_create_function16 -sqlite3_create_function_v2 -sqlite3_create_module -sqlite3_create_module_v2 -sqlite3_create_window_function -sqlite3_data_count -sqlite3_db_cacheflush -sqlite3_db_config -sqlite3_db_filename -sqlite3_db_handle -sqlite3_db_mutex -sqlite3_db_readonly -sqlite3_db_release_memory -sqlite3_db_status -sqlite3_declare_vtab -sqlite3_enable_load_extension -sqlite3_enable_shared_cache -sqlite3_errcode -sqlite3_errmsg -sqlite3_errmsg16 -sqlite3_errstr -sqlite3_exec -sqlite3_expanded_sql -sqlite3_expired -sqlite3_extended_errcode -sqlite3_extended_result_codes -sqlite3_file_control -sqlite3_finalize -sqlite3_free -sqlite3_free_table -sqlite3_get_autocommit -sqlite3_get_auxdata -sqlite3_get_table -sqlite3_global_recover -sqlite3_initialize -sqlite3_interrupt -sqlite3_keyword_check -sqlite3_keyword_count -sqlite3_keyword_name -sqlite3_last_insert_rowid -sqlite3_libversion -sqlite3_libversion_number -sqlite3_limit -sqlite3_load_extension -sqlite3_log -sqlite3_malloc -sqlite3_malloc64 -sqlite3_memory_alarm -sqlite3_memory_highwater -sqlite3_memory_used -sqlite3_mprintf -sqlite3_msize -sqlite3_mutex_alloc -sqlite3_mutex_enter -sqlite3_mutex_free -sqlite3_mutex_leave -sqlite3_mutex_try -sqlite3_next_stmt -sqlite3_open -sqlite3_open16 -sqlite3_open_v2 -sqlite3_os_end -sqlite3_os_init -sqlite3_overload_function -sqlite3_prepare -sqlite3_prepare16 -sqlite3_prepare16_v2 -sqlite3_prepare16_v3 -sqlite3_prepare_v2 -sqlite3_prepare_v3 -sqlite3_profile -sqlite3_progress_handler -sqlite3_randomness -sqlite3_realloc -sqlite3_realloc64 -sqlite3_release_memory -sqlite3_reset -sqlite3_reset_auto_extension -sqlite3_result_blob -sqlite3_result_blob64 -sqlite3_result_double -sqlite3_result_error -sqlite3_result_error16 -sqlite3_result_error_code -sqlite3_result_error_nomem -sqlite3_result_error_toobig -sqlite3_result_int -sqlite3_result_int64 -sqlite3_result_null -sqlite3_result_pointer -sqlite3_result_subtype -sqlite3_result_text -sqlite3_result_text16 -sqlite3_result_text16be -sqlite3_result_text16le -sqlite3_result_text64 -sqlite3_result_value -sqlite3_result_zeroblob -sqlite3_result_zeroblob64 -sqlite3_rollback_hook -sqlite3_rtree_geometry_callback -sqlite3_rtree_query_callback -sqlite3_set_authorizer -sqlite3_set_auxdata -sqlite3_set_last_insert_rowid -sqlite3_shutdown -sqlite3_sleep -sqlite3_snprintf -sqlite3_soft_heap_limit -sqlite3_soft_heap_limit64 -sqlite3_sourceid -sqlite3_sql -sqlite3_status -sqlite3_status64 -sqlite3_step -sqlite3_stmt_busy -sqlite3_stmt_readonly -sqlite3_stmt_status -sqlite3_str_append -sqlite3_str_appendall -sqlite3_str_appendchar -sqlite3_str_appendf -sqlite3_str_errcode -sqlite3_str_finish -sqlite3_strglob -sqlite3_stricmp -sqlite3_str_length -sqlite3_strlike -sqlite3_str_new -sqlite3_strnicmp -sqlite3_str_reset -sqlite3_str_value -sqlite3_str_vappendf -sqlite3_system_errno -sqlite3_table_column_metadata -sqlite3_test_control -sqlite3_thread_cleanup -sqlite3_threadsafe -sqlite3_total_changes -sqlite3_trace -sqlite3_trace_v2 -sqlite3_transfer_bindings -sqlite3_update_hook -sqlite3_uri_boolean -sqlite3_uri_int64 -sqlite3_uri_parameter -sqlite3_user_data -sqlite3_value_blob -sqlite3_value_bytes -sqlite3_value_bytes16 -sqlite3_value_double -sqlite3_value_dup -sqlite3_value_free -sqlite3_value_int -sqlite3_value_int64 -sqlite3_value_nochange -sqlite3_value_numeric_type -sqlite3_value_pointer -sqlite3_value_subtype -sqlite3_value_text -sqlite3_value_text16 -sqlite3_value_text16be -sqlite3_value_text16le -sqlite3_value_type -sqlite3_vfs_find -sqlite3_vfs_register -sqlite3_vfs_unregister -sqlite3_vmprintf -sqlite3_vsnprintf -sqlite3_vtab_collation -sqlite3_vtab_config -sqlite3_vtab_nochange -sqlite3_vtab_on_conflict -sqlite3_wal_autocheckpoint -sqlite3_wal_checkpoint -sqlite3_wal_checkpoint_v2 -sqlite3_wal_hook -sqlite3_win32_is_nt -sqlite3_win32_mbcs_to_utf8 -sqlite3_win32_mbcs_to_utf8_v2 -sqlite3_win32_set_directory -sqlite3_win32_set_directory16 -sqlite3_win32_set_directory8 -sqlite3_win32_sleep -sqlite3_win32_unicode_to_utf8 -sqlite3_win32_utf8_to_mbcs -sqlite3_win32_utf8_to_mbcs_v2 -sqlite3_win32_utf8_to_unicode -sqlite3_win32_write_debug diff --git a/prebuilts/sqlite3.dll b/prebuilts/sqlite3.dll deleted file mode 100755 index d1b9cb82..00000000 Binary files a/prebuilts/sqlite3.dll and /dev/null differ