Exemple #1
0
        internal static void Generate(DBConnection cn, TextWriter writer, string baseNamespace, IDatabase database, int?commandTimeout)
        {
            writer.WriteLine("namespace " + baseNamespace + ".Sequences {");

            var cmd = cn.DatabaseInfo.CreateCommand(null);

            cmd.CommandText = "SELECT * FROM USER_SEQUENCES";
            cn.ExecuteReaderCommand(
                cmd,
                reader => {
                while (reader.Read())
                {
                    var sequenceName = reader["SEQUENCE_NAME"].ToString();
                    writer.WriteLine();
                    writer.WriteLine("public class " + sequenceName + " {");
                    writer.WriteLine("public static decimal GetNextValue() {");
                    writer.WriteLine("DbCommand cmd = " + DataAccessStatics.DataAccessStateCurrentDatabaseConnectionCreateCommandExpression(commandTimeout) + ";");
                    writer.WriteLine($@"cmd.CommandText = ""SELECT {sequenceName}.NEXTVAL FROM DUAL"";");
                    writer.WriteLine("return (decimal)" + DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression + ".ExecuteScalarCommand( cmd );");
                    writer.WriteLine("}");
                    writer.WriteLine("}");
                }
            });

            writer.WriteLine();
            writer.WriteLine("}");
        }
        private static void writeMethod(TextWriter writer, IDatabase database, CustomModification mod, int?commandTimeout)
        {
            writer.WriteLine(
                $"public static void {mod.name}( {DataAccessStatics.GetMethodParamsFromCommandText( info, StringTools.ConcatenateWithDelimiter( "; ", mod.commands ) )} ) {{");

            writer.WriteLine(DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression + ".ExecuteInTransaction( delegate {");
            var cnt = 0;

            foreach (var command in mod.commands)
            {
                var commandVariableName = "cmd" + cnt++;
                writer.WriteLine($"{TypeNames.DbCommand} {commandVariableName} = {DataAccessStatics.DataAccessStateCurrentDatabaseConnectionCreateCommandExpression( commandTimeout )};");
                writer.WriteLine(commandVariableName + ".CommandText = @\"" + command + "\";");
                DataAccessStatics.WriteAddParamBlockFromCommandText(writer, commandVariableName, info, command, database);
                writer.WriteLine($"{DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression}.ExecuteNonQueryCommand( {commandVariableName} );");
            }

            writer.WriteLine("} );");            // execute in transaction call

            writer.WriteLine("}");               // method
        }
