Skip to content

Commit 2c678a1

Browse files
committed
Added initial Maui package that has extension loading code and factory.
1 parent 447cc76 commit 2c678a1

File tree

5 files changed

+109
-1
lines changed

5 files changed

+109
-1
lines changed

PowerSync/PowerSync.Common/MDSQLite/MDSQLiteAdapter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ private static SqliteConnection OpenDatabase(string dbFilename)
129129
return connection;
130130
}
131131

132-
private void LoadExtension(SqliteConnection db)
132+
protected virtual void LoadExtension(SqliteConnection db)
133133
{
134134
string extensionPath = PowerSyncPathResolver.GetNativeLibraryPath(AppContext.BaseDirectory);
135135
db.EnableExtensions(true);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>netstandard2.0;net6.0;net8.0;net9.0;net8.0-ios;net8.0-android</TargetFrameworks>
5+
<LangVersion>12</LangVersion>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
<PackageId>PowerSync.Maui</PackageId>
9+
<Title>PowerSync.Maui</Title>
10+
<Description>PowerSync.Maui is a package that enables MAUI usage for PowerSync</Description>
11+
<Authors>PowerSync</Authors>
12+
<owners>powersync</owners>
13+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
14+
<RepositoryUrl>https://github.com/powersync-ja/powersync-dotnet</RepositoryUrl>
15+
<PackageProjectUrl>https://powersync.com</PackageProjectUrl>
16+
<PublishRepositoryUrl>true</PublishRepositoryUrl>
17+
<PackageReleaseNotes>https://github.com/powersync-ja/powersync-dotnet/PowerSync/PowerSync.Maui/CHANGELOG.md</PackageReleaseNotes>
18+
<PackageTags>powersync local-first local-storage state-management offline sql db persistence sqlite sync </PackageTags>
19+
<PackageIcon>icon.png</PackageIcon>
20+
<NoWarn>NU5100</NoWarn>
21+
<PackageReadmeFile>README.md</PackageReadmeFile>
22+
</PropertyGroup>
23+
24+
<ItemGroup>
25+
<ProjectReference Include="..\PowerSync.Common\PowerSync.Common.csproj" />
26+
</ItemGroup>
27+
28+
<ItemGroup>
29+
<None Include="..\..\icon.png" Pack="true" PackagePath=""/>
30+
<None Include="README.md" Pack="true" PackagePath=""/>
31+
</ItemGroup>
32+
33+
</Project>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
namespace PowerSync.Maui.SQLite;
2+
3+
using Microsoft.Data.Sqlite;
4+
using PowerSync.Common.MDSQLite;
5+
6+
// iOS specific imports
7+
#if IOS
8+
using Foundation;
9+
#endif
10+
11+
public class MAUISQLiteAdapter : MDSQLiteAdapter
12+
{
13+
public MAUISQLiteAdapter(MDSQLiteAdapterOptions options) : base(options)
14+
{
15+
}
16+
17+
protected override void LoadExtension(SqliteConnection db)
18+
{
19+
#if IOS
20+
var bundlePath = Foundation.NSBundle.MainBundle.BundlePath;
21+
var filePath =
22+
Path.Combine(bundlePath, "Frameworks", "powersync-sqlite-core.framework", "powersync-sqlite-core");
23+
24+
using var loadExtension = db.CreateCommand();
25+
loadExtension.CommandText = "SELECT load_extension(@path, @entryPoint)";
26+
loadExtension.Parameters.AddWithValue("@path", filePath);
27+
loadExtension.Parameters.AddWithValue("@entryPoint", "sqlite3_powersync_init");
28+
loadExtension.ExecuteNonQuery();
29+
30+
#elif ANDROID
31+
db.LoadExtension("libpowersync");
32+
#endif
33+
}
34+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using PowerSync.Common.DB;
2+
3+
namespace PowerSync.Maui.SQLite;
4+
5+
using PowerSync.Common.Client;
6+
using PowerSync.Common.MDSQLite;
7+
8+
9+
public class MAUISQLiteDBOpenFactory : ISQLOpenFactory
10+
{
11+
private readonly MDSQLiteOpenFactoryOptions options;
12+
13+
public MAUISQLiteDBOpenFactory(MDSQLiteOpenFactoryOptions options)
14+
{
15+
this.options = options;
16+
}
17+
18+
public IDBAdapter OpenDatabase()
19+
{
20+
return new MAUISQLiteAdapter(new MDSQLiteAdapterOptions
21+
{
22+
Name = options.DbFilename,
23+
SqliteOptions = options.SqliteOptions
24+
});
25+
}
26+
}

root.sln

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TodoSQLite", "demos\TodoSQL
2121
EndProject
2222
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPF", "demos\WPF\WPF.csproj", "{AF297026-0BEA-4B8E-97C9-6540C6D52B36}"
2323
EndProject
24+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerSync.Maui", "PowerSync\PowerSync.Maui\PowerSync.Maui.csproj", "{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}"
25+
EndProject
2426
Global
2527
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2628
Debug|Any CPU = Debug|Any CPU
@@ -91,6 +93,18 @@ Global
9193
{AF297026-0BEA-4B8E-97C9-6540C6D52B36}.Release|x64.Build.0 = Release|Any CPU
9294
{AF297026-0BEA-4B8E-97C9-6540C6D52B36}.Release|x86.ActiveCfg = Release|Any CPU
9395
{AF297026-0BEA-4B8E-97C9-6540C6D52B36}.Release|x86.Build.0 = Release|Any CPU
96+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
97+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
98+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Debug|x64.ActiveCfg = Debug|Any CPU
99+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Debug|x64.Build.0 = Debug|Any CPU
100+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Debug|x86.ActiveCfg = Debug|Any CPU
101+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Debug|x86.Build.0 = Debug|Any CPU
102+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
103+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Release|Any CPU.Build.0 = Release|Any CPU
104+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Release|x64.ActiveCfg = Release|Any CPU
105+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Release|x64.Build.0 = Release|Any CPU
106+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Release|x86.ActiveCfg = Release|Any CPU
107+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE}.Release|x86.Build.0 = Release|Any CPU
94108
EndGlobalSection
95109
GlobalSection(SolutionProperties) = preSolution
96110
HideSolutionNode = FALSE
@@ -102,5 +116,6 @@ Global
102116
{D7FDA714-D29F-4D85-B3F2-74C6810A36F9} = {9144195A-C68F-4B1E-A574-474EDD424D6C}
103117
{B8B2A9E2-FEC9-495B-B03E-23078E7B651D} = {9144195A-C68F-4B1E-A574-474EDD424D6C}
104118
{AF297026-0BEA-4B8E-97C9-6540C6D52B36} = {9144195A-C68F-4B1E-A574-474EDD424D6C}
119+
{A4A91B9F-0C86-41CB-BEF0-C002819C43BE} = {B1D87BA9-8812-4EFA-BBBE-1FF1EEEB5433}
105120
EndGlobalSection
106121
EndGlobal

0 commit comments

Comments
 (0)