コード例 #1
0
 //解析文件结构
 private void ParseLayout()
 {
     mFields.Clear();
     mUsedCustoms.Clear();
     for (int i = 0; i < mMaxColumn; ++i)
     {
         PackageField field = new PackageField();
         field.Index   = i;
         field.Comment = mDataTable[0][i];            //第0行是注释
         field.Name    = mDataTable[1][i];            //第1行是字段名
         field.Default = mDataTable[3][i];            //第3行是字段默认值
         var            attribute = mDataTable[2][i]; //第2行是字段属性
         Scorpio.Script script    = new Scorpio.Script();
         script.LoadLibrary();
         if (string.IsNullOrEmpty(attribute))
         {
             field.Attribute = script.CreateTable();
         }
         else
         {
             field.Attribute = (script.LoadString("return {" + attribute + "}") as ScriptTable) ?? script.CreateTable();
         }
         string columnType = mDataTable[4][i];   //第4行是字段类型
         string fieldType  = "";
         if (columnType.StartsWith(Util.ArrayString))
         {
             field.Array = true;
             int iFinalIndex = Util.ArrayString.Length;
             fieldType = columnType.Substring(iFinalIndex, columnType.Length - iFinalIndex);
         }
         else
         {
             field.Array = false;
             fieldType   = columnType;
         }
         field.Type = fieldType;
         bool basic = BasicUtil.HasType(fieldType);
         if (!basic && !mCustoms.ContainsKey(fieldType) && !mEnums.ContainsKey(fieldType))
         {
             throw new System.Exception(string.Format("第[{0}]列的 字段类型[{1}] 不能识别", Util.GetLineName(i), columnType));
         }
         if (i == 0 && (field.Array == true || field.Info.BasicIndex != BasicEnum.INT32))
         {
             throw new System.Exception("第一列的数据类型必须为int32类型");
         }
         field.Enum = mEnums.ContainsKey(fieldType);
         //保存使用的自定义结构
         if (!basic && !field.Enum && !mUsedCustoms.Contains(fieldType))
         {
             mUsedCustoms.Add(fieldType);
         }
         mFields.Add(field);
     }
     if (mFields.Count == 0)
     {
         throw new System.Exception("字段个数为0");
     }
     mKeyName = mFields[0].Name;
 }
コード例 #2
0
    private void WriteField(TableWriter writer, object value, PackageField field)
    {
        var basic = BasicUtil.GetType(field.Type);

        if (basic != null)
        {
            if (field.Array)
            {
                var list = value as ScriptArray;
                if (Util.IsEmptyValue(list))
                {
                    writer.WriteInt32(0);
                }
                else
                {
                    int count = list.Count();
                    writer.WriteInt32(count);
                    for (int i = 0; i < count; ++i)
                    {
                        basic.WriteValue(writer, list.GetValue(i).ToString());
                    }
                }
            }
            else
            {
                basic.WriteValue(writer, value.ToString());
            }
        }
        else if (field.Enum)
        {
            if (field.Array)
            {
                var list = value as ScriptArray;
                if (Util.IsEmptyValue(list))
                {
                    writer.WriteInt32(0);
                }
                else
                {
                    int count = list.Count();
                    writer.WriteInt32(count);
                    for (int i = 0; i < count; ++i)
                    {
                        writer.WriteInt32(GetEnumValue(field.Type, value.ToString()));
                    }
                }
            }
            else
            {
                writer.WriteInt32(GetEnumValue(field.Type, value.ToString()));
            }
        }
        else
        {
            WriteCustom(writer, value as ScriptArray, mCustoms[field.Type], field.Array);
        }
    }
