コード例 #1
0
        internal static void Generate(
            DBConnection cn, TextWriter writer, string baseNamespace, Database database,
            EnterpriseWebLibrary.Configuration.SystemDevelopment.Database configuration)
        {
            if (configuration.queries == null)
            {
                return;
            }

            info = cn.DatabaseInfo;
            writer.WriteLine("namespace " + baseNamespace + "." + database.SecondaryDatabaseName + "Retrieval {");

            foreach (var query in configuration.queries)
            {
                List <Column> columns;
                try {
                    columns = validateQueryAndGetColumns(cn, query);
                }
                catch (Exception e) {
                    throw new UserCorrectableException("Column retrieval failed for the " + query.name + " query.", e);
                }

                CodeGenerationStatics.AddSummaryDocComment(writer, "This object holds the values returned from a " + query.name + " query.");
                var className = "{0}Retrieval".FormatWith(query.name);
                writer.WriteLine("public static partial class " + className + " {");

                // Write nested classes.
                DataAccessStatics.WriteRowClasses(writer, columns, localWriter => {}, localWriter => {});
                writeCacheClass(writer, database, query);

                writer.WriteLine("private const string selectFromClause = @\"" + query.selectFromClause + " \";");
                foreach (var postSelectFromClause in query.postSelectFromClauses)
                {
                    writeQueryMethod(writer, database, query, postSelectFromClause);
                }
                writer.WriteLine("static partial void updateSingleRowCaches( Row row );");

                DataAccessStatics.WriteRevisionDeltaExtensionMethods(writer, className, columns.Where(i => !i.IsRowVersion));

                writer.WriteLine("}");           // class
            }
            writer.WriteLine("}");               // namespace
        }
コード例 #2
0
        internal static void Generate(
            DBConnection cn, TextWriter writer, string namespaceDeclaration, Database database, IEnumerable <string> tableNames,
            EnterpriseWebLibrary.Configuration.SystemDevelopment.Database configuration)
        {
            StandardModificationStatics.writer   = writer;
            StandardModificationStatics.database = database;

            writer.WriteLine(namespaceDeclaration);
            foreach (var tableName in tableNames)
            {
                var isRevisionHistoryTable = DataAccessStatics.IsRevisionHistoryTable(tableName, configuration);

                writeClass(cn, tableName, isRevisionHistoryTable, false);
                if (isRevisionHistoryTable)
                {
                    writeClass(cn, tableName, true, true);
                }
            }
            writer.WriteLine("}");
        }
コード例 #3
0
        internal static void Generate(
            DBConnection cn, TextWriter writer, string baseNamespace, Database database,
            EnterpriseWebLibrary.Configuration.SystemDevelopment.Database configuration)
        {
            info = cn.DatabaseInfo;
            if (configuration.customModifications != null)
            {
                writer.WriteLine("namespace " + baseNamespace + " {");

                testQueries(cn, configuration.customModifications);

                CodeGenerationStatics.AddSummaryDocComment(writer, "Contains custom modification operations.");
                writer.WriteLine("public static class " + database.SecondaryDatabaseName + "CustomModifications {");

                foreach (var mod in configuration.customModifications)
                {
                    writeMethod(writer, database, mod);
                }

                writer.WriteLine("}");                   // class
                writer.WriteLine("}");                   // namespace
            }
        }
コード例 #4
0
 internal static bool IsRevisionHistoryTable(string table, EnterpriseWebLibrary.Configuration.SystemDevelopment.Database configuration)
 {
     return(configuration.revisionHistoryTables != null &&
            configuration.revisionHistoryTables.Any(revisionHistoryTable => revisionHistoryTable.EqualsIgnoreCase(table)));
 }
コード例 #5
0
        internal static void Generate(
            DBConnection cn, TextWriter writer, string baseNamespace, Database database,
            EnterpriseWebLibrary.Configuration.SystemDevelopment.Database configuration)
        {
            if (configuration.rowConstantTables == null)
            {
                return;
            }

            writer.WriteLine("namespace " + baseNamespace + "." + database.SecondaryDatabaseName + "RowConstants {");
            foreach (var table in configuration.rowConstantTables)
            {
                Column valueColumn;
                var    orderIsSpecified = !table.orderByColumn.IsNullOrWhiteSpace();
                var    values           = new List <string>();
                var    names            = new List <string>();
                try {
                    var columns = new TableColumns(cn, table.tableName, false);
                    valueColumn = columns.AllColumnsExceptRowVersion.Single(column => column.Name.ToLower() == table.valueColumn.ToLower());
                    var nameColumn = columns.AllColumnsExceptRowVersion.Single(column => column.Name.ToLower() == table.nameColumn.ToLower());

                    var cmd = new InlineSelect(
                        new[] { valueColumn.Name, nameColumn.Name },
                        "FROM " + table.tableName,
                        false,
                        orderByClause: orderIsSpecified ? "ORDER BY " + table.orderByColumn : "");
                    cmd.Execute(
                        cn,
                        reader => {
                        while (reader.Read())
                        {
                            if (reader.IsDBNull(reader.GetOrdinal(valueColumn.Name)))
                            {
                                values.Add(valueColumn.NullValueExpression.Any() ? valueColumn.NullValueExpression : "null");
                            }
                            else
                            {
                                var valueString = valueColumn.ConvertIncomingValue(reader[valueColumn.Name]).ToString();
                                values.Add(valueColumn.DataTypeName == typeof(string).ToString() ? "\"{0}\"".FormatWith(valueString) : valueString);
                            }
                            names.Add(nameColumn.ConvertIncomingValue(reader[nameColumn.Name]).ToString());
                        }
                    });
                }
                catch (Exception e) {
                    throw new UserCorrectableException(
                              "Column or data retrieval failed for the " + table.tableName +
                              " row constant table. Make sure the table and the value, name, and order by columns exist.",
                              e);
                }

                CodeGenerationStatics.AddSummaryDocComment(writer, "Provides constants copied from the " + table.tableName + " table.");
                var className = table.tableName.TableNameToPascal(cn) + "Rows";
                writer.WriteLine("public class " + className + " {");

                // constants
                for (var i = 0; i < values.Count; i++)
                {
                    CodeGenerationStatics.AddSummaryDocComment(writer, "Constant generated from row in database table.");

                    // It's important that row constants actually *be* constants (instead of static readonly) so they can be used in switch statements.
                    writer.WriteLine(
                        "public const " + valueColumn.DataTypeName + " " + EwlStatics.GetCSharpIdentifier(names[i].CamelToEnglish().EnglishToPascal()) + " = " +
                        values[i] + ";");
                }

                // one to one map
                var dictionaryType = "OneToOneMap<" + valueColumn.DataTypeName + ", string>";
                writer.WriteLine("private static readonly " + dictionaryType + " " + dictionaryName + " = new " + dictionaryType + "();");

                writeStaticConstructor(writer, className, names, values, valueColumn.DataTypeName);

                // methods
                writeGetNameFromValueMethod(writer, valueColumn.DataTypeName);
                writeGetValueFromNameMethod(writer, valueColumn.DataTypeName);
                if (orderIsSpecified)
                {
                    writeGetValuesToNamesMethod(writer, valueColumn.DataTypeName);
                    writeFillListControlMethod(writer, valueColumn);
                }

                writer.WriteLine("}");           // class
            }
            writer.WriteLine("}");               // namespace
        }
