using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.ComponentModel;
using FastReport.Utils;
using System.Data.Common;
using System.Net;
using System.IO;
namespace FastReport.Data
{
///
/// Represents a connection to xml file-based database.
///
/// This example shows how to add a new connection to the report.
///
/// Report report1;
/// XmlDataConnection conn = new XmlDataConnection();
/// conn.XmlFile = @"c:\data.xml";
/// report1.Dictionary.Connections.Add(conn);
/// conn.CreateAllTables();
///
///
public partial class XmlDataConnection : DataConnectionBase
{
#region Properties
///
/// Gets or sets the path to .xsd file.
///
[Category("Data")]
public string XsdFile
{
get
{
XmlConnectionStringBuilder builder = new XmlConnectionStringBuilder(ConnectionString);
return builder.XsdFile;
}
set
{
XmlConnectionStringBuilder builder = new XmlConnectionStringBuilder(ConnectionString);
builder.XsdFile = value;
ConnectionString = builder.ToString();
}
}
///
/// Gets or sets the path to .xml file.
///
[Category("Data")]
public string XmlFile
{
get
{
XmlConnectionStringBuilder builder = new XmlConnectionStringBuilder(ConnectionString);
return builder.XmlFile;
}
set
{
XmlConnectionStringBuilder builder = new XmlConnectionStringBuilder(ConnectionString);
builder.XmlFile = value;
ConnectionString = builder.ToString();
}
}
#endregion
#region Protected Methods
///
protected override DataSet CreateDataSet()
{
DataSet dataset = base.CreateDataSet();
ReadXmlSchema(dataset);
ReadXml(dataset);
return dataset;
}
///
protected override void SetConnectionString(string value)
{
DisposeDataSet();
base.SetConnectionString(value);
}
#endregion
#region Public Methods
///
public override void FillTableSchema(DataTable table, string selectCommand, CommandParameterCollection parameters)
{
// do nothing
}
///
public override void FillTableData(DataTable table, string selectCommand, CommandParameterCollection parameters)
{
// do nothing
}
///
public override string[] GetTableNames()
{
string[] result = new string[DataSet.Tables.Count];
for (int i = 0; i < DataSet.Tables.Count; i++)
{
result[i] = DataSet.Tables[i].TableName;
}
return result;
}
///
public override void CreateTable(TableDataSource source)
{
if (DataSet.Tables.Contains(source.TableName))
{
source.Table = DataSet.Tables[source.TableName];
base.CreateTable(source);
}
else
source.Table = null;
}
///
public override void DeleteTable(TableDataSource source)
{
// do nothing
}
///
public override string QuoteIdentifier(string value, DbConnection connection)
{
return value;
}
#endregion
#region private methods
private void ReadXml(DataSet dataset)
{
try
{
// fix for datafile in current folder
if (File.Exists(XmlFile))
XmlFile = Path.GetFullPath(XmlFile);
Uri uri = new Uri(XmlFile);
if (uri.IsFile)
{
if (Config.ForbidLocalData)
throw new Exception(Res.Get("ConnectionEditors,Common,OnlyUrlException"));
dataset.ReadXml(XmlFile);
}
else if (uri.OriginalString.StartsWith("http") || uri.OriginalString.StartsWith("ftp"))
{
LoadXmlFromUrl(dataset);
}
}
catch (Exception e)
{
throw e;
}
}
private void LoadXmlFromUrl(DataSet dataset)
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(XmlFile);
using (var response = req.GetResponse() as HttpWebResponse)
{
var encoding = response.CharacterSet.Equals(String.Empty) ? Encoding.UTF8 : Encoding.GetEncoding(response.CharacterSet);
using (var responseStream = response.GetResponseStream())
using (var reader = new System.IO.StreamReader(responseStream, encoding))
dataset.ReadXml(reader, XmlReadMode.Auto);
}
}
private void ReadXmlSchema(DataSet dataset)
{
if (String.IsNullOrEmpty(XsdFile))
return;
try
{
Uri uri = new Uri(XsdFile);
if (uri.IsFile)
{
if (Config.ForbidLocalData)
throw new Exception(Res.Get("ConnectionEditors,Common,OnlyUrlException"));
dataset.ReadXmlSchema(XsdFile);
}
else if (uri.OriginalString.StartsWith("http") || uri.OriginalString.StartsWith("ftp"))
{
LoadXmlSchemaFromUrl(dataset);
}
}
catch (Exception e)
{
throw e;
}
}
private void LoadXmlSchemaFromUrl(DataSet dataset)
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(XsdFile);
using (var response = req.GetResponse() as HttpWebResponse)
{
var encoding = response.CharacterSet.Equals(String.Empty) ? Encoding.UTF8 : Encoding.GetEncoding(response.CharacterSet);
using (var responseStream = response.GetResponseStream())
using (var reader = new System.IO.StreamReader(responseStream, encoding))
dataset.ReadXmlSchema(reader);
}
}
#endregion
///
/// Initializes a new instance of the class with default settings.
///
public XmlDataConnection()
{
IsSqlBased = false;
}
}
}