Пример #1
0
        private void FinishLoading(Dictionary <string, List <SimpleDataColumn> > fieldMap)
        {
            foreach (KeyValuePair <string, List <SimpleDataColumn> > field1 in fieldMap)
            {
                TableDefinition    table  = GetTable(field1.Key);
                SimpleDataColumn[] fields = field1.Value.ToArray();
                if (!string.IsNullOrEmpty(table.MainDataHolderName))
                {
                    DataHolderDefinition dataDef = DataHolderDefinitions
                                                   .Where(dataHolderDef =>
                                                          dataHolderDef.Name.Equals(table.MainDataHolderName,
                                                                                    StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
                    if (dataDef == null)
                    {
                        throw new DataHolderException("Table \"{0}\" refered to invalid MainDataHolder: {1}", (object)table,
                                                      (object)table.MainDataHolderName);
                    }
                    table.SetMainDataHolder(dataDef, false);
                }

                try
                {
                    List <PrimaryColumn> primaryColumnList = new List <PrimaryColumn>();
                    primaryColumnList.AddRange(table.PrimaryColumns);
                    for (int index = 0; index < fields.Length; ++index)
                    {
                        SimpleDataColumn field         = fields[index];
                        PrimaryColumn    primaryColumn = primaryColumnList
                                                         .Where(
                            primCol => primCol.Name == field.ColumnName)
                                                         .FirstOrDefault();
                        if (primaryColumn != null)
                        {
                            primaryColumn.DataColumn = field;
                            field.IsPrimaryKey       = true;
                            primaryColumnList.Remove(primaryColumn);
                        }

                        if (field.ColumnName == null && field.DefaultValue == null)
                        {
                            LightDBMgr.OnInvalidData(
                                "Field-definition \"{0}\" did not define a Column nor a DefaultValue.", (object)field);
                        }
                    }

                    for (int index1 = 0; index1 < fields.Length; ++index1)
                    {
                        SimpleDataColumn simpleDataColumn1 = fields[index1];
                        for (int index2 = 0; index2 < simpleDataColumn1.FieldList.Count; ++index2)
                        {
                            IFlatDataFieldAccessor field2 = simpleDataColumn1.FieldList[index2];
                            if (field2.DataHolderDefinition.DependingField == field2)
                            {
                                SimpleDataColumn simpleDataColumn2 = fields[0];
                                fields[0]      = simpleDataColumn1;
                                fields[index1] = simpleDataColumn2;
                            }
                        }
                    }

                    if (primaryColumnList.Count > 0 && table.MainDataHolder == null)
                    {
                        throw new DataHolderException(
                                  "Table \"{0}\" referenced PrimaryColumn(s) ({1}) but did not define a MainDataHolder explicitely.",
                                  (object)table, (object)primaryColumnList.ToString(", "));
                    }
                    if (primaryColumnList.Count > 0 || table.Variables != null && table.Variables.Length > 0)
                    {
                        int num1             = table.Variables != null ? table.Variables.Length : 0;
                        int destinationIndex = num1 + primaryColumnList.Count;
                        SimpleDataColumn[] simpleDataColumnArray =
                            new SimpleDataColumn[fields.Length + destinationIndex];
                        Array.Copy(fields, 0, simpleDataColumnArray, destinationIndex, fields.Length);
                        fields = simpleDataColumnArray;
                        if (num1 > 0)
                        {
                            InitVars(table, fields);
                        }
                        int num2 = num1;
                        foreach (PrimaryColumn primaryColumn in primaryColumnList)
                        {
                            DataFieldProxy dataFieldProxy =
                                new DataFieldProxy(primaryColumn.Name, table.MainDataHolder);
                            IFieldReader reader = Converters.GetReader(primaryColumn.TypeName);
                            if (reader == null)
                            {
                                throw new DataHolderException(
                                          "Invalid Type \"" + primaryColumn.TypeName + "\" for PrimaryColumn \"" +
                                          primaryColumn.Name + "\" in definition for Table: " + table +
                                          " - You must explicitely define the TypeName attribute inside the PrimaryColumn node, if it is only an additional table for a DataHolder!");
                            }
                            SimpleDataColumn simpleDataColumn = new SimpleDataColumn(primaryColumn.Name, reader, 0)
                            {
                                IsPrimaryKey = true
                            };
                            simpleDataColumn.FieldList.Add(dataFieldProxy);
                            fields[num2++] = primaryColumn.DataColumn = simpleDataColumn;
                        }
                    }

                    int num = 0;
                    for (int index = 0; index < fields.Length; ++index)
                    {
                        SimpleDataColumn simpleDataColumn = fields[index];
                        if (simpleDataColumn.DefaultValue == null)
                        {
                            simpleDataColumn.m_index = num++;
                        }
                        else
                        {
                            simpleDataColumn.Reader = null;
                        }
                    }

                    TableDefinitionMap[field1.Key].ColumnDefinitions = fields;
                }
                catch (Exception ex)
                {
                    throw new DataHolderException(ex, "Unable to setup Table \"{0}\" (MainDataHolder: \"{1}\")", (object)table,
                                                  (object)table.MainDataHolder);
                }
            }

            m_mappings =
                CreateDataHolderTableMappings(m_tableDataHolderMap,
                                              DataHolderDefinitions);
        }
Пример #2
0
        /// <summary>
        /// LUA结构支持
        /// </summary>
        /// <returns></returns>
        public override void GetLuaStruct(StringBuilder code)
        {
            base.GetLuaStruct(code);
            int idx;

            code.AppendLine($@"['ColumnIndexStart'] ={ColumnIndexStart},");

            code.AppendLine($@"['IsUniqueUnion'] ={(IsUniqueUnion.ToString().ToLower())},");

            if (PrimaryColumn != null)
            {
                code.AppendLine($@"['PrimaryColumn'] = {PrimaryColumn.GetLuaStruct()},");
            }

            if (!string.IsNullOrWhiteSpace(PrimaryField))
            {
                code.AppendLine($@"['PrimaryField'] = '{PrimaryField.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['PrimaryField'] = nil,");
            }

            if (!string.IsNullOrWhiteSpace(RedisKey))
            {
                code.AppendLine($@"['RedisKey'] = '{RedisKey.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['RedisKey'] = nil,");
            }

            if (!string.IsNullOrWhiteSpace(ModelInclude))
            {
                code.AppendLine($@"['ModelInclude'] = '{ModelInclude.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['ModelInclude'] = nil,");
            }

            if (!string.IsNullOrWhiteSpace(ModelBase))
            {
                code.AppendLine($@"['ModelBase'] = '{ModelBase.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['ModelBase'] = nil,");
            }

            code.AppendLine($@"['DataVersion'] ={DataVersion},");

            code.AppendLine($@"['IsInternal'] ={(IsInternal.ToString().ToLower())},");

            if (!string.IsNullOrWhiteSpace(Name))
            {
                code.AppendLine($@"['Name'] = '{Name.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['Name'] = nil,");
            }

            code.AppendLine($@"['IsClass'] ={(IsClass.ToString().ToLower())},");

            if (!string.IsNullOrWhiteSpace(Interfaces))
            {
                code.AppendLine($@"['Interfaces'] = '{Interfaces.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['Interfaces'] = nil,");
            }

            if (!string.IsNullOrWhiteSpace(Project))
            {
                code.AppendLine($@"['Project'] = '{Project.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['Project'] = nil,");
            }

            code.AppendLine($@"['MaxIdentity'] ={MaxIdentity},");

            idx = 0;
            code.AppendLine("['Properties'] ={");
            foreach (var val in Properties)
            {
                if (idx++ > 0)
                {
                    code.Append(',');
                }
                code.AppendLine($@"{val.GetLuaStruct()}");
            }
            code.AppendLine("},");

            //idx = 0;
            //code.AppendLine("['LastProperties'] ={");
            //foreach (var val in LastProperties)
            //{
            //    if (idx++ > 0)
            //        code.Append(',');
            //    code.AppendLine($@"{val.GetLuaStruct()}");
            //}
            //code.AppendLine("},");

            idx = 0;
            code.AppendLine("['Commands'] ={");
            foreach (var val in Commands)
            {
                if (idx++ > 0)
                {
                    code.Append(',');
                }
                code.AppendLine($@"{val.GetLuaStruct()}");
            }
            code.AppendLine("},");

            idx = 0;
            code.AppendLine("['Releations'] ={");
            foreach (var val in Releations)
            {
                if (idx++ > 0)
                {
                    code.Append(',');
                }
                code.AppendLine($@"{val.GetLuaStruct()}");
            }
            code.AppendLine("},");

            code.AppendLine($@"['MaxForm'] ={(MaxForm.ToString().ToLower())},");

            code.AppendLine($@"['ListDetails'] ={(ListDetails.ToString().ToLower())},");

            if (!string.IsNullOrWhiteSpace(ReadTableName))
            {
                code.AppendLine($@"['TableName'] = '{ReadTableName.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['TableName'] = nil,");
            }

            if (!string.IsNullOrWhiteSpace(SaveTableName))
            {
                code.AppendLine($@"['SaveTableName'] = '{SaveTableName.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['SaveTableName'] = nil,");
            }

            if (!string.IsNullOrWhiteSpace(SaveTable))
            {
                code.AppendLine($@"['SaveTable'] = '{SaveTable.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['SaveTable'] = nil,");
            }

            code.AppendLine($@"['DbIndex'] ={DbIndex},");

            code.AppendLine($@"['UpdateByModified'] ={(UpdateByModified.ToString().ToLower())},");

            if (!string.IsNullOrWhiteSpace(CppName))
            {
                code.AppendLine($@"['CppName'] = '{CppName.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['CppName'] = nil,");
            }

            if (!string.IsNullOrWhiteSpace(DisplayName))
            {
                code.AppendLine($@"['DisplayName'] = '{DisplayName.ToLuaString()}',");
            }
            else
            {
                code.AppendLine($@"['DisplayName'] = nil,");
            }

            //idx = 0;
            //code.AppendLine("['PublishProperty'] ={");
            //foreach (var val in PublishProperty)
            //{
            //    if (idx++ > 0)
            //        code.Append(',');
            //    code.AppendLine($@"{val.GetLuaStruct()}");
            //}
            //code.AppendLine("},");

            //idx = 0;
            //code.AppendLine("['CppProperty'] ={");
            //foreach (var val in CppProperty)
            //{
            //    if (idx++ > 0)
            //        code.Append(',');
            //    code.AppendLine($@"{val.GetLuaStruct()}");
            //}
            //code.AppendLine("},");

            //idx = 0;
            //code.AppendLine("['ClientProperty'] ={");
            //foreach (var val in ClientProperty)
            //{
            //    if (idx++ > 0)
            //        code.Append(',');
            //    code.AppendLine($@"{val.GetLuaStruct()}");
            //}
            //code.AppendLine("},");

            //idx = 0;
            //code.AppendLine("['UserProperty'] ={");
            //foreach (var val in UserProperty)
            //{
            //    if (idx++ > 0)
            //        code.Append(',');
            //    code.AppendLine($@"{val.GetLuaStruct()}");
            //}
            //code.AppendLine("},");

            //idx = 0;
            //code.AppendLine("['PublishDbFields'] ={");
            //foreach (var val in PublishDbFields)
            //{
            //    if (idx++ > 0)
            //        code.Append(',');
            //    code.AppendLine($@"{val.GetLuaStruct()}");
            //}
            //code.AppendLine("},");

            //idx = 0;
            //code.AppendLine("['DbFields'] ={");
            //foreach (var val in DbFields)
            //{
            //    if (idx++ > 0)
            //        code.Append(',');
            //    code.AppendLine($@"{val.GetLuaStruct()}");
            //}
            //code.AppendLine("},");

            //idx = 0;
            //code.AppendLine("['ReadCoreCodes'] ={");
            //foreach (var val in ReadCoreCodes.Values)
            //{
            //    if (idx++ > 0)
            //        code.Append(',');
            //    code.AppendLine($@"{val.GetLuaStruct()}");
            //}
            //code.AppendLine("},");
        }
Пример #3
0
        public static List <ColumnBase> ReadSchemaColumn(String tableName)
        {
            LogUtils.Logs.Log("Begin reading schema column for table:{0}", tableName);
            var query = String.Format(@"SELECT C.*,RK.CNST_NAME, RK.PARENT_COL, RK.PARENT, ISPK, ISUK, UKNAME  
                           FROM  
                                       (SELECT COLUMN_NAME ,IS_NULLABLE ,  DATA_TYPE, 
                                               CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX 
                                       FROM INFORMATION_SCHEMA.COLUMNS   
                                       WHERE TABLE_NAME= '{0}') AS C 
                           LEFT OUTER JOIN 
                                       (SELECT DISTINCT OBJECT_NAME(constraint_object_id) CNST_NAME,COL_NAME(parent_object_id, parent_column_id ) AS CHILD_COL, 
                                                         COL_NAME(referenced_object_id, referenced_column_id ) AS  PARENT_COL, 
                                                         OBJECT_NAME(referenced_object_id) AS PARENT 
                                       FROM sys.foreign_key_columns 
                                       WHERE OBJECT_NAME(parent_object_id) = '{0}')	AS RK 
                           ON C.COLUMN_NAME = RK.CHILD_COL 
                           LEFT OUTER JOIN 
                                       (SELECT  COLUMN_NAME, 
                                       OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsPrimaryKey') ISPK  
                                       FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
                                       WHERE TABLE_NAME='{0}' AND  OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsPrimaryKey') = 1) AS PK  
                           ON C.COLUMN_NAME = PK.COLUMN_NAME  
                           LEFT OUTER JOIN  
                                       (SELECT  COLUMN_NAME,  CONSTRAINT_NAME AS UKNAME , 
                                       OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsUniqueCnst') ISUK 
                                       FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
                                       WHERE TABLE_NAME='{0}' AND OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_NAME), 'IsUniqueCnst') = 1) AS UK 
                           ON C.COLUMN_NAME = UK.COLUMN_NAME", tableName);
            var table = new DataTable();

            Sql.Fill(query, table);
            var columnList = new List <ColumnBase>();

            foreach (DataRow row in table.Rows)
            {
                var        isPk   = FieldUtils.AsInt(row, "ISPK") == 1;
                var        isUk   = FieldUtils.AsInt(row, "ISUK") == 1;
                var        isRef  = !String.IsNullOrEmpty(FieldUtils.AsText(row, "PARENT_COL"));
                ColumnBase column = null;
                if ((isPk || isUk) && !isRef)
                {
                    column = new PrimaryColumn();
                }
                else if (isRef)
                {
                    column = new ReferenceColumn();
                }
                else
                {
                    column = new NormalColumn();
                }

                column.Name              = FieldUtils.AsText(row, "COLUMN_NAME");
                column.UniqueName        = FieldUtils.AsText(row, "UKNAME");
                column.DataTypeName      = FieldUtils.AsText(row, "DATA_TYPE");
                column.MaxLength         = FieldUtils.AsInt(row, "CHARACTER_MAXIMUM_LENGTH");
                column.NumPrecision      = FieldUtils.AsByte(row, "NUMERIC_PRECISION");
                column.NumPrecisionRadix = FieldUtils.AsInt16(row, "NUMERIC_PRECISION_RADIX");
                column.GenType           = GetGenerateType(column.DataTypeName);
                var setting = default(GenSetting);
                switch (column.GenType)
                {
                case GenerateDataType.String:
                    setting = new GenStringSetting();
                    break;

                case GenerateDataType.DateTime:
                    setting = new GenDateTimeSetting();
                    break;

                case GenerateDataType.Time:
                    setting = new GenDateTimeSetting();
                    break;

                case GenerateDataType.Int:
                    setting = new GenNumSetting();
                    break;

                case GenerateDataType.Long:
                    setting = new GenNumSetting();
                    break;

                case GenerateDataType.Bit:
                    setting = new GenBitSetting();
                    break;

                case GenerateDataType.Uid:
                    setting = new GenSetting();
                    break;

                default:
                    setting = new GenSetting();
                    break;
                }
                column.Setting = setting;
                if (column.ColType.GetType() == typeof(NormalColumn))
                {
                    column.CanNull = FieldUtils.AsBool(row, "IS_NULLABLE");
                }
                else
                {
                    var refCol = column as ReferenceColumn;
                    if (null != refCol)
                    {
                        refCol.CnstName      = FieldUtils.AsText(row, "CNST_NAME");
                        refCol.RefTableName  = FieldUtils.AsText(row, "PARENT");
                        refCol.RefColumnName = FieldUtils.AsText(row, "PARENT_COL");
                    }
                }
                columnList.Add(column);
            }

            LogUtils.Logs.Log("End reading schema column, table:{0}, {1} columns", tableName, columnList.Count);
            return(columnList);
        }