コード例 #3
0
    private string ReadValue(TableReader reader, PackageField field, int oldLevel)
    {
        int level = oldLevel;

        if (field.Array)
        {
            --level;
        }
        if (field.Info != null)
        {
            if (field.Array)
            {
                int           number  = reader.ReadInt32();
                StringBuilder builder = new StringBuilder();
                if (level <= 0)
                {
                    builder.Append("[");
                }
                for (int i = 0; i < number; ++i)
                {
                    if (i != 0)
                    {
                        builder.Append(",");
                    }
                    builder.Append(field.Info.ReadValue(reader).ToString());
                }
                if (level <= 0)
                {
                    builder.Append("]");
                }
                return(builder.ToString());
            }
            else
            {
                return(field.Info.ReadValue(reader).ToString());
            }
        }
        else
        {
            if (field.Array)
            {
                int           number  = reader.ReadInt32();
                StringBuilder builder = new StringBuilder();
                if (level <= 0)
                {
                    builder.Append("[");
                }
                for (int i = 0; i < number; ++i)
                {
                    if (i != 0)
                    {
                        builder.Append(",");
                    }
                    builder.Append(ReadFieldsInterior(reader, mCustoms[field.Type], level - 1));
                }
                if (level <= 0)
                {
                    builder.Append("]");
                }
                return(builder.ToString());
            }
            else
            {
                return(ReadFieldsInterior(reader, mCustoms[field.Type], level - 1));
            }
        }
    }
コード例 #4
0
    private void Rollback_impl(TableReader reader, string fileName)
    {
        string    fileTitle = fileName.Substring(0, fileName.LastIndexOf("."));
        string    filePath  = Path.GetDirectoryName(fileName);
        IWorkbook workbook  = new HSSFWorkbook();
        ISheet    sheet     = workbook.CreateSheet("Sheet1");
        int       iRows     = reader.ReadInt32();        //行数量

        reader.ReadString();                             //读取MD5
        mCustoms.Clear();
        List <PackageField> Fields = GetFields(reader);  //读取表结构
        int customNumber           = reader.ReadInt32(); //自定义类数量

        for (int i = 0; i < customNumber; ++i)
        {
            List <PackageField> fields = new List <PackageField>();
            string str = reader.ReadString();   //读取自定义类名字
            mCustoms[str] = GetFields(reader);  //读取自定义类结构
        }
        {
            IRow row0 = sheet.CreateRow(0);
            IRow row1 = sheet.CreateRow(1);
            IRow row2 = sheet.CreateRow(2);
            IRow row3 = sheet.CreateRow(3);
            for (int i = 0; i < Fields.Count; ++i)
            {
                PackageField field = Fields[i];
                string       str   = field.Array ? "array" + field.Type : field.Type;
                row0.CreateCell(i).SetCellValue("注释(请自行粘贴)");
                row1.CreateCell(i).SetCellValue("字段名(请自行粘贴)");
                row2.CreateCell(i).SetCellValue("字段默认值(请自行粘贴)");
                row3.CreateCell(i).SetCellValue(str);
            }
        }
        foreach (var pair in mCustoms)
        {
            StringBuilder builder = new StringBuilder();
            builder.Append(@"__Class = {");
            foreach (var field in pair.Value)
            {
                string str = @"
    __Field = ""__Index,__Type,__Array"",";
                str = str.Replace("__Field", field.Name);
                str = str.Replace("__Index", field.Index.ToString());
                str = str.Replace("__Type", field.Type);
                str = str.Replace("__Array", field.Array ? "true" : "false");
                builder.Append(str);
            }
            builder.Append(@"
}");
            builder = builder.Replace("__Class", pair.Key);
            FileUtil.CreateFile(string.Format("{0}/{1}.js", filePath, pair.Key), builder.ToString(), false);
        }
        for (int i = 0; i < iRows; ++i)
        {
            IRow          row  = sheet.CreateRow(i + START_ROW);
            List <string> strs = ReadFields(reader, Fields, 2);
            for (int j = 0; j < strs.Count; ++j)
            {
                row.CreateCell(j).SetCellValue(strs[j]);
            }
        }
        string rollbackFileName = fileTitle + ".xls";

        FileUtil.DeleteFile(rollbackFileName);
        FileStream stream = new FileStream(rollbackFileName, FileMode.Create);

        workbook.Write(stream);
        stream.Close();
    }
