110,538
社区成员
发帖
与我相关
我的任务
分享
//[fastCSharp.setup.cSharp.serialize]
public partial class dataTable
{
private dataArray data;
private string name;
private string[] columnNames;
private byte[] columnIndexs;
private byte[] dbNull;
private int rowCount;
public static dataTable From(DataTable table)
{
if (table == null) return null;
dataTable value = new dataTable();
if ((value.rowCount = table.Rows.Count) != 0)
{
using (dataBuilder builder = new dataBuilder())
{
value.from(table, builder);
value.data = builder.Get();
}
}
return value;
}
internal static dataTable From(DataTable table, dataBuilder builder)
{
dataTable value = new dataTable();
if ((value.rowCount = table.Rows.Count) != 0) value.from(table, builder);
value.name = table.TableName;
return value;
}
private unsafe void from(DataTable table, dataBuilder builder)
{
int index = 0;
columnNames = new string[table.Columns.Count];
fixed (byte* columnFixed = columnIndexs = new byte[columnNames.Length])
{
byte* columnIndex = columnFixed;
foreach (DataColumn column in table.Columns)
{
*columnIndex++ = typeIndexs.Get(column.DataType, 255);
columnNames[index++] = column.ColumnName;
}
fixed (byte* nullFixed = dbNull = new byte[(columnNames.Length * rowCount + 7) >> 3])
{
fixedMap nullMap = new fixedMap(nullFixed);
index = 0;
foreach (DataRow row in table.Rows)
{
columnIndex = columnFixed;
foreach (object value in row.ItemArray)
{
if (value == DBNull.Value) nullMap.Set(index);
else builder.Append(value, *columnIndex);
++index;
++columnIndex;
}
}
}
}
}
public unsafe static DataTable Get(dataTable value)
{
if (value == null) return null;
DataTable table = new DataTable(value.name);
if (value.rowCount != 0)
{
fixed (byte* dataFixed = value.data.Data)
{
objectBuilder builder = new objectBuilder(dataFixed, value.data.Strings);
value.get(table, builder);
}
}
return table;
}
internal DataTable Get(objectBuilder builder)
{
DataTable table = new DataTable(name);
if (rowCount != 0) get(table, builder);
return table;
}
private unsafe void get(DataTable table, objectBuilder builder)
{
int index = 0;
DataColumn[] columns = new DataColumn[columnNames.Length];
fixed (byte* columnFixed = columnIndexs)
{
byte* columnIndex = columnFixed;
foreach (string columnName in columnNames)
{
columns[index++] = new DataColumn(columnName, *columnIndex < types.Length ? types[*columnIndex] : typeof(object));
++columnIndex;
}
table.Columns.AddRange(columns);
fixed (byte* nullFixed = dbNull)
{
fixedMap nullMap = new fixedMap(nullFixed);
for (index = 0; rowCount != 0; --rowCount)
{
object[] values = new object[columnNames.Length];
columnIndex = columnFixed;
for (int valueIndex = 0; valueIndex != columnNames.Length; ++valueIndex)
{
values[valueIndex] = nullMap.Get(index++) ? DBNull.Value : builder.Get(*columnIndex);
++columnIndex;
}
DataRow row = table.NewRow();
row.ItemArray = values;
table.Rows.Add(row);
}
}
}
}
}
private dataArray data;
private string name;
private dataTable[] tables;
private void from(DataSet set)
{
if (set.Tables.Count != 0)
{
using (dataBuilder builder = new dataBuilder())
{
tables = set.Tables.toGeneric<DataTable>().getArray(table => dataTable.From(table, builder));
data = builder.Get();
}
}
name = set.DataSetName;
}
public static dataSet From(DataSet set)
{
if (set == null) return null;
dataSet value = new dataSet();
value.from(set);
return value;
}
private unsafe void set(DataSet set)
{
if (tables.length() != 0)
{
fixed (byte* dataFixed = data.Data)
{
objectBuilder builder = new objectBuilder(dataFixed, data.Strings);
foreach (dataTable table in tables) set.Tables.Add(table.Get(builder));
}
}
}
public unsafe static DataSet Get(dataSet value)
{
if (value == null) return null;
DataSet set = new DataSet(value.name);
value.set(set);
return set;
}
private static readonly Type[] types;
private static readonly staticDictionary<hashCode<Type>, byte> typeIndexs;
static dataSet()
{
int index = 0;
types = new Type[29];
keyValue<hashCode<Type>, byte>[] typeArray = new keyValue<hashCode<Type>, byte>[types.Length];
typeArray[index].Set(types[index] = typeof(int), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(int?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(string), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(DateTime), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(DateTime?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(double), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(double?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(float), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(float?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(decimal), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(decimal?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(Guid), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(Guid?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(bool), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(bool?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(byte), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(byte?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(sbyte), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(sbyte?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(short), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(short?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(ushort), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(ushort?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(uint), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(uint?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(long), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(long?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(ulong), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(ulong?), (byte)index);
typeIndexs = new staticDictionary<hashCode<Type>, byte>(typeArray);
}
}
}
//[fastCSharp.setup.cSharp.serialize]
public partial class dataTable
{
private dataArray data;
private string name;
private string[] columnNames;
private byte[] columnIndexs;
private byte[] dbNull;
private int rowCount;
public static dataTable From(DataTable table)
{
if (table == null) return null;
dataTable value = new dataTable();
if ((value.rowCount = table.Rows.Count) != 0)
{
using (dataBuilder builder = new dataBuilder())
{
value.from(table, builder);
value.data = builder.Get();
}
}
return value;
}
internal static dataTable From(DataTable table, dataBuilder builder)
{
dataTable value = new dataTable();
if ((value.rowCount = table.Rows.Count) != 0) value.from(table, builder);
value.name = table.TableName;
return value;
}
private unsafe void from(DataTable table, dataBuilder builder)
{
int index = 0;
columnNames = new string[table.Columns.Count];
fixed (byte* columnFixed = columnIndexs = new byte[columnNames.Length])
{
byte* columnIndex = columnFixed;
foreach (DataColumn column in table.Columns)
{
*columnIndex++ = typeIndexs.Get(column.DataType, 255);
columnNames[index++] = column.ColumnName;
}
fixed (byte* nullFixed = dbNull = new byte[(columnNames.Length * rowCount + 7) >> 3])
{
fixedMap nullMap = new fixedMap(nullFixed);
index = 0;
foreach (DataRow row in table.Rows)
{
columnIndex = columnFixed;
foreach (object value in row.ItemArray)
{
if (value == DBNull.Value) nullMap.Set(index);
else builder.Append(value, *columnIndex);
++index;
++columnIndex;
}
}
}
}
}
public unsafe static DataTable Get(dataTable value)
{
if (value == null) return null;
DataTable table = new DataTable(value.name);
if (value.rowCount != 0)
{
fixed (byte* dataFixed = value.data.Data)
{
objectBuilder builder = new objectBuilder(dataFixed, value.data.Strings);
value.get(table, builder);
}
}
return table;
}
internal DataTable Get(objectBuilder builder)
{
DataTable table = new DataTable(name);
if (rowCount != 0) get(table, builder);
return table;
}
private unsafe void get(DataTable table, objectBuilder builder)
{
int index = 0;
DataColumn[] columns = new DataColumn[columnNames.Length];
fixed (byte* columnFixed = columnIndexs)
{
byte* columnIndex = columnFixed;
foreach (string columnName in columnNames)
{
columns[index++] = new DataColumn(columnName, *columnIndex < types.Length ? types[*columnIndex] : typeof(object));
++columnIndex;
}
table.Columns.AddRange(columns);
fixed (byte* nullFixed = dbNull)
{
fixedMap nullMap = new fixedMap(nullFixed);
for (index = 0; rowCount != 0; --rowCount)
{
object[] values = new object[columnNames.Length];
columnIndex = columnFixed;
for (int valueIndex = 0; valueIndex != columnNames.Length; ++valueIndex)
{
values[valueIndex] = nullMap.Get(index++) ? DBNull.Value : builder.Get(*columnIndex);
++columnIndex;
}
DataRow row = table.NewRow();
row.ItemArray = values;
table.Rows.Add(row);
}
}
}
}
}
private dataArray data;
private string name;
private dataTable[] tables;
private void from(DataSet set)
{
if (set.Tables.Count != 0)
{
using (dataBuilder builder = new dataBuilder())
{
tables = set.Tables.toGeneric<DataTable>().getArray(table => dataTable.From(table, builder));
data = builder.Get();
}
}
name = set.DataSetName;
}
public static dataSet From(DataSet set)
{
if (set == null) return null;
dataSet value = new dataSet();
value.from(set);
return value;
}
private unsafe void set(DataSet set)
{
if (tables.length() != 0)
{
fixed (byte* dataFixed = data.Data)
{
objectBuilder builder = new objectBuilder(dataFixed, data.Strings);
foreach (dataTable table in tables) set.Tables.Add(table.Get(builder));
}
}
}
public unsafe static DataSet Get(dataSet value)
{
if (value == null) return null;
DataSet set = new DataSet(value.name);
value.set(set);
return set;
}
private static readonly Type[] types;
private static readonly staticDictionary<hashCode<Type>, byte> typeIndexs;
static dataSet()
{
int index = 0;
types = new Type[29];
keyValue<hashCode<Type>, byte>[] typeArray = new keyValue<hashCode<Type>, byte>[types.Length];
typeArray[index].Set(types[index] = typeof(int), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(int?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(string), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(DateTime), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(DateTime?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(double), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(double?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(float), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(float?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(decimal), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(decimal?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(Guid), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(Guid?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(bool), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(bool?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(byte), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(byte?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(sbyte), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(sbyte?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(short), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(short?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(ushort), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(ushort?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(uint), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(uint?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(long), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(long?), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(ulong), (byte)index);
++index;
typeArray[index].Set(types[index] = typeof(ulong?), (byte)index);
typeIndexs = new staticDictionary<hashCode<Type>, byte>(typeArray);
}
}
}
using System;
using System.Data;
using fastCSharp;
namespace fastCSharp.sql
{
//[fastCSharp.setup.cSharp.serialize]
public partial class dataSet
{
internal class dataBuilder : IDisposable
{
private unmanagedStream stream = new unmanagedStream();
private list<string> strings = new list<string>();
public void Append(object value, byte typeIndex)
{
switch (typeIndex)
{
case 0:
stream.Write((int)value);
break;
case 1:
stream.Write((int)(int?)value);
break;
case 2:
strings.Add((string)value);
break;
case 3:
stream.Write(((DateTime)value).Ticks);
break;
case 4:
stream.Write(((DateTime)(DateTime?)value).Ticks);
break;
case 5:
stream.Write((double)value);
break;
case 6:
stream.Write((double)(double?)value);
break;
case 7:
stream.Write((float)value);
break;
case 8:
stream.Write((float)(float?)value);
break;
case 9:
stream.Write((decimal)value);
break;
case 10:
stream.Write((decimal)(decimal?)value);
break;
case 11:
stream.Write((Guid)value);
break;
case 12:
stream.Write((Guid)(Guid?)value);
break;
case 13:
stream.Write((bool)value ? (byte)1 : (byte)0);
break;
case 14:
stream.Write((bool)(bool?)value ? (byte)1 : (byte)0);
break;
case 15:
stream.Write((byte)value);
break;
case 16:
stream.Write((byte)(byte?)value);
break;
case 17:
stream.Write((sbyte)value);
break;
case 18:
stream.Write((sbyte)(sbyte?)value);
break;
case 19:
stream.Write((short)value);
break;
case 20:
stream.Write((short)(short?)value);
break;
case 21:
stream.Write((ushort)value);
break;
case 22:
stream.Write((ushort)(ushort?)value);
break;
case 23:
stream.Write((uint)value);
break;
case 24:
stream.Write((uint)(uint?)value);
break;
case 25:
stream.Write((long)value);
break;
case 26:
stream.Write((long)(long?)value);
break;
case 27:
stream.Write((ulong)value);
break;
case 28:
stream.Write((ulong)(ulong?)value);
break;
}
}
public dataArray Get()
{
dataArray value = new dataArray();
value.Data = stream.GetArray();
value.Strings = strings.ToArray();
return value;
}
public void Dispose()
{
pub.Dispose(ref stream);
}
}
internal unsafe class objectBuilder
{
private byte* data;
private string[] strings;
private int stringIndex;
public objectBuilder(byte* dataFixed, string[] strings)
{
data = dataFixed;
this.strings = strings;
}
public object Get(byte typeIndex)
{
object value;
switch (typeIndex)
{
case 0:
value = *(int*)data;
data += sizeof(int);
return value;
case 1:
value = (int?)*(int*)data;
data += sizeof(int);
return value;
case 2:
return strings[stringIndex++];
case 3:
value = new DateTime(*(long*)data);
data += sizeof(long);
return value;
case 4:
value = (DateTime?)new DateTime(*(long*)data);
data += sizeof(long);
return value;
case 5:
value = *(double*)data;
data += sizeof(double);
return value;
case 6:
value = (double?)*(double*)data;
data += sizeof(double);
return value;
case 7:
value = *(float*)data;
data += sizeof(float);
return value;
case 8:
value = (float?)*(float*)data;
data += sizeof(float);
return value;
case 9:
value = *(decimal*)data;
data += sizeof(decimal);
return value;
case 10:
value = (decimal?)*(decimal*)data;
data += sizeof(decimal);
return value;
case 11:
value = *(Guid*)data;
data += sizeof(Guid);
return value;
case 12:
value = (Guid?)*(Guid*)data;
data += sizeof(Guid);
return value;
case 13:
value = *(byte*)data != 0;
++data;
return value;
case 14:
value = (bool?)(*(byte*)data != 0);
++data;
return value;
case 15:
value = *(byte*)data;
++data;
return value;
case 16:
value = (byte?)*(byte*)data;
++data;
return value;
case 17:
value = *(sbyte*)data;
++data;
return value;
case 18:
value = (sbyte?)*(sbyte*)data;
++data;
return value;
case 19:
value = *(short*)data;
data += sizeof(short);
return value;
case 20:
value = (short?)*(short*)data;
data += sizeof(short);
return value;
case 21:
value = *(ushort*)data;
data += sizeof(ushort);
return value;
case 22:
value = (ushort?)*(ushort*)data;
data += sizeof(ushort);
return value;
case 23:
value = *(uint*)data;
data += sizeof(uint);
return value;
case 24:
value = (uint?)*(uint*)data;
data += sizeof(uint);
return value;
case 25:
value = *(long*)data;
data += sizeof(long);
return value;
case 26:
value = (long?)*(long*)data;
data += sizeof(long);
return value;
case 27:
value = *(ulong*)data;
data += sizeof(ulong);
return value;
case 28:
value = (ulong?)*(ulong*)data;
data += sizeof(ulong);
return value;
}
return null;
}
}
//[fastCSharp.setup.cSharp.serialize]
internal partial class dataArray
{
public byte[] Data;
public string[] Strings;
}
未完待续