Exemple #3
0
        private static void writeQueryMethod(
            TextWriter writer, IDatabase database, Query query, QueryPostSelectFromClause postSelectFromClause, int?commandTimeout)
        {
            // header
            CodeGenerationStatics.AddSummaryDocComment(writer, "Queries the database and returns the full results collection immediately.");
            writer.WriteLine(
                "public static IEnumerable<Row> GetRows" + postSelectFromClause.name + "( " +
                DataAccessStatics.GetMethodParamsFromCommandText(info, query.selectFromClause + " " + postSelectFromClause.Value) + " ) {");


            // body

            var namedParamList       = DataAccessStatics.GetNamedParamList(info, query.selectFromClause + " " + postSelectFromClause.Value);
            var getResultSetFirstArg = namedParamList.Any() ? "new[] { " + StringTools.ConcatenateWithDelimiter(", ", namedParamList.ToArray()) + " }, " : "";

            writer.WriteLine("return Cache.Current." + getQueryCacheName(query, postSelectFromClause, false) + ".GetResultSet( " + getResultSetFirstArg + "() => {");

            writer.WriteLine($"var cmd = {DataAccessStatics.DataAccessStateCurrentDatabaseConnectionCreateCommandExpression( commandTimeout )};");
            writer.WriteLine("cmd.CommandText = selectFromClause");
            if (!postSelectFromClause.Value.IsNullOrWhiteSpace())
            {
                writer.Write($@"+ @""{postSelectFromClause.Value}""");
            }
            writer.Write(";");
            DataAccessStatics.WriteAddParamBlockFromCommandText(writer, "cmd", info, query.selectFromClause + " " + postSelectFromClause.Value, database);
            writer.WriteLine("var results = new List<Row>();");
            writer.WriteLine(
                DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression +
                ".ExecuteReaderCommand( cmd, r => { while( r.Read() ) results.Add( new Row( new BasicRow( r ) ) ); } );");

            // Update single-row caches.
            writer.WriteLine("foreach( var i in results )");
            writer.WriteLine("updateSingleRowCaches( i );");

            writer.WriteLine("return results;");

            writer.WriteLine("} );");
            writer.WriteLine("}");
        }
        private static void writeCopyLatestRevisionsMethod(DBConnection cn, Table table, IEnumerable <Column> nonIdentityColumns, int?commandTimeoutSeconds)
        {
            writer.WriteLine($"private static void copyLatestRevisions( List<{table.GetTableConditionInterfaceReference()}> conditions ) {{");

            writer.WriteLine("var revisionHistorySetup = RevisionHistoryStatics.SystemProvider;");

            writer.WriteLine(
                $@"var command = new {TypeNames.InlineSelect}( ""new [] {{{columns.PrimaryKeyAndRevisionIdColumn.Name}""}}, ""FROM {table.ObjectIdentifier}"", false, {commandTimeoutSeconds
						                                                                                                                                                       ?.ToString() ??
					                                                                                                                                                       "null"} );"                    );
            writer.WriteLine("conditions.ForEach( condition => command.AddCondition( condition.CommandCondition ) );");
            writer.WriteLine("command.AddCondition( getLatestRevisionsCondition() );");
            writer.WriteLine("var latestRevisionIds = new List<int>();");
            writer.WriteLine(
                "command.Execute( " + DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression +
                ", r => { while( r.Read() ) latestRevisionIds.Add( System.Convert.ToInt32( r[0] ) ); } );");
            writer.WriteLine("foreach( var latestRevisionId in latestRevisionIds ) {");

            // Get the latest revision.
            writer.WriteLine("var latestRevision = revisionHistorySetup.GetRevision( latestRevisionId );");

            // If this condition is true, we've already modified the row in this transaction. If we were to copy it, we'd end up with two revisions of the same entity
            // in the same user transaction, which we don't support.
            writer.WriteLine("if( latestRevision.UserTransactionId == " + DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression + ".GetUserTransactionId() )");
            writer.WriteLine("continue;");

            // Update the latest revision with a new user transaction.
            writer.WriteLine(
                "revisionHistorySetup.UpdateRevision( latestRevisionId, latestRevisionId, " + DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression +
                ".GetUserTransactionId(), latestRevisionId );");

            // Insert a copy of the latest revision with a new ID. This will represent the revision of the data before it was changed.
            writer.WriteLine("var copiedRevisionId = revisionHistorySetup.GetNextMainSequenceValue();");
            writer.WriteLine("revisionHistorySetup.InsertRevision( copiedRevisionId, latestRevisionId, latestRevision.UserTransactionId );");

            // Insert a copy of the data row and make it correspond to the copy of the latest revision.
            writer.WriteLine("var copyCommand = " + DataAccessStatics.DataAccessStateCurrentDatabaseConnectionCreateCommandExpression(commandTimeoutSeconds) + ";");
            writer.WriteLine("copyCommand.CommandText = \"INSERT INTO " + table.ObjectIdentifier + " SELECT \";");
            foreach (var column in nonIdentityColumns)
            {
                if (column == columns.PrimaryKeyAndRevisionIdColumn)
                {
                    writer.WriteLine("var revisionIdParameter = new DbCommandParameter( \"copiedRevisionId\", new DbParameterValue( copiedRevisionId ) );");
                    writer.WriteLine(
                        "copyCommand.CommandText += revisionIdParameter.GetNameForCommandText( " + DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression +
                        ".DatabaseInfo ) + \", \";");
                    writer.WriteLine(
                        "copyCommand.Parameters.Add( revisionIdParameter.GetAdoDotNetParameter( " + DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression +
                        ".DatabaseInfo ) );");
                }
                else
                {
                    writer.WriteLine("copyCommand.CommandText += \"" + column.Name + ", \";");
                }
            }

            writer.WriteLine("copyCommand.CommandText = copyCommand.CommandText.Remove( copyCommand.CommandText.Length - 2 );");
            writer.WriteLine("copyCommand.CommandText += \" FROM " + table.ObjectIdentifier + " WHERE \";");
            writer.WriteLine(
                "( new EqualityCondition( new InlineDbCommandColumnValue( \"" + columns.PrimaryKeyAndRevisionIdColumn.Name +
                "\", new DbParameterValue( latestRevisionId ) ) ) as InlineDbCommandCondition ).AddToCommand( copyCommand, " +
                DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression + ".DatabaseInfo, \"latestRevisionId\" );");
            writer.WriteLine(DataAccessStatics.DataAccessStateCurrentDatabaseConnectionExpression + ".ExecuteNonQueryCommand( copyCommand );");

            writer.WriteLine("}");               // foreach
            writer.WriteLine("}");               // method
        }