Exemplo n.º 1
0
    public static int WriteLpcValue(MemoryStream stream, LPCValue v)
    {
        int len = LPCValue.SaveToBuffer(mSerBuffer, 0, v);

        stream.Write(mSerBuffer, 0, len);
        return(len);
    }
Exemplo n.º 2
0
    // 序列化这行数据
    bool Deserialize()
    {
        if (mRowData == null)
        {
            return(true);
        }

        try
        {
            // 反序列化
            int offset = 0;
            for (var idx = 0; idx < mOwner.columns.Count; idx++)
            {
                LPCValue v;
                offset += LPCValue.RestoreFromBuffer(mRowData, offset, out v);
                Add(idx, v);
            }
            return(true);
        }
        catch (Exception e)
        {
            NIDebug.Log(e.Message);
            return(false);
        }
        finally
        {
            mRowData = null;
        }
    }
Exemplo n.º 3
0
    /// <summary>
    /// 两个mapping相加(不改变原来的值)
    /// </summary>
    public static LPCValue MappingAdd(LPCMapping m1, LPCMapping m2)
    {
        LPCValue v = LPCValue.CreateMapping();

        foreach (object k in m1.Keys)
        {
            if (k is string)
            {
                v.AsMapping [k as string] = m1 [k as string];
            }
            else
            {
                v.AsMapping [(int)k] = m1 [(int)k];
            }
        }
        foreach (object k in m2.Keys)
        {
            if (k is string)
            {
                v.AsMapping [k as string] = m2 [k as string];
            }
            else
            {
                v.AsMapping [(int)k] = m2 [(int)k];
            }
        }
        return(v);
    }
Exemplo n.º 4
0
    public static LPCValue ReadLpcValue(MemoryStream stream)
    {
        LPCValue v;

        byte[] buf = stream.GetBuffer();
        int    cnt = LPCValue.RestoreFromBuffer(buf, (int)stream.Position, out v);

        stream.Seek(cnt, SeekOrigin.Current);
        return(v);
    }
Exemplo n.º 5
0
    // 转换成lpcvalue
    public LPCValue ConvertLpc()
    {
        LPCMapping lpcMap = LPCMapping.Empty;

        foreach (KeyValuePair <string, int> c in mOwner.columns)
        {
            lpcMap.Add(c.Key, properties[c.Value]);
        }

        return(LPCValue.Create(lpcMap));
    }
Exemplo n.º 6
0
    private static LPCValue ParseIntType(string text)
    {
        int i;

        if (!int.TryParse(text, out i))
        {
            //LogMgr.Error("无法将 " + text + " 转换为int");
            i = 0;
        }
        return(LPCValue.Create(i));
    }
Exemplo n.º 7
0
    /// <summary>
    /// 取得一列的所有行的值, checkValid是否检查列上带*号是有效列
    /// </summary>
    public static LPCValue ImportToSingleColumn(string file, string field, bool checkValid)
    {
        LPCValue result = LPCValue.CreateArray();
        LPCValue arr    = ImportToArray(file, checkValid);

        foreach (LPCValue v in arr.AsArray.Values)
        {
            result.AsArray.Add(v.AsMapping [field]);
        }
        return(result);
    }
Exemplo n.º 8
0
    private static LPCValue ParseAutoType(string text)
    {
        if (text.Length < 1)
        {
            return(LPCValue.Create(text));
        }

        char first_char = text [0];

        if (first_char == '@')
        {
            // alias
            string alias = text.Substring(1);
            if (!AliasMgr.ContainsAlias(alias))
            {
                //LogMgr.Error("字段没有配置别名 " + alias);
                return(LPCValue.Create(text));
            }
            object v = AliasMgr.Get(alias);
            if (v is string)
            {
                return(LPCValue.Create((string)v));
            }
            if (v is int)
            {
                return(LPCValue.Create((int)v));
            }
            throw new Exception(string.Format("Unexpected alias name: {0}", alias));
        }

        if ((first_char == '"') || (first_char == ':'))
        {
            // string or buffer
            return(LPCRestoreString.RestoreFromString(text));
        }

        if ((first_char == '(') && (text.Length > 1))
        {
            char second_char = text [1];
            if ((second_char == '{') || (second_char == '['))
            {
                // mapping or array
                return(LPCRestoreString.RestoreFromString(text));
            }
        }
        if (((first_char >= '0') && (first_char <= '9')) || (first_char == '.') || (first_char == '-'))
        {
            // number
            return(LPCRestoreString.RestoreFromString(text));
        }

        return(LPCValue.Create(text));
    }
Exemplo n.º 9
0
    private static LPCValue ParseArrayType(string text)
    {
        LPCValue arr = LPCValue.CreateArray();

        if (text == "0")
        {
            return(arr);
        }

        arr = LPCRestoreString.RestoreFromString(text);
        return(arr);
    }
Exemplo n.º 10
0
    private static LPCValue ParseMappingType(string text)
    {
        LPCValue m = LPCValue.CreateMapping();

        if (text == "0")
        {
            return(m);
        }

        m = LPCRestoreString.RestoreFromString(text);
        return(m);
    }
Exemplo n.º 11
0
    // 设置数据
    public void Add(string columnName, LPCValue v)
    {
        int index = 0;

        if (!mOwner.columns.TryGetValue(columnName, out index))
        {
            return;
        }

        // 重置属性
        mProperties[index] = v;
    }
Exemplo n.º 12
0
    // 根据列名获取数据
    public T Query <T>(string columnName, T def = default(T))
    {
        // 不是获取主key值,且还没有序列化完成,立刻序列化
        if (columnName != mOwner.primaryKey && mRowData != null && !Deserialize())
        {
            NIDebug.Log("csv序列化失败({0})", mOwner.Name);
            return(def);
        }

        int index;

        if (mOwner.columns.TryGetValue(columnName, out index))
        {
            LPCValue prop = mProperties[index];

            // 如果是LPCValue类型
            if (typeof(T) == typeof(LPCValue))
            {
                return((T)(object)prop);
            }

            // 不是string数据,直接转换
            if (!prop.IsString)
            {
                return(prop.As <T>());
            }

            // 就是要string,直接返回
            if (typeof(T) == typeof(string))
            {
                return(prop.As <T>());
            }

            // 如果外部不是想要string,但是却得到了一个空string
            // 则表示csv表格上填写的是空值,此时返回默认值
            if (prop.AsString == string.Empty)
            {
                return(def);
            }

            // 外部不是想要string,却得到了有字符的string
            // 走到这儿的时候已经出错了,直接使用As借口中的异常处理即可
            return(prop.As <T>());
        }
        else
        {
            NIDebug.Log("{0}.csv 没有列 {1}。", mOwner.Name, columnName);
        }

        // 返回默认值
        return(def);
    }
Exemplo n.º 13
0
    // 增加一列
    public void AddRow(int i, CsvRow row)
    {
        mRows[i] = row;
        LPCValue pk = row.Query <LPCValue>(mPrimaryKey);

        if (pk != null)
        {
            bool   hasRow = false;
            CsvRow nrow;
            if (pk.IsInt)
            {
                hasRow = mIntRowIndexs.TryGetValue(pk.AsInt, out nrow);
                if (!hasRow)
                {
                    mIntRowIndexs.Add(pk.AsInt, row);
                }
            }
            else if (pk.IsString)
            {
                hasRow = mStrRowIndexs.TryGetValue(pk.AsString, out nrow);
                if (!hasRow)
                {
                    mStrRowIndexs.Add(pk.AsString, row);
                }
            }
            else
            {
                NIDebug.Log("无法添加 {0} 为主key, 主key只能是int或string!", pk.GetDescription());
                return;
            }

            if (hasRow)
            {
                // 主key对应的值已经存在,挂接到链表尾
                while (nrow.next != null)
                {
                    nrow = nrow.next;
                }
                nrow.next = row;
                row.next  = null;
            }
        }
        else
        {
            NIDebug.Log("主key {0} 没有值!", mPrimaryKey);
        }
    }
Exemplo n.º 14
0
    /// <summary>
    /// 转换为mapping数据,key指定为某一列的值, checkValid是否检查列上带*号是有效列
    /// </summary>
    public static LPCValue ImportToIndexMapping(string file, string key, bool checkValid)
    {
        LPCValue m   = LPCValue.CreateMapping();
        LPCValue arr = ImportToArray(file, checkValid);

        foreach (LPCValue v in arr.AsArray.Values)
        {
            LPCValue k = v.AsMapping [key];
            if (k.IsInt)
            {
                m.AsMapping.Add(k.AsInt, v);
            }
            else if (k.IsString)
            {
                m.AsMapping.Add(k.AsString, v);
            }
        }
        return(m);
    }
Exemplo n.º 15
0
    public static LPCValue Read(CsvParser cp)
    {
        List <CsvField> fields = cp.Fields;
        List <Dictionary <string, string> > records = cp.Records;

        LPCValue list = LPCValue.CreateArray();

        foreach (Dictionary <string, string> record in records)
        {
            LPCValue m = LPCValue.CreateMapping();
            foreach (CsvField field in fields)
            {
                LPCValue v = Parse(field.type, record [field.name]);
                m.AsMapping.Add(field.name, v);
            }
            list.AsArray.Add(m);
        }

        return(list);
    }
Exemplo n.º 16
0
    /// <summary>
    /// 取得简单的数值对
    /// </summary>
    public static LPCValue ImportToSingleMapping(string file, string kField, string vField, bool checkValid)
    {
        LPCValue result = LPCValue.CreateMapping();
        LPCValue arr    = ImportToArray(file, checkValid);

        foreach (LPCValue v in arr.AsArray.Values)
        {
            LPCValue kv = v.AsMapping [kField];
            LPCValue vv = v.AsMapping [vField];

            if (kv.IsInt)
            {
                result.AsMapping.Add(kv.AsInt, vv);
            }
            else if (kv.IsString)
            {
                result.AsMapping.Add(kv.AsString, vv);
            }
        }
        return(result);
    }
Exemplo n.º 17
0
 private static LPCValue ParseStringType(string text)
 {
     return(LPCValue.Create(text));
 }
Exemplo n.º 18
0
    /// <summary>
    /// 序列化csv文件操作.
    /// </summary>
    public static void Save(string filePath, bool checkValid, string dir)
    {
        CsvFile csv = new CsvFile(System.IO.Path.GetFileNameWithoutExtension(filePath));

        string[] lines = FileMgr.ReadLines(filePath);
        if (lines.Length == 0)
        {
            NIDebug.Log("空文件 {0}", lines);
            return;
        }

        // 解析csv文件
        CsvParser cp = new CsvParser();
        LPCValue  m;

        try
        {
            cp.Load(filePath, checkValid);
            if (cp.Fields.Count == 0 || cp.Records.Count == 0)
            {
                return;
            }
            m = ImportMgr.Read(cp);
        }
        catch (Exception e)
        {
            NIDebug.Log("读取csv错误 {0}\n{1}", filePath, e.ToString());
            return;
        }

        // 主key
        csv.primaryKey = cp.PrimaryKey;

        // 列名字对应的索引
        for (int i = 0; i < cp.Fields.Count; i++)
        {
            csv.columns.Add(cp.Fields[i].name, i);
        }

        // 每列值
        csv.rows = new CsvRow[m.AsArray.Count];
        for (int i = 0; i < m.AsArray.Count; i++)
        {
            LPCValue v   = m.AsArray[i];
            CsvRow   row = new CsvRow(csv);
            for (int idx = 0; idx < cp.Fields.Count; idx++)
            {
                row.Add(idx, v.AsMapping[cp.Fields[idx].name]);
            }

            csv.AddRow(i, row);
        }

        // 序列化
        MemoryStream ms = new MemoryStream();

        CsvFileMgr.Serialize(ms, csv);

        // 写入数据
        string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);

        // 确保路径存在
        Directory.CreateDirectory(dir);

        FileStream fs = new FileStream(dir + "/" + fileName + CSV_EXT, FileMode.Create, FileAccess.Write);

        fs.Write(ms.GetBuffer(), 0, (int)ms.Length);
        fs.Close();
    }
