public void Append(object[] values) { int offset = 0; byte[] row = new byte[rowSize]; for (int index = 0; index < fields.Count; index++) { string columnName = columnOrders[index]; BinaryField field = fields[columnName]; switch (field.DataType) { case BinaryColumnTypeOption.Long: BitConverter.GetBytes(Convert.ToInt64(values[index])).CopyTo(row, offset); break; case BinaryColumnTypeOption.Double: BitConverter.GetBytes((double)values[index]).CopyTo(row, offset); break; case BinaryColumnTypeOption.Integer: BitConverter.GetBytes((int)values[index]).CopyTo(row, offset); break; case BinaryColumnTypeOption.String: Encoding.ASCII.GetBytes(values[index].ToString().Substring(0, field.Size)).CopyTo(row, offset); break; case BinaryColumnTypeOption.Guid: ((Guid)values[index]).ToByteArray().CopyTo(row, offset); break; } offset += field.Size; } writer.Write(row); }
public void RegisterHeader(CacheHeaderInfo header) { string fileName = FileHelper.CreateCacheFileName(cacheFolder, header.IdentityCode, header.SubSection, header.CacheId, header.CacheType); BinaryField[] fields = new BinaryField[header.Columns.Count]; int index = 0; foreach (CacheColumn column in header.Columns.Values) { BinaryColumnTypeOption binaryColumnType = BinaryColumnTypeOption.String; switch (column.DataType) { case CacheDataTypeOption.Double: binaryColumnType = BinaryColumnTypeOption.Double; break; case CacheDataTypeOption.Long: binaryColumnType = BinaryColumnTypeOption.Long; break; case CacheDataTypeOption.String: binaryColumnType = BinaryColumnTypeOption.String; break; case CacheDataTypeOption.Integer: binaryColumnType = BinaryColumnTypeOption.Integer; break; case CacheDataTypeOption.Guid: binaryColumnType = BinaryColumnTypeOption.Guid; break; } fields[index] = new BinaryField(column.Name, binaryColumnType, column.Size); index++; } if (!binaryFiles.ContainsKey(header.IdentityCode)) { binaryFiles.Add(header.IdentityCode, new FileCacheItem(fileName, header, fields)); } }
public object[] Read() { int offset = 0; byte[] row = reader.ReadBytes(this.rowSize); List<object> values = new List<object>(); if (row.Length > 0) { for (int index = 0; index < fields.Count; index++) { string columnName = columnOrders[index]; BinaryField field = fields[columnName]; switch (field.DataType) { case BinaryColumnTypeOption.Long: values.Add(BitConverter.ToInt64(row, offset)); break; case BinaryColumnTypeOption.Double: values.Add(BitConverter.ToDouble(row, offset)); break; case BinaryColumnTypeOption.Integer: values.Add(BitConverter.ToInt32(row, offset)); break; case BinaryColumnTypeOption.Guid: byte[] guidBytes= new byte[16]; for (int byteIndex = 0; byteIndex < 16; byteIndex++) { guidBytes[byteIndex]= row[offset + byteIndex]; } values.Add(guidBytes); break; case BinaryColumnTypeOption.String: values.Add(BitConverter.ToString(row, offset)); break; } offset += field.Size; } } return values.Count>0? values.ToArray(): null; }