/// <summary> /// 创建SQL /// </summary> /// <param name="expression">委托关联表达式</param> /// <returns>SQL表达式</returns> internal unsafe string Create(TmphLambdaExpression expression) { var TmphBuffer = TmphClient.SqlBuffers.Get(); try { using (stream = new TmphCharStream(TmphBuffer.Char, TmphClient.SqlBufferSize)) { create(expression, stream); return stream.ToString(); } } finally { TmphClient.SqlBuffers.Push(ref TmphBuffer); } }
public void Write(TmphCharStream stream) { write(stream); }
/// <summary> /// 字节流转换成JSON字符串 /// </summary> /// <param name="jsonStream">JSON输出流,不能为null</param> /// <param name="start">起始位置,不能为null</param> /// <param name="end">结束位置,长度必须大于0</param> public static unsafe void ToJson(TmphCharStream jsonStream, byte* start, byte* end) { jsonStream.Write('['); for (TmphAjax.ToString(*start, jsonStream); ++start != end; TmphAjax.ToString(*start, jsonStream)) jsonStream.Write(','); jsonStream.Write(']'); }
/// <summary> /// 委托关联表达式转SQL表达式 /// </summary> /// <param name="expression">委托关联表达式</param> /// <param name="sqlStream">SQL表达式流</param> /// <returns>参数成员名称</returns> public static string Convert(TmphLambdaExpression expression, TmphCharStream stream) { var converter = new TmphConverter(); converter.create(expression, stream); return converter.FirstMemberName; }
/// <summary> /// 创建SQL /// </summary> /// <param name="expression">委托关联表达式</param> /// <param name="sqlStream">SQL表达式流</param> protected abstract void create(TmphLambdaExpression expression, TmphCharStream stream);
public static unsafe void ToString(Guid value, TmphCharStream jsonStream) { var guid = new TmphGuid { Value = value }; jsonStream.PrepLength(38); var data = (byte*)jsonStream.CurrentChar; int high = guid.Byte3 >> 4, low = guid.Byte3 & 15; *(char*)data = Quote; *(char*)(data + sizeof(char)) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 2) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte2 >> 4; low = guid.Byte2 & 15; *(char*)(data + sizeof(char) * 3) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 4) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte1 >> 4; low = guid.Byte1 & 15; *(char*)(data + sizeof(char) * 5) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 6) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte0 >> 4; low = guid.Byte0 & 15; *(char*)(data + sizeof(char) * 7) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 8) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 9) = '-'; high = guid.Byte5 >> 4; low = guid.Byte5 & 15; *(char*)(data + sizeof(char) * 10) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 11) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte4 >> 4; low = guid.Byte4 & 15; *(char*)(data + sizeof(char) * 12) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 13) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 14) = '-'; high = guid.Byte7 >> 4; low = guid.Byte7 & 15; *(char*)(data + sizeof(char) * 15) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 16) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte6 >> 4; low = guid.Byte6 & 15; *(char*)(data + sizeof(char) * 17) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 18) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 19) = '-'; high = guid.Byte8 >> 4; low = guid.Byte8 & 15; *(char*)(data + sizeof(char) * 20) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 21) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte9 >> 4; low = guid.Byte9 & 15; *(char*)(data + sizeof(char) * 22) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 23) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 24) = '-'; high = guid.Byte10 >> 4; low = guid.Byte10 & 15; *(char*)(data + sizeof(char) * 25) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 26) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte11 >> 4; low = guid.Byte11 & 15; *(char*)(data + sizeof(char) * 27) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 28) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte12 >> 4; low = guid.Byte12 & 15; *(char*)(data + sizeof(char) * 29) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 30) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte13 >> 4; low = guid.Byte13 & 15; *(char*)(data + sizeof(char) * 31) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 32) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte14 >> 4; low = guid.Byte14 & 15; *(char*)(data + sizeof(char) * 33) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 34) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); high = guid.Byte15 >> 4; low = guid.Byte15 & 15; *(char*)(data + sizeof(char) * 35) = (char)(high < 10 ? high + '0' : (high + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 36) = (char)(low < 10 ? low + '0' : (low + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 37) = Quote; jsonStream.Unsafer.AddLength(38); }
public static void ToString(DateTime time, TmphCharStream jsonStream) { if (time != DateTime.MinValue) ToStringNotNull(time, jsonStream); else WriteNull(jsonStream); }
public static void ToString(bool value, TmphCharStream jsonStream) { jsonStream.Write(value ? '1' : '0'); }
/// <summary> /// 格式化ajax字符串 /// </summary> /// <param name="jsStream">js字符流</param> /// <returns>格式化后ajax字符串</returns> private static unsafe string formatQuote(TmphCharStream jsStream) { for (char* start = jsStream.Char, end = start + jsStream.Length; start != end; ++start) { if (*start == Quote) *start = '"'; } return new string(jsStream.Char, 0, jsStream.Length); }
/// <summary> /// ajax字符串长度 /// </summary> /// <param name="jsStream">js字符流</param> /// <returns>ajax字符串长度</returns> private static unsafe int formatLength(TmphCharStream jsStream) { var length = 0; for (char* start = jsStream.Char, end = start + jsStream.Length; start != end; ++start) { if (*start == '\n' || *start == '\r' || *start == '"' || *start == '\\') ++length; } return length; }
/// <summary> /// 格式化ajax字符串 /// </summary> /// <param name="jsStream">js字符流</param> /// <returns>格式化后ajax字符串</returns> public static unsafe string FormatJavascript(TmphCharStream jsStream) { var length = formatLength(jsStream); if (length == 0) return jsStream.Length == 0 ? string.Empty : formatQuote(jsStream); if ((length += jsStream.Length) <= jsStream.DataLength >> 1) return format(jsStream, length); var value = TmphString.FastAllocateString(length); fixed (char* valueFixed = value) { for (char* start = jsStream.Char, write = valueFixed, end = start + jsStream.Length; start != end; ++start) { if (*start == Quote) *write++ = '"'; else if (*start == '\n') { *(int*)write = '\\' + ('n' << 16); write += 2; } else if (*start == '\r') { *(int*)write = '\\' + ('r' << 16); write += 2; } else if (*start == '"' || *start == '\\') { *write++ = '\\'; *write++ = *start; } else *write++ = *start; } } return value; }
public static void ToString(TmphSubString value, TmphCharStream jsonStream) { if (value.value == null) WriteNull(jsonStream); else { jsonStream.PrepLength(value.Length + 2); jsonStream.Unsafer.Write(Quote); jsonStream.Write(value); jsonStream.Unsafer.Write(Quote); } }
public static void ToString(string value, TmphCharStream jsonStream) { jsonStream.PrepLength(value.Length() + 2); jsonStream.Unsafer.Write(Quote); jsonStream.Write(value); jsonStream.Unsafer.Write(Quote); }
public static void ToString(char value, TmphCharStream jsonStream) { jsonStream.PrepLength(3); var unsafeStream = jsonStream.Unsafer; unsafeStream.Write(Quote); unsafeStream.Write(value); unsafeStream.Write(Quote); }
internal unsafe TmphCharStream ResetJsonStream(void* data, int size) { if (jsonStream == null) return jsonStream = new TmphCharStream((char*)data, size >> 1); jsonStream.Reset((byte*)data, size); return jsonStream; }
public static unsafe void ToString(sbyte value, TmphCharStream jsonStream) { if (value == 0) jsonStream.Write('0'); else { char* chars = stackalloc char[6]; if (value < 0) { if (value == -128) { jsonStream.PrepLength(4); var unsafeStream = jsonStream.Unsafer; unsafeStream.Write('-'); unsafeStream.Write('1'); unsafeStream.Write('2'); unsafeStream.Write('8'); } else { toString((sbyte)-value, chars); jsonStream.Write(chars + 1, 5); } } else { toString(value, chars); jsonStream.Write(chars + 2, 4); } } }
public static unsafe void ToString(byte value, TmphCharStream jsonStream) { if (value == 0) jsonStream.Write('0'); else { jsonStream.PrepLength(4); var data = (byte*)jsonStream.CurrentChar; var nextValue = value >> 4; *(char*)data = '0'; *(char*)(data + sizeof(char)) = 'x'; *(char*)(data + sizeof(char) * 2) = (char)(nextValue < 10 ? nextValue + '0' : (nextValue + ('0' + 'A' - '9' - 1))); *(char*)(data + sizeof(char) * 3) = (char)((value &= 15) < 10 ? value + '0' : (value + ('0' + 'A' - '9' - 1))); jsonStream.Unsafer.AddLength(4); } }
/// <summary> /// 格式化ajax字符串 /// </summary> /// <param name="jsStream">js字符流</param> /// <param name="length">格式化后ajax字符串长度</param> /// <returns>格式化后ajax字符串</returns> private static unsafe string format(TmphCharStream jsStream, int length) { char* start = jsStream.Char, write = start + length; for (var read = start + jsStream.Length; read != write;) { if (*--read == Quote) *--write = '"'; else if (*read == '\n') *(int*)(write -= 2) = ('n' << 16) + '\\'; else if (*read == '\r') *(int*)(write -= 2) = ('r' << 16) + '\\'; else { *--write = *read; if (*read == '"' || *read == '\\') *--write = '\\'; } } while (write != start) if (*--write == Quote) *write = '"'; return new string(jsStream.Char, 0, length); }
public static void ToString(decimal value, TmphCharStream jsonStream) { jsonStream.WriteNotNull(value.ToString()); }
/// <summary> /// 格式化ajax字符串 /// </summary> /// <param name="jsStream">JS字符流</param> /// <param name="formatStream">格式化JSON字符流</param> internal static unsafe void FormatJavascript(TmphCharStream jsStream, TmphUnmanagedStream formatStream) { var length = formatLength(jsStream); if (length == 0) { if (jsStream.Length != 0) formatQuote(jsStream, formatStream); return; } length += jsStream.Length; formatStream.PrepLength(length <<= 1); for (char* start = jsStream.Char, write = (char*)(formatStream.CurrentData), end = start + jsStream.Length; start != end; ++start) { if (*start == Quote) *write++ = '"'; else if (*start == '\n') { *(int*)write = ('n' << 16) + '\\'; write += 2; } else if (*start == '\r') { *(int*)write = ('r' << 16) + '\\'; write += 2; } else { if (*start == '"' || *start == '\\') *write++ = '\\'; *write++ = *start; } } formatStream.Unsafer.AddLength(length); }
public static unsafe void ToStringNotNull(DateTime time, TmphCharStream jsonStream) { char* chars = stackalloc char[20]; var index = toString((time.Ticks - JavascriptMinTimeTicks) / TmphDate.MillisecondTicks, chars); jsonStream.PrepLength(index.Value + DateStart.Length + 1); var unsafeStraem = jsonStream.Unsafer; fixed (char* dataFixed = DateStart) unsafeStraem.Write(dataFixed, DateStart.Length); unsafeStraem.Write(chars + index.Key, index.Value); unsafeStraem.Write(DateEnd); }
/// <summary> /// 格式化ajax字符串 /// </summary> /// <param name="jsStream">js字符流</param> /// <param name="formatStream">格式化JSON字符流</param> private static unsafe void formatQuote(TmphCharStream jsStream, TmphUnmanagedStream formatStream) { var length = jsStream.Length; char* start = jsStream.Char, end = start + length; formatStream.PrepLength(length <<= 1); for (var write = (char*)(formatStream.CurrentData); start != end; ++start) *write++ = *start == Quote ? '"' : *start; formatStream.Unsafer.AddLength(length); }
public static unsafe void WriteArray(TmphCharStream jsonStream) { jsonStream.PrepLength(2); var data = (byte*)jsonStream.CurrentChar; *(char*)data = '['; *(char*)(data + sizeof(char)) = ']'; jsonStream.Unsafer.AddLength(2); }
public static unsafe void WriteNaN(TmphCharStream jsonStream) { jsonStream.PrepLength(3); var data = (byte*)jsonStream.CurrentChar; *(char*)data = 'N'; *(char*)(data + sizeof(char)) = 'a'; *(char*)(data + sizeof(char) * 2) = 'N'; jsonStream.Unsafer.AddLength(3); }
/// <summary> /// 创建SQL /// </summary> /// <param name="expression">委托关联表达式</param> /// <param name="sqlStream">SQL表达式流</param> protected override void create(TmphLambdaExpression expression, TmphCharStream stream) { this.stream = stream; TmphExpressionConverter.Default[expression.Body.NodeType](this, expression.Body); }
public static unsafe void ToString(ulong value, TmphCharStream jsonStream, bool isMaxToString = true) { if (value <= maxValue || !isMaxToString) { char* chars = stackalloc char[20]; var index = toString(value, chars); jsonStream.Write(chars + index.Key, index.Value); } else { var unsafeStraem = jsonStream.Unsafer; jsonStream.PrepLength(22); unsafeStraem.Write(Quote); TmphNumber.ToString(value, jsonStream); unsafeStraem.Write(Quote); } }
/// <summary> /// 字节流转换成JSON字符串 /// </summary> /// <param name="jsonStream">JSON输出流</param> /// <param name="TmphBuffer">字节流数组</param> public static unsafe void ToJson(TmphCharStream jsonStream, TmphSubArray<byte> TmphBuffer) { if (TmphBuffer.Array == null) TmphAjax.WriteNull(jsonStream); else if (TmphBuffer.Count == 0) TmphAjax.WriteArray(jsonStream); else { fixed (byte* bufferFixed = TmphBuffer.Array) { var start = bufferFixed + TmphBuffer.StartIndex; ToJson(jsonStream, start, start + TmphBuffer.Count); } } }
public static unsafe void ToString(ushort value, TmphCharStream jsonStream) { char* chars = stackalloc char[8]; var index = toString(value, chars); jsonStream.Write(chars + index.Key, index.Value); }
/// <summary> /// 获取Excel客户端 /// </summary> /// <returns>Excel客户端</returns> public unsafe TmphClient GetClient() { var provider = TmphEnum<EProviderType, THProvider>.Array(Provider); var TmphBuffer = Sql.TmphClient.SqlBuffers.Get(); try { using (var connectionStream = new TmphCharStream(TmphBuffer.Char, Sql.TmphClient.SqlBufferSize)) { connectionStream.WriteNotNull("Provider="); connectionStream.Write(provider.Name); connectionStream.WriteNotNull(";Data Source="); connectionStream.Write(DataSource); if (Password != null) { connectionStream.WriteNotNull(";Database Password="******";Extended Properties='"); connectionStream.Write(provider.Excel); connectionStream.WriteNotNull(IsTitleColumn ? ";HDR=YES;IMEX=" : ";HDR=NO;IMEX="); connectionStream.WriteNotNull(((byte)Intermixed).toString()); connectionStream.Write('\''); return (TmphClient) new Sql.TmphConnection { Type = TmphType.Excel, Connection = connectionStream.ToString() }.Client; } } finally { Sql.TmphClient.SqlBuffers.Push(ref TmphBuffer); } }
public void Write(TmphCharStream charStream) { Unsafe.TmphMemory.Copy(charStream.CurrentData, Stream.CurrentData, charStream.length); Stream.length += charStream.length; }