Implement System.Data.SQLite
TODO: determine if we can do something better than a resolver
This commit is contained in:
parent
8edd0393e5
commit
a5a75e3f50
5 changed files with 52 additions and 267 deletions
|
|
@ -28,7 +28,7 @@ using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using MaxMind;
|
using MaxMind;
|
||||||
using Mono.Data.Sqlite;
|
using System.Data.SQLite;
|
||||||
using MySql.Data.MySqlClient;
|
using MySql.Data.MySqlClient;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Rests;
|
using Rests;
|
||||||
|
|
@ -45,6 +45,7 @@ using TShockAPI.CLI;
|
||||||
using TShockAPI.Localization;
|
using TShockAPI.Localization;
|
||||||
using TShockAPI.Configuration;
|
using TShockAPI.Configuration;
|
||||||
using Terraria.GameContent.Creative;
|
using Terraria.GameContent.Creative;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace TShockAPI
|
namespace TShockAPI
|
||||||
{
|
{
|
||||||
|
|
@ -190,6 +191,50 @@ namespace TShockAPI
|
||||||
instance = this;
|
instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Dictionary<string, IntPtr> _nativeCache = new Dictionary<string, IntPtr>();
|
||||||
|
static IntPtr ResolveNativeDep(string libraryName, Assembly assembly, DllImportSearchPath? searchPath)
|
||||||
|
{
|
||||||
|
if (_nativeCache.TryGetValue(libraryName, out IntPtr cached))
|
||||||
|
return cached;
|
||||||
|
|
||||||
|
IEnumerable<string> matches = Enumerable.Empty<string>();
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>Initialize - Called by the TerrariaServerAPI during initialization.</summary>
|
/// <summary>Initialize - Called by the TerrariaServerAPI during initialization.</summary>
|
||||||
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
|
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
|
|
@ -206,6 +251,9 @@ namespace TShockAPI
|
||||||
//TShock handles this
|
//TShock handles this
|
||||||
args.Result = OTAPI.HookResult.Cancel;
|
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;
|
Main.SettingsUnlock_WorldEvil = true;
|
||||||
|
|
||||||
|
|
@ -266,7 +314,7 @@ namespace TShockAPI
|
||||||
{
|
{
|
||||||
string sql = Path.Combine(SavePath, Config.Settings.SqliteDBPath);
|
string sql = Path.Combine(SavePath, Config.Settings.SqliteDBPath);
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(sql));
|
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")
|
else if (Config.Settings.StorageType.ToLower() == "mysql")
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@
|
||||||
<PackageReference Include="BCrypt.Net-Next" Version="4.0.2" />
|
<PackageReference Include="BCrypt.Net-Next" Version="4.0.2" />
|
||||||
<PackageReference Include="MySql.Data" Version="8.0.27" />
|
<PackageReference Include="MySql.Data" Version="8.0.27" />
|
||||||
<PackageReference Include="SQLite" Version="3.13.0" />
|
<PackageReference Include="SQLite" Version="3.13.0" />
|
||||||
|
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.115.5" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
@ -45,9 +46,6 @@
|
||||||
<Reference Include="HttpServer">
|
<Reference Include="HttpServer">
|
||||||
<HintPath>..\prebuilts\HttpServer.dll</HintPath>
|
<HintPath>..\prebuilts\HttpServer.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Mono.Data.Sqlite">
|
|
||||||
<HintPath>..\prebuilts\Mono.Data.Sqlite.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
@ -64,7 +62,7 @@
|
||||||
<Copy SourceFiles="$(OutputPath)\TShockAPI.deps.json" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
<Copy SourceFiles="$(OutputPath)\TShockAPI.deps.json" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
||||||
<Copy SourceFiles="$(OutputPath)\TShockAPI.pdb" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
<Copy SourceFiles="$(OutputPath)\TShockAPI.pdb" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
||||||
<Copy SourceFiles="$(OutputPath)\TShockAPI.xml" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
<Copy SourceFiles="$(OutputPath)\TShockAPI.xml" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
||||||
<Copy SourceFiles="$(OutputPath)\Mono.Data.Sqlite.dll" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
<Copy SourceFiles="$(OutputPath)\System.Data.SQLite.dll" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
||||||
<Copy SourceFiles="$(OutputPath)\HttpServer.dll" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
<Copy SourceFiles="$(OutputPath)\HttpServer.dll" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
||||||
<Copy SourceFiles="$(OutputPath)\MySql.Data.dll" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
<Copy SourceFiles="$(OutputPath)\MySql.Data.dll" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\ServerPlugins" SkipUnchangedFiles="false" />
|
||||||
<Copy SourceFiles="@(DebugRuntimes)" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\runtimes\%(RecursiveDir)" SkipUnchangedFiles="false" />
|
<Copy SourceFiles="@(DebugRuntimes)" DestinationFolder="$(SolutionDir)\TerrariaServerAPI\TerrariaServerAPI\bin\$(ConfigurationName)\net5.0\runtimes\%(RecursiveDir)" SkipUnchangedFiles="false" />
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -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
|
|
||||||
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue