Support bidirectional storage conversion.
This commit is contained in:
parent
0bc025e5f8
commit
a487a8dadf
5 changed files with 171 additions and 53 deletions
SharpChat
|
@ -154,57 +154,10 @@ using StreamConfig config = StreamConfig.FromPath(configFile);
|
|||
|
||||
if(cts.IsCancellationRequested) return;
|
||||
|
||||
if(args.Contains("--convert-db")) {
|
||||
logger.ZLogInformation($"Converting MariaDB storage to SQLite");
|
||||
|
||||
MariaDBStorage mariadbStorage = new(logFactory.CreateLogger("mariadb"), MariaDBStorage.BuildConnectionString(config.ScopeTo("mariadb")));
|
||||
await mariadbStorage.UpgradeStorage();
|
||||
|
||||
if(args.Contains("--migrate-storage") || args.Contains("--convert-db")) {
|
||||
MariaDBStorage mariadb = new(logFactory.CreateLogger("mariadb"), MariaDBStorage.BuildConnectionString(config.ScopeTo("mariadb")));
|
||||
using SQLiteStorage sqlite = new(logFactory.CreateLogger("sqlite"), SQLiteStorage.BuildConnectionString(config.ScopeTo("sqlite"), false));
|
||||
await sqlite.UpgradeStorage();
|
||||
|
||||
using MariaDBConnection mariadb = await mariadbStorage.CreateConnection();
|
||||
long rows = await mariadb.RunQueryValue<long>("SELECT COUNT(*) FROM sqc_events");
|
||||
|
||||
using MySqlCommand export = mariadb.Connection.CreateCommand();
|
||||
export.CommandText = "SELECT event_id, event_type, UNIX_TIMESTAMP(event_created) AS event_created, UNIX_TIMESTAMP(event_deleted) AS event_deleted, event_channel, event_sender, event_sender_name, event_sender_colour, event_sender_rank, event_sender_nick, event_sender_perms, event_data FROM sqc_events";
|
||||
export.CommandTimeout = int.MaxValue;
|
||||
using MySqlDataReader reader = await export.ExecuteReaderAsync();
|
||||
|
||||
using SQLiteCommand import = sqlite.Connection.Connection.CreateCommand();
|
||||
import.CommandText = "INSERT OR IGNORE INTO messages (msg_id, msg_type, msg_created, msg_deleted, msg_channel, msg_sender, msg_sender_name, msg_sender_colour, msg_sender_rank, msg_sender_nick, msg_sender_perms, msg_data) VALUES (@id, @type, @created, @deleted, @channel, @sender, @sender_name, @sender_colour, @sender_rank, @sender_nick, @sender_perms, @data)";
|
||||
|
||||
long completed = 0;
|
||||
DateTimeOffset lastReport = DateTimeOffset.UtcNow;
|
||||
logger.ZLogInformation($"Beginning conversion of {rows} rows...");
|
||||
while(reader.Read()) {
|
||||
if(cts.IsCancellationRequested) return;
|
||||
|
||||
import.Parameters.Clear();
|
||||
import.Parameters.Add(new SQLiteParameter("id", reader.GetInt64("event_id").ToString()));
|
||||
import.Parameters.Add(new SQLiteParameter("type", reader.GetString("event_type")));
|
||||
import.Parameters.Add(new SQLiteParameter("created", DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32("event_created")).ToString("s") + "Z"));
|
||||
import.Parameters.Add(new SQLiteParameter("deleted", reader.IsDBNull(reader.GetOrdinal("event_deleted")) ? null : DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32("event_deleted")).ToString("s") + "Z"));
|
||||
import.Parameters.Add(new SQLiteParameter("channel", reader.IsDBNull(reader.GetOrdinal("event_channel")) ? null : reader.GetString("event_channel")));
|
||||
import.Parameters.Add(new SQLiteParameter("sender", reader.IsDBNull(reader.GetOrdinal("event_sender")) ? null : reader.GetString("event_sender")));
|
||||
import.Parameters.Add(new SQLiteParameter("sender_name", reader.IsDBNull(reader.GetOrdinal("event_sender_name")) ? string.Empty : reader.GetString("event_sender_name")));
|
||||
ColourInheritable colour = ColourInheritable.FromMisuzu(reader.GetInt32("event_sender_colour"));
|
||||
import.Parameters.Add(new SQLiteParameter("sender_colour", colour.Rgb.HasValue ? colour.Rgb.Value : null));
|
||||
import.Parameters.Add(new SQLiteParameter("sender_rank", reader.IsDBNull(reader.GetOrdinal("event_sender_rank")) ? null : reader.GetInt32("event_sender_rank")));
|
||||
import.Parameters.Add(new SQLiteParameter("sender_nick", reader.IsDBNull(reader.GetOrdinal("event_sender_nick")) ? string.Empty : reader.GetString("event_sender_nick")));
|
||||
import.Parameters.Add(new SQLiteParameter("sender_perms", SQLiteUserPermissionsConverter.To(MariaDBUserPermissionsConverter.From((MariaDBUserPermissions)reader.GetInt32("event_sender_perms")))));
|
||||
import.Parameters.Add(new SQLiteParameter("data", reader.GetString("event_data")));
|
||||
await import.PrepareAsync();
|
||||
await import.ExecuteNonQueryAsync();
|
||||
|
||||
++completed;
|
||||
if(DateTimeOffset.UtcNow - lastReport > TimeSpan.FromMinutes(1)) {
|
||||
lastReport = DateTimeOffset.UtcNow;
|
||||
double completion = (double)completed / rows;
|
||||
logger.ZLogInformation($"{completed} of {rows} converted ({completion:P2})...");
|
||||
}
|
||||
}
|
||||
logger.ZLogInformation($"Converted all {completed} rows!");
|
||||
await new StorageMigrator(logFactory.CreateLogger("migrate"), mariadb, sqlite).Migrate(cts.Token);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue