using FastReport.Utils.Json; using System; using System.Data; using System.Data.Common; using System.Linq; using System.Net; using System.Text; using System.Windows.Forms; namespace FastReport.Data.JsonConnection { /// /// FastReport json connection /// public partial class JsonDataSourceConnection : DataConnectionBase, IJsonProviderSourceConnection { #region Public Fields /// /// Name of json object table /// public const string TABLE_NAME = "JSON"; #endregion Public Fields #region Private Fields private JsonArray jsonInternal = null; private JsonSchema jsonSchema = null; private string jsonSchemaString = ""; private bool simpleStructure; #endregion Private Fields #region Internal Properties internal JsonArray Json { get { if (jsonInternal == null) InitConnection(); return jsonInternal; } } internal JsonSchema JsonSchema { get { if (jsonSchema == null) InitConnection(); return jsonSchema; } } internal bool SimpleStructure { get { return simpleStructure; } } #endregion Internal Properties #region Public Constructors /// /// Initialize a new instance /// public JsonDataSourceConnection() { IsSqlBased = false; } #endregion Public Constructors #region Public Methods /// public override void CreateAllTables(bool initSchema) { bool found = false; foreach (Base b in Tables) { if (b is JsonTableDataSource) { (b as JsonTableDataSource).UpdateSchema = true; (b as JsonTableDataSource).InitSchema(); found = true; break; } } if (!found) { JsonTableDataSource jsonDataSource = new JsonTableDataSource(); string fixedTableName = TABLE_NAME; jsonDataSource.TableName = fixedTableName; if (Report != null) { jsonDataSource.Name = Report.Dictionary.CreateUniqueName(fixedTableName); jsonDataSource.Alias = Report.Dictionary.CreateUniqueAlias(jsonDataSource.Alias); } else jsonDataSource.Name = fixedTableName; jsonDataSource.Parent = this; jsonDataSource.InitSchema(); jsonDataSource.Enabled = true; } // init table schema if (initSchema) { foreach (TableDataSource table in Tables) { table.InitSchema(); } } } /// public override void CreateRelations() { } /// public override void CreateTable(TableDataSource source) { //throw new NotImplementedException(); } /// public override void DeleteTable(TableDataSource source) { //throw new NotImplementedException(); } /// public override void FillTableData(DataTable table, string selectCommand, CommandParameterCollection parameters) { } /// public override void FillTableSchema(DataTable table, string selectCommand, CommandParameterCollection parameters) { } /// public override string[] GetTableNames() { return new string[] { TABLE_NAME }; } /// public override string QuoteIdentifier(string value, DbConnection connection) { return value; } /// public JsonBase GetJson(TableDataSource tableDataSource) { return Json; } #endregion Public Methods #region Protected Methods /// protected override DataSet CreateDataSet() { throw new NotImplementedException(); } /// protected override void SetConnectionString(string value) { jsonInternal = null; base.SetConnectionString(value); } #endregion Protected Methods #region Private Methods private void InitConnection() { InitConnection(false); } private void InitConnection(bool rebuildSchema) { JsonDataSourceConnectionStringBuilder builder = new JsonDataSourceConnectionStringBuilder(ConnectionString); simpleStructure = builder.SimpleStructure; JsonBase obj = null; string jsonText = builder.Json.Trim(); if (jsonText.Length > 0) { if (!(jsonText[0] == '{' || jsonText[0] == '[')) { //using (WebClient client = new WebClient()) //{ // try // { // client.Encoding = Encoding.GetEncoding(builder.Encoding); // } // catch // { // client.Encoding = Encoding.UTF8; // } // jsonText = client.DownloadString(jsonText); //} ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00); var req = WebRequest.Create(jsonText); req.Timeout = CommandTimeout * 1000; foreach (var header in builder.Headers) { req.Headers.Add(header.Key, header.Value); } using (var response = req.GetResponse() as HttpWebResponse) { Encoding encoding = Encoding.UTF8; try { encoding = Encoding.GetEncoding(response.CharacterSet); } catch { try { encoding = Encoding.GetEncoding(builder.Encoding); } catch { } } using (var responseStream = response.GetResponseStream()) using (var reader = new System.IO.StreamReader(responseStream, encoding)) jsonText = reader.ReadToEnd(); } } obj = JsonBase.FromString(jsonText) as JsonBase; } string schema = builder.JsonSchema; // have to update schema if (schema != jsonSchemaString || jsonSchema == null || String.IsNullOrEmpty(jsonSchemaString)) { JsonSchema schemaObj = null; if (String.IsNullOrEmpty(schema) || rebuildSchema) { if (obj != null) { schemaObj = JsonSchema.FromJson(obj); JsonObject child = new JsonObject(); schemaObj.Save(child); jsonSchemaString = child.ToString(); } } else { schemaObj = JsonSchema.Load(JsonBase.FromString(schema) as JsonObject); jsonSchemaString = schema; } if (schemaObj == null) { schemaObj = new JsonSchema(); schemaObj.Type = "array"; } if (schemaObj.Type != "array") { JsonSchema parentSchema = new JsonSchema(); parentSchema.Items = schemaObj; parentSchema.Type = "array"; schemaObj = parentSchema; } jsonSchema = schemaObj; } if (obj is JsonArray) { jsonInternal = obj as JsonArray; } else { JsonArray result = new JsonArray(); if (obj != null) result.Add(obj); jsonInternal = result; } } #endregion Private Methods } }