Exemple #1
0
        /// <summary>
        /// Commit changes maded in headers data
        /// </summary>
        /// <returns></returns>
        public DataPackage UpdateHeaders()
        {
            _bw.Position = header_pos;
            int limit = header_pos + _headerSpaceSize;

            BinaryDataBuffer b  = new BinaryDataBuffer(_headerSpaceSize);
            BinaryDataWriter bw = new BinaryDataWriter(b);

            bw.Write(_headers);
            if (bw.Length <= _headerSpaceSize)
            {
                _bw.WriteBlock(b, b.Length);
            }
            else if (_dataPos >= _b.Length)
            {
                // No data rewrite package header only
                WritePackageHeader(b, b.Length);
            }
            else
            {
                // rewrite package header and shift data
                byte[] data = _b.Slice(_dataPos, _b.Length - _dataPos).GetBytes();
                WritePackageHeader(b, b.Length);
                _bw.WriteBlock(data);
            }
            return(this);
        }
Exemple #2
0
        /// <summary>
        /// Create a new instance of <see cref="DataPackage"/> from <see cref="IDataReader"/>
        /// </summary>
        /// <param name="dr"><see cref="IDataReader"/></param>
        /// <param name="headerSpaceSize">Header size (default 512 bytes)</param>
        /// <param name="allowDublicate"><see cref="bool"/></param>
        /// <returns></returns>
        public DataPackage(IDataReader dr, int headerSpaceSize, bool allowDublicate) : base(null)
        {
            _headerSpaceSize = headerSpaceSize <= 0 ? header_space_size_default : headerSpaceSize;
            _b       = new BinaryDataBuffer(_headerSpaceSize * 2);
            _bw      = new BinaryDataWriter(_b);
            _br      = new BinaryDataReader(_b);
            _headers = new MapTable <string, object>(StringComparer.Ordinal);

            using (DataTable dt = dr.GetSchemaTable())
            {
                _colCount = dr.FieldCount;
                _indexes  = new string[_colCount];
                _colInfo  = new ColumnInfo[_colCount];

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow drCol = dt.Rows[i];
                    string  name  = (string)drCol["ColumnName"];

                    if (allowDublicate)
                    {
                        string nameOrig = name;
                        for (int j = 1; _indexes.Contains(name, StringComparer.OrdinalIgnoreCase); j++)
                        {
                            name = nameOrig + j.ToString();
                        }
                    }
                    //else if (_indexes.Contains(name, StringComparer.OrdinalIgnoreCase))
                    //	continue;

                    ColumnInfo ci = new ColumnInfo()
                    {
                        DataType    = (Type)drCol["DataType"],
                        ColumnSize  = (int)drCol["ColumnSize"],
                        AllowDBNull = (bool)drCol["AllowDBNull"]
                    };
                    _indexes[i] = name;
                    _colInfo[i] = ci;
                }

                WritePackageHeader();

                //write data
                for (; dr.Read();)
                {
                    object[] values = new object[_colCount];
                    dr.GetValues(values);
                    //_bw.Write(values);
                    AddNew();
                    SetValues(values);
                    Update();
                }
                GoDataTop();
            }
        }
Exemple #3
0
 public BinaryDataBuffer GetBinaryDataBufferFromBase64BinaryDataBuffer(BinaryDataBuffer buffer)
 {
     try
     {
         var enc = new UTF8Encoding(false, true);
         var str = enc.GetString(buffer.Bytes, 0, buffer.Bytes.Length);
         return(new BinaryDataBuffer(Convert.FromBase64String(str)));
     }
     catch
     {
         return(new BinaryDataBuffer(new byte[0]));
     }
 }
Exemple #4
0
        /// <summary>
        /// Create a new instance of <see cref="DataPackage"/> with headerSpaceSize from list of columns definitions and list of values
        /// </summary>
        /// <param name="headerSpaceSize">Header size (default 512 bytes)</param>
        /// <param name="columns">list of columns definitions strings  in format ColimnName[.ColumnType][.ColumnWidth]</param>
        /// <param name="values">list of values</param>
        public DataPackage(int headerSpaceSize, string[] columns, object[] values) : base(null)
        {
            _headerSpaceSize = headerSpaceSize <= 0 ? header_space_size_default : headerSpaceSize;
            _b  = new BinaryDataBuffer(_headerSpaceSize * 2);
            _bw = new BinaryDataWriter(_b);
            _br = new BinaryDataReader(_b);

            _colCount = columns.Length;
            bool hasValues = values != null && values.Length == _colCount;

            _headers = new MapTable <string, object>(StringComparer.Ordinal);

            //Create col info
            _indexes = new string[_colCount];
            _colInfo = new ColumnInfo[_colCount];
            for (int i = 0; i < _colCount; i++)
            {
                ColumnInfo info;
                string     name;
                if (columns[i].IndexOf('.') > 0)
                {
                    info = ColumnInfo.FromName(columns[i]);
                    name = columns[i].GetToken(0, ".");
                }
                else if (hasValues)
                {
                    name = columns[i];
                    info = ColumnInfo.FromValue(values[i]);
                }
                else
                {
                    name = columns[i];
                    info = ColumnInfo.FromType(typeof(string));
                }
                _indexes[i] = name;
                _colInfo[i] = info;
            }

            WritePackageHeader();

            if (hasValues)
            {
                AddNew();
                SetValues(values);
                Update();
            }
            else if (values != null)
            {
                throw new ArgumentException("The length of the data array must be equal to the length of the array of field names");
            }
        }
