JsonDataSourceConnectionStringBuilder.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Common;
  4. using System.Globalization;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. namespace FastReport.Data.JsonConnection
  8. {
  9. /// <summary>
  10. /// Represents the JsonDataConnection connection string builder.
  11. /// </summary>
  12. /// <remarks>
  13. /// Use this class to parse connection string returned by the <b>JsonDataConnection</b> class.
  14. /// </remarks>
  15. public class JsonDataSourceConnectionStringBuilder : DbConnectionStringBuilder
  16. {
  17. #region Public Properties
  18. /// <summary>
  19. /// Gets or sets json data
  20. /// </summary>
  21. public string Json
  22. {
  23. get
  24. {
  25. object result;
  26. if (TryGetValue("Json", out result) && result != null)
  27. {
  28. if (Regex.IsMatch((string)result, @"^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)?$"))
  29. {
  30. var base64str = (Convert.FromBase64String(result.ToString()));
  31. return System.Text.Encoding.UTF8.GetString(base64str);
  32. }
  33. return (string)result;
  34. }
  35. return "";
  36. }
  37. set
  38. {
  39. base["Json"] = value;
  40. }
  41. }
  42. /// <summary>
  43. /// Gets or sets json schema
  44. /// </summary>
  45. public string JsonSchema
  46. {
  47. get
  48. {
  49. object result;
  50. if (TryGetValue("JsonSchema", out result) && result != null)
  51. {
  52. if (Regex.IsMatch((string)result, @"^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)?$"))
  53. {
  54. var base64str = (Convert.FromBase64String(result.ToString()));
  55. return System.Text.Encoding.UTF8.GetString(base64str);
  56. }
  57. return (string)result;
  58. }
  59. return "";
  60. }
  61. set
  62. {
  63. base["JsonSchema"] = value;
  64. }
  65. }
  66. /// <summary>
  67. /// Gets or sets json url encoding
  68. /// </summary>
  69. public string Encoding
  70. {
  71. get
  72. {
  73. object result;
  74. if (TryGetValue("Encoding", out result) && result != null)
  75. return (string)result;
  76. return "";
  77. }
  78. set
  79. {
  80. base["Encoding"] = value;
  81. }
  82. }
  83. /// <summary>
  84. /// Set or get headers of the connection string.
  85. ///
  86. /// </summary>
  87. /// <remarks>
  88. /// Returns copy of dictionary. If you need to update values, set the dictionary again!
  89. /// </remarks>
  90. public Dictionary<string, string> Headers
  91. {
  92. get
  93. {
  94. var numberformat = CultureInfo.InvariantCulture.NumberFormat;
  95. Dictionary<string, string> headers = new Dictionary<string, string>();
  96. object result;
  97. string header = string.Empty;
  98. string[] splittedHeader;
  99. int headerIteration = 0;
  100. while (TryGetValue("Header" + headerIteration.ToString(numberformat), out result) && result != null)
  101. {
  102. header = (string)result;
  103. if (!string.IsNullOrWhiteSpace(header))
  104. {
  105. splittedHeader = header.Split(':');
  106. string headerKey = splittedHeader[0], headerVal = splittedHeader[1];
  107. if (Regex.IsMatch(headerKey, @"^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)?$"))
  108. {
  109. var base64str = Convert.FromBase64String(headerKey);
  110. headerKey = System.Text.Encoding.UTF8.GetString(base64str);
  111. }
  112. if (Regex.IsMatch(headerVal, @"^([A-Za-z0-9+\/]{4})*([A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)?$"))
  113. {
  114. var base64str = Convert.FromBase64String(headerVal);
  115. headerVal = System.Text.Encoding.UTF8.GetString(base64str);
  116. }
  117. headers[headerKey] = headerVal;
  118. }
  119. headerIteration++;
  120. }
  121. return headers;
  122. }
  123. set
  124. {
  125. var numberformat = CultureInfo.InvariantCulture.NumberFormat;
  126. int headerIteration = 0;
  127. while (Remove("Header" + headerIteration.ToString(numberformat)))
  128. {
  129. headerIteration++;
  130. }
  131. if (value != null)
  132. {
  133. headerIteration = 0;
  134. foreach (var header in value)
  135. {
  136. var headerKey = header.Key;
  137. var headerVal = header.Value;
  138. if (headerKey.Contains(":"))
  139. {
  140. headerKey = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(headerKey));
  141. }
  142. if (headerVal.Contains(":"))
  143. {
  144. headerVal = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(headerVal));
  145. }
  146. base["Header" + headerIteration.ToString(numberformat)] = headerKey + ":" + headerVal;
  147. headerIteration++;
  148. }
  149. }
  150. }
  151. }
  152. /// <summary>
  153. /// Gets or sets simple structure value
  154. /// </summary>
  155. public bool SimpleStructure
  156. {
  157. get
  158. {
  159. object result;
  160. if (TryGetValue("SimpleStructure", out result) && result != null)
  161. return result.ToString().ToLower() == "true";
  162. return false;
  163. }
  164. set
  165. {
  166. base["SimpleStructure"] = value ? "true" : "false";
  167. }
  168. }
  169. #endregion Public Properties
  170. #region Public Constructors
  171. /// <summary>
  172. /// Initializes a new instance of the <see cref="JsonDataSourceConnectionStringBuilder"/> class with default settings.
  173. /// </summary>
  174. public JsonDataSourceConnectionStringBuilder()
  175. {
  176. ConnectionString = "";
  177. }
  178. /// <summary>
  179. /// Initializes a new instance of the <see cref="JsonDataSourceConnectionStringBuilder"/> class with
  180. /// specified connection string.
  181. /// </summary>
  182. /// <param name="connectionString">The connection string.</param>
  183. public JsonDataSourceConnectionStringBuilder(string connectionString)
  184. : base()
  185. {
  186. ConnectionString = connectionString;
  187. }
  188. #endregion Public Constructors
  189. }
  190. }