コード例 #6
0
        internal static void Generate(
            DBConnection cn, TextWriter writer, string namespaceDeclaration, Database database, IEnumerable <string> tableNames,
            EnterpriseWebLibrary.Configuration.SystemDevelopment.Database configuration)
        {
            writer.WriteLine(namespaceDeclaration);
            foreach (var table in tableNames)
            {
                CodeGenerationStatics.AddSummaryDocComment(writer, "Contains logic that retrieves rows from the " + table + " table.");
                writer.WriteLine("public static partial class " + GetClassName(cn, table) + " {");

                var isRevisionHistoryTable = DataAccessStatics.IsRevisionHistoryTable(table, configuration);
                var columns = new TableColumns(cn, table, isRevisionHistoryTable);

                // Write nested classes.
                DataAccessStatics.WriteRowClasses(
                    writer,
                    columns.AllColumns,
                    localWriter => {
                    if (!isRevisionHistoryTable)
                    {
                        return;
                    }
                    writer.WriteLine(
                        "public UserTransaction Transaction { get { return RevisionHistoryStatics.UserTransactionsById[ RevisionHistoryStatics.RevisionsById[ System.Convert.ToInt32( " +
                        EwlStatics.GetCSharpIdentifier(columns.PrimaryKeyAndRevisionIdColumn.PascalCasedNameExceptForOracle) + " ) ].UserTransactionId ]; } }");
                },
                    localWriter => {
                    if (!columns.DataColumns.Any())
                    {
                        return;
                    }

                    var modClass = database.SecondaryDatabaseName + "Modification." +
                                   StandardModificationStatics.GetClassName(cn, table, isRevisionHistoryTable, isRevisionHistoryTable);
                    var revisionHistorySuffix = StandardModificationStatics.GetRevisionHistorySuffix(isRevisionHistoryTable);
                    writer.WriteLine("public " + modClass + " ToModification" + revisionHistorySuffix + "() {");
                    writer.WriteLine(
                        "return " + modClass + ".CreateForSingleRowUpdate" + revisionHistorySuffix + "( " + StringTools.ConcatenateWithDelimiter(
                            ", ",
                            columns.AllColumnsExceptRowVersion.Select(i => EwlStatics.GetCSharpIdentifier(i.PascalCasedNameExceptForOracle)).ToArray()) + " );");
                    writer.WriteLine("}");
                });
                writeCacheClass(cn, writer, database, table, columns, isRevisionHistoryTable);

                var isSmallTable = configuration.SmallTables != null && configuration.SmallTables.Any(i => i.EqualsIgnoreCase(table));

                var tableUsesRowVersionedCaching = configuration.TablesUsingRowVersionedDataCaching != null &&
                                                   configuration.TablesUsingRowVersionedDataCaching.Any(i => i.EqualsIgnoreCase(table));
                if (tableUsesRowVersionedCaching && columns.RowVersionColumn == null && !(cn.DatabaseInfo is OracleInfo))
                {
                    throw new UserCorrectableException(
                              cn.DatabaseInfo is MySqlInfo
                                                        ? "Row-versioned data caching cannot currently be used with MySQL databases."
                                                        : "Row-versioned data caching can only be used with the {0} table if you add a rowversion column.".FormatWith(table));
                }

                if (isSmallTable)
                {
                    writeGetAllRowsMethod(writer, isRevisionHistoryTable, false);
                }
                writeGetRowsMethod(cn, writer, database, table, columns, isSmallTable, tableUsesRowVersionedCaching, isRevisionHistoryTable, false);
                if (isRevisionHistoryTable)
                {
                    if (isSmallTable)
                    {
                        writeGetAllRowsMethod(writer, true, true);
                    }
                    writeGetRowsMethod(cn, writer, database, table, columns, isSmallTable, tableUsesRowVersionedCaching, true, true);
                }

                writeGetRowMatchingPkMethod(cn, writer, database, table, columns, isSmallTable, tableUsesRowVersionedCaching, isRevisionHistoryTable);

                if (isRevisionHistoryTable)
                {
                    DataAccessStatics.WriteGetLatestRevisionsConditionMethod(writer, columns.PrimaryKeyAndRevisionIdColumn.Name);
                }

                if (tableUsesRowVersionedCaching)
                {
                    var keyTupleTypeArguments = getPkAndVersionTupleTypeArguments(cn, columns);

                    writer.WriteLine("private static " + "Cache<System.Tuple<" + keyTupleTypeArguments + ">, BasicRow>" + " getRowsByPkAndVersion() {");
                    writer.WriteLine(
                        "return AppMemoryCache.GetCacheValue<{0}>( \"{1}\", () => new {0}( i => System.Tuple.Create( {2} ) ) ).RowsByPkAndVersion;".FormatWith(
                            "VersionedRowDataCache<System.Tuple<{0}>, System.Tuple<{1}>, BasicRow>".FormatWith(getPkTupleTypeArguments(columns), keyTupleTypeArguments),
                            database.SecondaryDatabaseName + table.TableNameToPascal(cn) + "TableRetrievalRowsByPkAndVersion",
                            StringTools.ConcatenateWithDelimiter(
                                ", ",
                                Enumerable.Range(1, columns.KeyColumns.Count()).Select(i => "i.Item{0}".FormatWith(i)).ToArray())));
                    writer.WriteLine("}");
                }

                // Initially we did not generate this method for small tables, but we found a need for it when the cache is disabled since that will cause
                // GetRowMatchingId to repeatedly query.
                if (columns.KeyColumns.Count() == 1 && columns.KeyColumns.Single().Name.ToLower().EndsWith("id"))
                {
                    writeToIdDictionaryMethod(writer, columns);
                }

                if (isRevisionHistoryTable)
                {
                    DataAccessStatics.WriteRevisionDeltaExtensionMethods(writer, GetClassName(cn, table), columns.DataColumns);
                }

                writer.WriteLine("}");           // class
            }
            writer.WriteLine("}");               // namespace
        }