Exemple #5
0
 public void BufferPerformanceTest()
 {
     using (FileLog _logger = new FileLog("MetaStackBuffers.PerformanceTest", new FileLogSettings()
     {
         DateFolderMask = "yyyy-MM-dd"
     }))
         using (_b = new BinaryDataBuffer(1024))
         {
             _w = new BinaryDataWriter(_b);
             _r = new BinaryDataReader(_b);
             WriterPerformanceTest(_logger);
             ReaderPerformanceTest(_logger);
         }
 }
Exemple #6
0
        /// <summary>
        /// Create a new instance of <see cref="DataPackage"/> from <see cref="byte"/> array
        /// using when deserialise <see cref="DataPackage"/> from array created with <see cref="DataPackage.ToArray()"/> methos
        /// </summary>
        /// <param name="data"><see cref="byte"/> array created with <see cref="DataPackage.ToArray()"/> methos</param>
        public DataPackage(byte[] source) : base(null)
        {
            _b  = (BinaryDataBuffer)source;
            _br = new BinaryDataReader(_b);
            _bw = new BinaryDataWriter(_b);

            //Read sizes
            _headerSpaceSize = _br.Read <int>();
            if (_headerSpaceSize < 0)
            {
                throw new DataPackageMessageFormatException("Invalid header size");
            }

            _colCount = _br.Read <int>();
            if (_colCount <= 0 || _colCount > 64192)
            {
                throw new DataPackageMessageFormatException("Invalid columns count, must be more thrn 0 and less then 64192");
            }

            //Read headers
            _headers = new MapTable <string, object>(StringComparer.Ordinal);
            _br.ReadNext();             //Must be Object
            _br.ReadRaw(_headers);
            _br.Position = _headerSpaceSize + header_pos;

            //Read columns
            _indexes = new string[_colCount];
            _colInfo = new ColumnInfo[_colCount];
            for (int i = 0; i < _colCount; i++)
            {
                _br.ReadNext();
                string name = _br.ReadString();
                if (string.IsNullOrEmpty(name))
                {
                    throw new DataPackageMessageFormatException($"Invalid column name for column index {i}");
                }

                _indexes[i] = name;
                _colInfo[i] = ReadColumnInfo(_br);
            }
            _dataPos = _br.Position;
        }
 public BinaryDataContext GetBinaryDataFromBinaryDataBuffer(BinaryDataBuffer buffer)
 {
     return(new BinaryDataContext(buffer.Bytes));
 }
 public string GetHexStringFromBinaryDataBuffer(BinaryDataBuffer buffer)
 {
     return(BitConverter.ToString(buffer.Bytes).Replace("-", ""));
 }
 public long Read(BinaryDataBuffer buffer, int positionInBuffer, int number)
 {
     return(_underlyingStream.Read(buffer.Bytes, positionInBuffer, number));
 }
 public void Write(BinaryDataBuffer buffer, int positionInBuffer, int number)
 {
     buffer.ThrowIfReadonly();
     _underlyingStream.Write(buffer.Bytes, positionInBuffer, number);
 }
Exemple #11
0
        public BinaryDataBuffer GetHexBinaryDataBufferFromBinaryDataBuffer(BinaryDataBuffer buffer)
        {
            var str = GetHexStringFromBinaryDataBuffer(buffer);

            return(GetBinaryDataBufferFromString(str));
        }
Exemple #12
0
 public BinaryDataBuffer GetBinaryDataBufferFromHexBinaryDataBuffer(BinaryDataBuffer buffer)
 {
     return(new BinaryDataBuffer(HexArrayToByteArray(buffer.Bytes)));
 }
Exemple #13
0
        public BinaryDataBuffer GetBase64BinaryDataBufferFromBinaryDataBuffer(BinaryDataBuffer buffer)
        {
            var base64str = Convert.ToBase64String(buffer.Bytes, Base64FormattingOptions.InsertLineBreaks);

            return(new BinaryDataBuffer(Encoding.ASCII.GetBytes(base64str)));
        }
Exemple #14
0
 public string GetBase64StringFromBinaryDataBuffer(BinaryDataBuffer buffer)
 {
     return(Convert.ToBase64String(buffer.Bytes, Base64FormattingOptions.InsertLineBreaks));
 }
