public async Task ExecuteSql(string query) { if (string.IsNullOrWhiteSpace(query) || !IsConnected) { return; } databaseLogger.Log(query, null, TraceLevel.Info); using var writeLock = await DatabaseLock.WriteLock(); MySqlConnection conn = new(worldConnectionString.ConnectionString); MySqlTransaction transaction; try { conn.Open(); transaction = await conn.BeginTransactionAsync(); } catch (Exception e) { throw new IMySqlExecutor.CannotConnectToDatabaseException(e); } try { MySqlCommand cmd = new(query, conn, transaction); await cmd.ExecuteNonQueryAsync(); await transaction.CommitAsync(); } catch (MySqlConnector.MySqlException e) { await transaction.RollbackAsync(); await conn.CloseAsync(); throw new IMySqlExecutor.QueryFailedDatabaseException(e.Message, e); } catch (Exception ex) { await transaction.RollbackAsync(); await conn.CloseAsync(); throw new IMySqlExecutor.QueryFailedDatabaseException(ex); } await conn.CloseAsync(); foreach (var tableName in queryEvaluator.Extract(query).Select(q => q.TableName).Distinct()) { mainThread.Dispatch(() => eventAggregator.GetEvent <DatabaseTableChanged>().Publish(tableName)); } }
protected override void CallCallbacksOnMainThread() { mainThread.Dispatch(InvokeUpdatedEvent); }
public void Report(float value) { mainThread.Dispatch(() => FilteringProgress = value * 100f); }