Change some table type from TEXT to JSONB (#4371)

* Change some table type from TEXT to JSONB

* Deprecate mysql and sqlite backend
This commit is contained in:
Nicolas Dorier 2022-11-28 20:36:18 +09:00 committed by GitHub
parent 84132e794a
commit 08b239e87a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 68 additions and 9 deletions

View file

@ -105,10 +105,10 @@ namespace BTCPayServer.Data
//PlannedTransaction.OnModelCreating(builder); //PlannedTransaction.OnModelCreating(builder);
PullPaymentData.OnModelCreating(builder); PullPaymentData.OnModelCreating(builder);
RefundData.OnModelCreating(builder); RefundData.OnModelCreating(builder);
//SettingData.OnModelCreating(builder); SettingData.OnModelCreating(builder, Database);
StoreSettingData.OnModelCreating(builder, Database); StoreSettingData.OnModelCreating(builder, Database);
StoreWebhookData.OnModelCreating(builder); StoreWebhookData.OnModelCreating(builder);
//StoreData.OnModelCreating(builder); StoreData.OnModelCreating(builder, Database);
U2FDevice.OnModelCreating(builder); U2FDevice.OnModelCreating(builder);
Fido2Credential.OnModelCreating(builder); Fido2Credential.OnModelCreating(builder);
BTCPayServer.Data.UserStore.OnModelCreating(builder); BTCPayServer.Data.UserStore.OnModelCreating(builder);

View file

@ -1,3 +1,6 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
namespace BTCPayServer.Data namespace BTCPayServer.Data
{ {
public class SettingData public class SettingData
@ -5,5 +8,15 @@ namespace BTCPayServer.Data
public string Id { get; set; } public string Id { get; set; }
public string Value { get; set; } public string Value { get; set; }
public static void OnModelCreating(ModelBuilder builder, DatabaseFacade databaseFacade)
{
if (databaseFacade.IsNpgsql())
{
builder.Entity<SettingData>()
.Property(o => o.Value)
.HasColumnType("JSONB");
}
}
} }
} }

View file

@ -3,6 +3,8 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using BTCPayServer.Client.Models; using BTCPayServer.Client.Models;
using BTCPayServer.Data.Data; using BTCPayServer.Data.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using PayoutProcessorData = BTCPayServer.Data.Data.PayoutProcessorData; using PayoutProcessorData = BTCPayServer.Data.Data.PayoutProcessorData;
namespace BTCPayServer.Data namespace BTCPayServer.Data
@ -36,7 +38,7 @@ namespace BTCPayServer.Data
[NotMapped] public string Role { get; set; } [NotMapped] public string Role { get; set; }
public byte[] StoreBlob { get; set; } public string StoreBlob { get; set; }
[Obsolete("Use GetDefaultPaymentId instead")] [Obsolete("Use GetDefaultPaymentId instead")]
public string DefaultCrypto { get; set; } public string DefaultCrypto { get; set; }
@ -48,5 +50,15 @@ namespace BTCPayServer.Data
public IEnumerable<PayoutData> Payouts { get; set; } public IEnumerable<PayoutData> Payouts { get; set; }
public IEnumerable<CustodianAccountData> CustodianAccounts { get; set; } public IEnumerable<CustodianAccountData> CustodianAccounts { get; set; }
public IEnumerable<StoreSettingData> Settings { get; set; } public IEnumerable<StoreSettingData> Settings { get; set; }
internal static void OnModelCreating(ModelBuilder builder, DatabaseFacade databaseFacade)
{
if (databaseFacade.IsNpgsql())
{
builder.Entity<StoreData>()
.Property(o => o.StoreBlob)
.HasColumnType("JSONB");
}
}
} }
} }

View file

@ -0,0 +1,31 @@
using System;
using BTCPayServer.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace BTCPayServer.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20221128062447_jsonb")]
public partial class jsonb : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
if (migrationBuilder.IsNpgsql())
{
migrationBuilder.Sql("ALTER TABLE \"Settings\" ALTER COLUMN \"Value\" TYPE JSONB USING \"Value\"::JSONB");
migrationBuilder.Sql("ALTER TABLE \"Stores\" ALTER COLUMN \"StoreBlob\" TYPE JSONB USING regexp_replace(convert_from(\"StoreBlob\",'UTF8'), '\\u0000', '', 'g')::JSONB");
}
}
protected override void Down(MigrationBuilder migrationBuilder)
{
// Not supported
}
}
}

View file

@ -1749,8 +1749,7 @@ namespace BTCPayServer.Tests
PaymentMethod = new PaymentMethodId("BTC", PaymentTypes.BTCLike) PaymentMethod = new PaymentMethodId("BTC", PaymentTypes.BTCLike)
} }
}; };
var newBlob = Encoding.UTF8.GetBytes( var newBlob = new Serializer(null).ToString(blob).Replace( "paymentMethod\":\"BTC\"","paymentMethod\":\"ETH_ZYC\"");
new Serializer(null).ToString(blob).Replace( "paymentMethod\":\"BTC\"","paymentMethod\":\"ETH_ZYC\""));
Assert.Empty(StoreDataExtensions.GetStoreBlob(new StoreData() {StoreBlob = newBlob}).PaymentMethodCriteria); Assert.Empty(StoreDataExtensions.GetStoreBlob(new StoreData() {StoreBlob = newBlob}).PaymentMethodCriteria);
} }
} }

View file

@ -65,6 +65,10 @@ namespace BTCPayServer.Configuration
if (conf.GetOrDefault<bool>("launchsettings", false) && NetworkType != ChainName.Regtest) if (conf.GetOrDefault<bool>("launchsettings", false) && NetworkType != ChainName.Regtest)
throw new ConfigException($"You need to run BTCPayServer with the run.sh or run.ps1 script"); throw new ConfigException($"You need to run BTCPayServer with the run.sh or run.ps1 script");
if (conf.GetOrDefault<string>("SQLITEFILE", null) != null)
Logs.Configuration.LogWarning("SQLITE backend support is deprecated and will be soon out of support");
if (conf.GetOrDefault<string>("MYSQL", null) != null)
Logs.Configuration.LogWarning("MYSQL backend support is deprecated and will be soon out of support");
DockerDeployment = conf.GetOrDefault<bool>("dockerdeployment", true); DockerDeployment = conf.GetOrDefault<bool>("dockerdeployment", true);
TorrcFile = conf.GetOrDefault<string>("torrcfile", null); TorrcFile = conf.GetOrDefault<string>("torrcfile", null);
TorServices = conf.GetOrDefault<string>("torservices", null) TorServices = conf.GetOrDefault<string>("torservices", null)

View file

@ -27,9 +27,9 @@ namespace BTCPayServer.Configuration
app.Option("--signet | -signet", $"Use signet (deprecated, use --network instead)", CommandOptionType.BoolValue); app.Option("--signet | -signet", $"Use signet (deprecated, use --network instead)", CommandOptionType.BoolValue);
app.Option("--chains | -c", $"Chains to support as a comma separated (default: btc; available: {chains})", CommandOptionType.SingleValue); app.Option("--chains | -c", $"Chains to support as a comma separated (default: btc; available: {chains})", CommandOptionType.SingleValue);
app.Option("--postgres", $"Connection string to a PostgreSQL database", CommandOptionType.SingleValue); app.Option("--postgres", $"Connection string to a PostgreSQL database", CommandOptionType.SingleValue);
app.Option("--mysql", $"Connection string to a MySQL database", CommandOptionType.SingleValue); app.Option("--mysql", $"DEPRECATED: Connection string to a MySQL database", CommandOptionType.SingleValue);
app.Option("--nocsp", $"Disable CSP (default false)", CommandOptionType.BoolValue); app.Option("--nocsp", $"Disable CSP (default false)", CommandOptionType.BoolValue);
app.Option("--sqlitefile", $"File name to an SQLite database file inside the data directory", CommandOptionType.SingleValue); app.Option("--sqlitefile", $"DEPRECATED: File name to an SQLite database file inside the data directory", CommandOptionType.SingleValue);
app.Option("--externalservices", $"Links added to external services inside Server Settings / Services under the format service1:path2;service2:path2.(default: empty)", CommandOptionType.SingleValue); app.Option("--externalservices", $"Links added to external services inside Server Settings / Services under the format service1:path2;service2:path2.(default: empty)", CommandOptionType.SingleValue);
app.Option("--rootpath", "The root path in the URL to access BTCPay (default: /)", CommandOptionType.SingleValue); app.Option("--rootpath", "The root path in the URL to access BTCPay (default: /)", CommandOptionType.SingleValue);
app.Option("--sshconnection", "SSH server to manage BTCPay under the form user@server:port (default: root@externalhost or empty)", CommandOptionType.SingleValue); app.Option("--sshconnection", "SSH server to manage BTCPay under the form user@server:port (default: root@externalhost or empty)", CommandOptionType.SingleValue);

View file

@ -47,7 +47,7 @@ namespace BTCPayServer.Data
public static StoreBlob GetStoreBlob(this StoreData storeData) public static StoreBlob GetStoreBlob(this StoreData storeData)
{ {
var result = storeData.StoreBlob == null ? new StoreBlob() : new Serializer(null).ToObject<StoreBlob>(Encoding.UTF8.GetString(storeData.StoreBlob)); var result = storeData.StoreBlob == null ? new StoreBlob() : new Serializer(null).ToObject<StoreBlob>(storeData.StoreBlob);
if (result.PreferredExchange == null) if (result.PreferredExchange == null)
result.PreferredExchange = CoinGeckoRateProvider.CoinGeckoName; result.PreferredExchange = CoinGeckoRateProvider.CoinGeckoName;
if (result.PaymentMethodCriteria is null) if (result.PaymentMethodCriteria is null)
@ -62,7 +62,7 @@ namespace BTCPayServer.Data
var newBlob = new Serializer(null).ToString(storeBlob); var newBlob = new Serializer(null).ToString(storeBlob);
if (original == newBlob) if (original == newBlob)
return false; return false;
storeData.StoreBlob = Encoding.UTF8.GetBytes(newBlob); storeData.StoreBlob = newBlob;
return true; return true;
} }