Exemple #15
0
        public string GetStringFromBinaryDataBuffer(BinaryDataBuffer buffer, IValue encoding = null)
        {
            var enc = (encoding != null) ? TextEncodingEnum.GetEncoding(encoding) : Encoding.UTF8;

            return(enc.GetString(buffer.Bytes));
        }
Exemple #16
0
        /// <summary>
        /// Create <see cref="DataPackage"/> from full json format
        /// </summary>
        /// <param name="source">json string whit Headers, Columns and Data rows </param>
        /// <param name="jsonFormat"><see cref="TsJsonFormat"/></param>
        /// <param name="headerSpaceSize">For no headers package set headerSpaceSize = 8</param>
        internal DataPackage(JsonValue source, TsJsonFormat jsonFormat = TsJsonFormat.Full, int headerSpaceSize = 0) : base(source)
        {
            if (jsonFormat != TsJsonFormat.Simple)
            {
                var j = source as JsonObject;
                if (headerSpaceSize == 0)
                {
                    headerSpaceSize = (int)j.GetIntOrDefault("HeaderSize", header_space_size_default);
                }
                JsonArray columns = j.GetArray("Columns");
                JsonArray rows    = j.GetArray("Rows");

                _b  = new BinaryDataBuffer(headerSpaceSize * 2);
                _bw = new BinaryDataWriter(_b);
                _br = new BinaryDataReader(_b);

                _colCount = columns.Count;
                bool hasValues = rows != null;

                //headers
                _headerSpaceSize = headerSpaceSize;
                _headers         = new MapTable <string, object>(StringComparer.Ordinal);
                JsonObject headers = (JsonObject)j["Headers"];
                foreach (var pair in headers)
                {
                    _headers.Add(pair.Key, pair.Value?.GetValue());
                }

                //Create col info
                _indexes = new string[_colCount];
                _colInfo = new ColumnInfo[_colCount];
                for (int i = 0; i < _colCount; i++)
                {
                    var c = columns[i];
                    _indexes[i] = (string)c["Name"];
                    _colInfo[i] = new ColumnInfo()
                    {
                        DataType    = MdbTypeMap.GetType((string)c["Type"], typeof(string)),
                        ColumnSize  = (int)c["Size"],
                        AllowDBNull = (bool)c["AllowNull"]
                    };
                }
                WritePackageHeader();

                //values
                if (hasValues)
                {
                    if (jsonFormat == TsJsonFormat.Full)
                    {
                        foreach (JsonObject r in rows)
                        {
                            AddNew();
                            foreach (var o in r)
                            {
                                SetValue(o.Key, o.Value?.GetValue());
                            }
                            Update();
                        }
                    }
                    else
                    {
                        //!!! Not tested
                        foreach (JsonArray a in rows)
                        {
                            AddNew();
                            foreach (var o in a)
                            {
                                for (int i = 0; i < _colCount; i++)
                                {
                                    SetValue(_indexes[i], o?.GetValue());
                                }
                            }
                            Update();
                        }
                    }
                }
            }
            else             //simple
            {
                if (headerSpaceSize == 0)
                {
                    headerSpaceSize = header_space_size_default;
                }

                _b  = new BinaryDataBuffer(headerSpaceSize * 2);
                _bw = new BinaryDataWriter(_b);
                _br = new BinaryDataReader(_b);

                JsonObject dataRow;
                bool       isArray = false;
                if (source is JsonObject j)
                {
                    dataRow = j;
                }
                else if (source is JsonArray a)
                {
                    if (a.Count == 0)
                    {
                        throw new ArgumentException("Parameter array cannot be empty");
                    }
                    dataRow = (JsonObject)a[0];
                    isArray = true;
                }
                else
                {
                    throw new ArgumentException("The constructor of DataPackage requires JsonObject or JsonArray parameter type.");
                }

                _headerSpaceSize = headerSpaceSize;
                _headers         = new MapTable <string, object>(StringComparer.Ordinal);
                _colCount        = dataRow.Count;
                _indexes         = new string[_colCount];
                _colInfo         = new ColumnInfo[_colCount];

                int i = 0;
                foreach (var kvp in dataRow)
                {
                    _indexes[i] = kvp.Key;
                    _colInfo[i] = ColumnInfo.FromValue(kvp.Value?.GetValue());
                    i++;
                }
                WritePackageHeader();

                if (isArray)
                {
                    foreach (var r in (source as JsonArray))
                    {
                        AddNew();
                        foreach (var o in (JsonObject)r)
                        {
                            SetValue(o.Key, o.Value?.GetValue());
                        }
                        Update();
                    }
                }
                else
                {
                    AddNew();
                    foreach (var o in dataRow)
                    {
                        SetValue(o.Key, o.Value?.GetValue());
                    }
                    Update();
                }
            }
            GoDataTop();
        }