コード例 #5
0
ファイル: Util.cs プロジェクト: skyzhp/ScorpioConversion
    public static void ParseStructure(string dir,
                                      Dictionary <string, List <PackageField> > customClass,         //自定义类
                                      Dictionary <string, List <PackageEnum> > customEnum,           //自定义枚举
                                      Dictionary <string, List <PackageField> > customTable,         //excel表自定义类
                                      Dictionary <string, PackageDatabase> customDatabase,           //单个数据库
                                      Dictionary <string, List <PackageField> > customDatabaseClass, //数据库类
                                      Dictionary <string, List <PackageConst> > customConst)         //自定义常量
    {
        if (customClass != null)
        {
            customClass.Clear();
        }
        if (customEnum != null)
        {
            customEnum.Clear();
        }
        if (customTable != null)
        {
            customTable.Clear();
        }
        if (customDatabase != null)
        {
            customDatabase.Clear();
        }
        if (customDatabaseClass != null)
        {
            customDatabaseClass.Clear();
        }
        if (customConst != null)
        {
            customConst.Clear();
        }
        dir    = Path.Combine(WorkspaceDirectory, dir);
        Script = new Script();
        Script.LoadLibrary();
        List <ScriptObject> GlobalBasic = new List <ScriptObject>();

        {
            var itor = Script.GetGlobalTable().GetIterator();
            while (itor.MoveNext())
            {
                GlobalBasic.Add(itor.Current.Value);
            }
        }
        string[] files = System.IO.Directory.Exists(dir) ? System.IO.Directory.GetFiles(dir, "*.sco", SearchOption.AllDirectories) :  new string[0];
        foreach (var file in files)
        {
            Script.LoadFile(file);
        }
        {
            var itor = Script.GetGlobalTable().GetIterator();
            while (itor.MoveNext())
            {
                if (GlobalBasic.Contains(itor.Current.Value))
                {
                    continue;
                }
                string      name  = itor.Current.Key as string;
                ScriptTable table = itor.Current.Value as ScriptTable;
                if (name == null || table == null)
                {
                    continue;
                }
                //枚举类型
                if (name.StartsWith(ENUM_KEYWORD))
                {
                    if (customEnum != null)
                    {
                        List <PackageEnum> enums = new List <PackageEnum>();
                        var tItor = table.GetIterator();
                        while (tItor.MoveNext())
                        {
                            string       fieldName = tItor.Current.Key as string;
                            ScriptNumber val       = tItor.Current.Value as ScriptNumber;
                            if (string.IsNullOrEmpty(fieldName) || val == null)
                            {
                                throw new Exception(string.Format("Enum:{0} Field:{1} 参数出错", name, fieldName));
                            }
                            enums.Add(new PackageEnum()
                            {
                                Index = Convert.ToInt32(val.ObjectValue),
                                Name  = fieldName,
                            });
                        }
                        enums.Sort((m1, m2) => { return(m1.Index.CompareTo(m2.Index)); });
                        customEnum[name.Substring(ENUM_KEYWORD.Length)] = enums;
                    }
                    //常量类型
                }
                else if (name.StartsWith(CONST_KEYWORD))
                {
                    if (customConst != null)
                    {
                        List <PackageConst> consts = new List <PackageConst>();
                        var tItor = table.GetIterator();
                        while (tItor.MoveNext())
                        {
                            string fieldName = tItor.Current.Key as string;
                            if (string.IsNullOrEmpty(fieldName))
                            {
                                throw new Exception(string.Format("Const:{0} Field:{1} 参数出错", name, fieldName));
                            }
                            PackageConst pack = new PackageConst();
                            pack.Name = fieldName;
                            ScriptObject value = tItor.Current.Value;
                            if (value is ScriptNumberDouble)
                            {
                                pack.Type  = BasicEnum.INT32;
                                pack.Value = ((ScriptNumberDouble)value).ToInt32().ToString();
                            }
                            else if (value is ScriptNumberLong)
                            {
                                pack.Type  = BasicEnum.INT64;
                                pack.Value = ((ScriptNumberLong)value).ToLong().ToString() + "L";
                            }
                            else if (value is ScriptString)
                            {
                                pack.Type  = BasicEnum.STRING;
                                pack.Value = "\"" + value.ToString() + "\"";
                            }
                            else
                            {
                                throw new Exception("不支持此常量类型 " + value.Type);
                            }
                            consts.Add(pack);
                        }
                        customConst[name.Substring(CONST_KEYWORD.Length)] = consts;
                    }
                    //数据库类
                }
                else if (name.StartsWith(DATABASE_KEYWORD))
                {
                    if (customDatabase != null)
                    {
                        PackageDatabase package = new PackageDatabase();
                        var             tables  = table.GetValue("tables") as ScriptTable;
                        if (tables != null)
                        {
                            var tItor = tables.GetIterator();
                            while (tItor.MoveNext())
                            {
                                string tableName = tItor.Current.Key as string;
                                if (tableName.StartsWith(DATABASE_KEYWORD))
                                {
                                    continue;
                                }
                                package.tables.Add(tableName, JsonUtil.JsonToObject <DatabaseTable>(tItor.Current.Value.ToJson()));
                            }
                        }
                        customDatabase[name.Substring(DATABASE_KEYWORD.Length)] = package;
                    }
                }
                else
                {
                    List <PackageField> fields = new List <PackageField>();
                    var tItor = table.GetIterator();
                    while (tItor.MoveNext())
                    {
                        string       fieldName = tItor.Current.Key as string;
                        ScriptString val       = tItor.Current.Value as ScriptString;
                        if (string.IsNullOrEmpty(fieldName) || val == null)
                        {
                            throw new Exception(string.Format("Class:{0} Field:{1} 参数出错 参数模版 \"索引,类型,是否数组=false,注释\"", name, fieldName));
                        }
                        string[] infos = val.Value.Split(',');
                        if (infos.Length < 2)
                        {
                            throw new Exception(string.Format("Class:{0} Field:{1} 参数出错 参数模版 \"索引,类型,是否数组=false,注释\"", name, fieldName));
                        }
                        bool   array        = infos.Length > 2 && infos[2] == "true";
                        string note         = infos.Length > 3 ? infos[3] : "";
                        var    packageField = new PackageField()
                        {
                            Index   = int.Parse(infos[0]),
                            Type    = infos[1],
                            Name    = fieldName,
                            Array   = array,
                            Comment = note,
                        };
                        if (!packageField.IsBasic)
                        {
                            if (Script.HasValue(ENUM_KEYWORD + packageField.Type))
                            {
                                packageField.Enum = true;
                            }
                            else if (!Script.HasValue(packageField.Type) &&                                 //判断网络协议自定义类
                                     !Script.HasValue(TABLE_KEYWORD + packageField.Type) &&                 //判断Table内嵌类
                                     !Script.HasValue(DATABASE_CLASS_KEYWORD + packageField.Type)           //判断数据库内嵌类
                                     )
                            {
                                throw new Exception(string.Format("Class:{0} Field:{1} 未知类型:{2}", name, fieldName, packageField.Type));
                            }
                        }
                        fields.Add(packageField);
                    }
                    fields.Sort((m1, m2) => { return(m1.Index.CompareTo(m2.Index)); });
                    if (name.StartsWith(DATABASE_CLASS_KEYWORD))        //数据库内使用类
                    {
                        if (customDatabaseClass != null)
                        {
                            customDatabaseClass[name.Substring(DATABASE_CLASS_KEYWORD.Length)] = fields;
                        }
                    }
                    else if (name.StartsWith(TABLE_KEYWORD))            //excel表使用类
                    {
                        if (customTable != null)
                        {
                            customTable[name.Substring(TABLE_KEYWORD.Length)] = fields;
                        }
                    }
                    else
                    {
                        if (customClass != null)
                        {
                            customClass[name] = fields;
                        }
                    }
                }
            }
        }
    }