/// <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;
 }