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 }
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 }