Skip to content

Commit 9a68bd1

Browse files
committed
Trying to get rid of SQLite initialisation error
1 parent 151564e commit 9a68bd1

File tree

7 files changed

+39
-10
lines changed

7 files changed

+39
-10
lines changed

plugins/magic.lambda.sqlite/magic.lambda.sqlite/Connect.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using magic.data.common.helpers;
99
using magic.lambda.sqlite.helpers;
1010
using magic.data.common.contracts;
11+
using magic.node.contracts;
1112

1213
namespace magic.lambda.sqlite
1314
{
@@ -19,14 +20,17 @@ public class Connect : ISlotAsync
1920
{
2021
readonly IDataSettings _settings;
2122
readonly IInitializer _initializer;
23+
readonly IRootResolver _resolver;
2224

2325
/// <summary>
2426
/// Creates a new instance of your class.
2527
/// </summary>
28+
/// <param name="resolver">Required to find the absolute path.</param>
2629
/// <param name="settings">Configuration settings for your application.</param>
2730
/// <param name="initializer">Initialiser invoked as connections are created, allowing you to dynamically load extensions, etc.</param>
28-
public Connect(IDataSettings settings, IInitializer initializer)
29-
{
31+
public Connect(IRootResolver resolver, IDataSettings settings, IInitializer initializer)
32+
{
33+
_resolver = resolver;
3034
_settings = settings;
3135
_initializer = initializer;
3236
}
@@ -42,6 +46,7 @@ public async Task SignalAsync(ISignaler signaler, Node input)
4246
using (var shutdownLock = new ShutdownLock())
4347
{
4448
using (var connection = new SqliteConnectionWrapper(
49+
_resolver,
4550
Executor.GetConnectionString(
4651
input,
4752
"sqlite",

plugins/magic.lambda.sqlite/magic.lambda.sqlite/IInitializer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using System.Threading.Tasks;
66
using Microsoft.Data.Sqlite;
7+
using magic.node.contracts;
78

89
namespace magic.lambda.sqlite
910
{
@@ -15,7 +16,8 @@ public interface IInitializer
1516
/// <summary>
1617
/// Initializes the database, invoked every single time you create a new database connection.
1718
/// </summary>
19+
/// <param name="resolver">Required to resolve absolute paths</param>
1820
/// <param name="connection">Recently created SQLite database connection</param>
19-
Task Initialize(SqliteConnection connection);
21+
Task Initialize(IRootResolver resolver, SqliteConnection connection);
2022
}
2123
}

plugins/magic.lambda.sqlite/magic.lambda.sqlite/helpers/SqliteConnectionWrapper.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*/
44

55
using System;
6+
using magic.node.contracts;
67
using Microsoft.Data.Sqlite;
78

89
namespace magic.lambda.sqlite.helpers
@@ -15,12 +16,12 @@ internal sealed class SqliteConnectionWrapper : IDisposable
1516
{
1617
readonly Lazy<SqliteConnection> _connection;
1718

18-
public SqliteConnectionWrapper(string connectionString, IInitializer initializer = null)
19+
public SqliteConnectionWrapper(IRootResolver resolver, string connectionString, IInitializer initializer = null)
1920
{
2021
_connection = new Lazy<SqliteConnection>(() =>
2122
{
2223
var connection = new SqliteConnection(connectionString);
23-
initializer?.Initialize(connection);
24+
initializer?.Initialize(resolver, connection);
2425
return connection;
2526
});
2627
}

plugins/magic.library/Initializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ public static void AddMagic(this IServiceCollection services, IConfiguration con
107107
public static void AddMagicData(this IServiceCollection services, IConfiguration configuration)
108108
{
109109
services.AddTransient<IDataSettings, AppSettingsDataSettings>();
110+
SQLitePCL.Batteries_V2.Init();
110111
}
111112

112113
/// <summary>

plugins/magic.library/internals/RootResolver.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.Extensions.Configuration;
77
using magic.node.contracts;
88
using magic.node.extensions;
9+
using System.Linq;
910

1011
namespace magic.library.internals
1112
{
@@ -42,5 +43,15 @@ public string AbsolutePath(string path)
4243
// DynamicFiles should always end with a slash (/).
4344
return DynamicFiles + path.Replace("\\", "/").TrimStart('/');
4445
}
46+
47+
public string RuntimePath(string path)
48+
{
49+
var entities = DynamicFiles.Split(['/'], System.StringSplitOptions.RemoveEmptyEntries).ToList();
50+
entities.RemoveAt(entities.Count - 1);
51+
var root = "/" + string.Join('/', entities) + "/";
52+
53+
// DynamicFiles should always end with a slash (/).
54+
return root + path.Replace("\\", "/").TrimStart('/');
55+
}
4556
}
4657
}

plugins/magic.library/internals/SQLiteInitializer.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Threading.Tasks;
77
using Microsoft.Data.Sqlite;
88
using magic.lambda.sqlite;
9+
using magic.node.contracts;
910

1011
namespace magic.library.internals
1112
{
@@ -16,21 +17,22 @@ internal class SQLiteInitializer : IInitializer
1617
{
1718
private static readonly SemaphoreSlim _lock = new(1, 1);
1819

19-
public async Task Initialize(SqliteConnection connection)
20+
public async Task Initialize(IRootResolver resolver, SqliteConnection connection)
2021
{
2122
await connection.OpenAsync();
22-
await EnsureVectorLoadedAsync(connection);
23+
await EnsureVectorLoadedAsync(resolver, connection);
2324
}
2425

2526
/*
2627
* Ensures serialized initialization of vector lib.
2728
*/
28-
private static async Task EnsureVectorLoadedAsync(SqliteConnection connection)
29+
private static async Task EnsureVectorLoadedAsync(IRootResolver resolver, SqliteConnection connection)
2930
{
3031
await _lock.WaitAsync();
3132
try
32-
{
33-
connection.LoadExtension("./sqlite-plugins/vector");
33+
{
34+
connection.EnableExtensions();
35+
connection.LoadExtension(resolver.RuntimePath("sqlite-plugins/vector"));
3436
}
3537
finally
3638
{

plugins/magic.node/magic.node.extensions/contracts/IRootResolver.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,12 @@ public interface IRootResolver
4141
/// <param name="path">Relative path of file or folder.</param>
4242
/// <returns>Absolute file or folder path.</returns>
4343
string AbsolutePath(string path);
44+
45+
/// <summary>
46+
/// Returns the absolute path to the runtime given the relative path as an argument.
47+
/// </summary>
48+
/// <param name="path">Relative path of file or folder.</param>
49+
/// <returns>Absolute file or folder path.</returns>
50+
string RuntimePath(string path);
4451
}
4552
}

0 commit comments

Comments
 (0)