Beispiel #1
0
        protected bool TableExists(IDatabaseConnection db, string name)
        {
            db.BeginTransaction(ReadTransactionMode);

            try
            {
                var retval = false;

                using (var statement = PrepareStatement(db, "select DISTINCT tbl_name from sqlite_master".AsSpan()))
                {
                    foreach (var row in statement.ExecuteQuery())
                    {
                        if (string.Equals(name, row.GetString(0), StringComparison.OrdinalIgnoreCase))
                        {
                            retval = true;
                            break;
                        }
                    }
                }

                db.CommitTransaction();

                return(retval);
            }
            catch (Exception)
            {
                db.RollbackTransaction();

                throw;
            }
        }
        /// <summary>Called to run the command. Can throw on error.</summary>
        /// <param name="cancelToken">Is cancellation pending?</param>
        public void Run(CancellationTokenSource cancelToken)
        {
            if (dataToWrite.Rows.Count > 0)
            {
                if (!tables.TryGetValue(dataToWrite.TableName, out var table))
                {
                    table = new DatabaseTableDetails(connection, dataToWrite.TableName);
                    tables.Add(dataToWrite.TableName, table);
                }

                var query = new InsertQuery(dataToWrite);

                // Make sure the table has the correct columns.
                table.EnsureTableExistsAndHasRequiredColumns(dataToWrite);

                // Get a list of column names.
                var columnNames = dataToWrite.Columns.Cast <DataColumn>().Select(col => col.ColumnName);

                try
                {
                    connection.BeginTransaction();

                    // Write all rows.
                    foreach (DataRow row in dataToWrite.Rows)
                    {
                        query.ExecuteQuery(connection, columnNames, row.ItemArray);
                    }
                }
                finally
                {
                    connection.EndTransaction();
                    query.Close(connection);
                }
            }
        }
Beispiel #3
0
 /// <summary>
 /// Begins the transaction on the appropriate databasource.
 /// </summary>
 protected override void BeginDataSource()
 {
     _transactionsExecutingToDataSource = new Dictionary <string, ITransactional>();
     _dbConnection = _databaseConnection.GetConnection();
     _dbConnection.Open();
     _dbTransaction = _databaseConnection.BeginTransaction(_dbConnection);
 }
        /// <summary>Alter an existing table ensuring all columns exist.</summary>
        /// <param name="table">The table definition to write to the database.</param>
        private void AlterTable(DataTable table)
        {
            bool haveBegunTransaction = false;

            foreach (DataColumn column in table.Columns)
            {
                if (!columnNamesInDb.Contains(column.ColumnName))
                {
                    if (!haveBegunTransaction)
                    {
                        haveBegunTransaction = true;
                        connection.BeginTransaction();
                    }

                    // Column is missing from database file - write it.
                    connection.AddColumn(Name, column.ColumnName, connection.GetDBDataTypeName(column.DataType));
                    columnNamesInDb.Add(column.ColumnName);
                }
            }

            // End the transaction that we started above.
            if (haveBegunTransaction)
            {
                connection.EndTransaction();
            }
        }
Beispiel #5
0
        private void InitializeDatabase(IDatabaseConnection connection)
        {
            using (var transaction = connection.BeginTransaction()) {
                foreach (var batch in ReadSqlFileIntoBatches("SqlServerIntegrationTests\\CreateTestDatabase.sql"))
                {
                    if (batch.Trim() != "")
                    {
                        transaction.ExecuteAdHocQuery(batch, new CommandOptions {
                            CommandTimeout = 30
                        });
                    }
                }

                transaction.Commit();
            }
        }
        public static void RunQueries(this IDatabaseConnection db, string[] queries)
        {
            db.BeginTransaction(TransactionMode.Deferred);

            try
            {
                db.ExecuteAll(string.Join(";", queries));

                db.CommitTransaction();
            }
            catch (Exception)
            {
                db.RollbackTransaction();

                throw;
            }
        }
Beispiel #7
0
        /// <summary>Called to run the command. Can throw on error.</summary>
        /// <param name="cancelToken">Is cancellation pending?</param>
        public void Run(CancellationTokenSource cancelToken)
        {
            if (dataToWrite.Rows.Count > 0)
            {
                if (!tables.TryGetValue(dataToWrite.TableName, out var table))
                {
                    table = new DatabaseTableDetails(connection, dataToWrite.TableName);
                    tables.Add(dataToWrite.TableName, table);
                }

                var query = new InsertQuery(dataToWrite);

                // Make sure the table has the correct columns.
                table.EnsureTableExistsAndHasRequiredColumns(dataToWrite);

                // Get a list of column names.
                var columnNames = dataToWrite.Columns.Cast <DataColumn>().Select(col => col.ColumnName);

                try
                {
                    connection.BeginTransaction();

                    if (deleteExistingRows)
                    {
                        // fixme - this assumes that "Current" checkpoint ID is always 1.
                        // This should always be correct afaik, but it would be better to
                        // verify this at runtime.
                        bool tableHasCheckpointID = connection.GetColumns(dataToWrite.TableName).Any(c => c.Item1 == "CheckpointID");
                        connection.ExecuteNonQuery($"DELETE FROM [{dataToWrite.TableName}] {(tableHasCheckpointID ? "WHERE CheckpointID = 1" : "")}");
                    }
                    // Write all rows.
                    foreach (DataRow row in dataToWrite.Rows)
                    {
                        query.ExecuteQuery(connection, columnNames, row.ItemArray);
                    }
                }
                finally
                {
                    connection.EndTransaction();
                    query.Close(connection);
                }
            }
        }
Beispiel #8
0
        protected bool TableExists(IDatabaseConnection db, string name)
        {
            db.BeginTransaction(ReadTransactionMode);

            try
            {
                var retval = TableExistsInTransaction(db, name);

                db.CommitTransaction();

                return(retval);
            }
            catch (Exception)
            {
                db.RollbackTransaction();

                throw;
            }
        }
Beispiel #9
0
        private void InitializeDatabase(IDatabaseConnection connection)
        {
            using (var transaction = connection.BeginTransaction()) {
                foreach (var batch in ReadSqlFileIntoBatches("PostgreSqlIntegrationTests\\CreateTestDatabase.sql")) {
                    if (batch.Trim() != "") {
                        transaction.ExecuteAdHocQuery(batch, new CommandOptions { CommandTimeout = 30 });
                    }
                }

                transaction.Commit();
            }
        }
Beispiel #10
0
 public TransactionContext WithTransaction()
 {
     transactionContext = new TransactionContext(this, connection.BeginTransaction());
     return(transactionContext);
 }