Exemplo n.º 19
0
    /// <summary>
    /// 序列化
    /// </summary>
    public static void Serialize(MemoryStream stream, CsvFile csv)
    {
        // 初始化缓存
        if (mSerBuffer == null)
        {
            mSerBuffer = new byte[1024 * 1024];
        }

        FileMgr.WriteInt(stream, CsvFileMgr.Version);

        FileMgr.WriteString(stream, csv.Name);

        FileMgr.WriteString(stream, csv.primaryKey);

        // 写入主key类型
        LPC.LPCValue.ValueType pkeyType = LPCValue.ValueType.INT;
        if (csv.rows.Length > 0)
        {
            var row  = csv.rows[0];
            var pkey = row.Query <LPCValue>(csv.primaryKey);
            pkeyType = pkey.type;
            FileMgr.WriteInt(stream, (int)pkeyType);
        }

        // 列名
        FileMgr.WriteInt(stream, csv.columns.Count);
        foreach (var kv in csv.columns)
        {
            FileMgr.WriteString(stream, kv.Key);
            FileMgr.WriteInt(stream, kv.Value);
        }

        // 行数
        FileMgr.WriteInt(stream, csv.rows.Length);

        // 写入每行的主key
        for (int i = 0; i < csv.rows.Length; i++)
        {
            var row = csv.rows[i];
            if (pkeyType == LPCValue.ValueType.INT)
            {
                var pkey = row.Query <int>(csv.primaryKey);
                FileMgr.WriteInt(stream, pkey);
            }
            else
            {
                var pkey = row.Query <string>(csv.primaryKey);
                FileMgr.WriteString(stream, pkey);
            }
        }

        // 写入行长度和内容
        for (int i = 0; i < csv.rows.Length; i++)
        {
            var row = csv.rows[i];
            int len = 0;

            for (var idx = 0; idx < csv.columns.Count; idx++)
            {
                len += LPCValue.SaveToBuffer(mSerBuffer, len, row.properties[idx]);
            }

            FileMgr.WriteInt(stream, len);
            stream.Write(mSerBuffer, 0, len);
        }

        // 释放
        mSerBuffer = null;
    }
Exemplo n.º 20
0
 // 设置数据
 public void Add(int i, LPCValue v)
 {
     mProperties[i] = v;
 }
Exemplo n.º 21
0
    /// <summary>
    /// 反序列化.
    /// </summary>
    public static CsvFile Deserialize(MemoryStream stream)
    {
        int ver = FileMgr.ReadInt(stream);

        if (ver != CsvFileMgr.Version)
        {
            NIDebug.Log("Csv版本 {0} 错误, 最新版本 {1}", ver, CsvFileMgr.Version);
            return(null);
        }

        // 文件名
        string name = FileMgr.ReadString(stream);

        CsvFile csv = new CsvFile(name);

        csv.primaryKey = FileMgr.ReadString(stream);

        // 主key类型
        var pkeyType = (LPC.LPCValue.ValueType)FileMgr.ReadInt(stream);

        // 列名
        int n = FileMgr.ReadInt(stream);

        csv.columns = new Dictionary <string, int>(n);
        for (int i = 0; i < n; i++)
        {
            string k = FileMgr.ReadString(stream);
            int    v = FileMgr.ReadInt(stream);
            csv.columns.Add(k, v);
        }

        // 行数
        n        = FileMgr.ReadInt(stream);
        csv.rows = new CsvRow[n];

        // 主key的列
        int pkeyIdx = csv.columns[csv.primaryKey];

        // 每行主key
        for (var i = 0; i < n; i++)
        {
            var row = new CsvRow(csv);
            if (pkeyType == LPCValue.ValueType.INT)
            {
                int pkey = FileMgr.ReadInt(stream);
                row.Add(pkeyIdx, LPCValue.Create(pkey));
            }
            else
            {
                string pkey = FileMgr.ReadString(stream);
                row.Add(pkeyIdx, LPCValue.Create(pkey));
            }
            csv.AddRow(i, row);
        }

        // 行数据
        for (int i = 0; i < n; i++)
        {
            int len = FileMgr.ReadInt(stream);
            csv.rows[i].rowData = new byte[len];
            stream.Read(csv.rows[i].rowData, 0, len);
        }

        return(csv);
    }