in RowsetImportEngine/TextRowsetImporter2.cs [1147:1321]
private bool ReadRowsetPropertiesFromXml (string sXmlRowsetFile, bool bOptional)
{
ColumnTypes ct = new ColumnTypes();
RowsetTypes rt = new RowsetTypes();
TextRowset rowset = null;
Column col = null;
string RowsetName = "";
string RowsetType = "";
string RowsetIdentifier = "";
string ColumnName = "";
string ColumnType = "";
string ColumnDefineToken = "";
string ColumnValueToken = "";
string ColumnRowsetLevel = "";
int ColumnLength = 0;
string sXmlRowsetFile2 = "";
bool RowsetEnabled = true;
System.Xml.XmlTextReader xr = null;
// First check the .exe dir for TextRowsets.xml. If not found, check current directory.
sXmlRowsetFile2 = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\" + sXmlRowsetFile;
if (File.Exists(sXmlRowsetFile2))
xr = new XmlTextReader (sXmlRowsetFile2);
else if (File.Exists(sXmlRowsetFile))
xr = new XmlTextReader (sXmlRowsetFile);
else
{
// If this rowset definition file was optional, we don't want to raise an
// error just because it wasn't found. Return true (success) in this case.
if (!bOptional)
{
ErrorDialog ed = new ErrorDialog("Could not find rowset definition file (" + sXmlRowsetFile + ").", false, this.logger);
ed.Handle();
}
return bOptional;
}
try
{
xr.Read();
while (!xr.EOF)
{
if (xr.IsStartElement("Rowset"))
{
// Read rowset attributes
while (xr.MoveToNextAttribute())
{
switch (xr.Name)
{
case "name": RowsetName = xr.Value; break;
case "type": RowsetType = xr.Value; break;
case "identifier": RowsetIdentifier = xr.Value; break;
// if enabled="false", skip this rowset
case "enabled":
if (xr.Value.Trim().ToUpper().Equals("FALSE"))
RowsetEnabled = false;
else
RowsetEnabled = true;
break;
}
}
// If the rowset is defined but not enabled, skip it.
if (!RowsetEnabled)
{
xr.Skip();
// Default to enabled for next rowset
RowsetEnabled = true;
continue;
}
// Locate the matching rowset class
bool RowsetFound = false;
foreach (TextRowset r in rt.KnownRowsetTypes)
{
if (r.GetType().ToString() == RowsetType)
{ // found the rowset type -- make a copy to add to the KnownRowsets collection
RowsetFound = true;
rowset = (TextRowset)(r.Copy());
rowset.Name = RowsetName;
rowset.Identifer = RowsetIdentifier;
break;
}
}
if (!RowsetFound)
{ // We didn't find the rowset type -- skip column processing for the rowset.
xr.Skip();
continue;
}
// Read past the KnownColumns element until we reach the Columns list. Keep an eye out
// for a new Rowset (it's possible that a rowset could not have any KnownColumns).
while (!xr.EOF && !xr.Name.Equals("Column") && !xr.Name.Equals("Rowset") && xr.Read()) {}
// Read in each column
while (xr.IsStartElement("Column") && !xr.EOF)
{
ColumnName=""; ColumnLength=0;
ColumnType=""; ColumnDefineToken="";
ColumnValueToken=""; ColumnRowsetLevel="false";
// Read column attributes
while (xr.MoveToNextAttribute())
{
switch (xr.Name)
{
case "name": ColumnName = xr.Value; break;
case "type": ColumnType = xr.Value; break;
case "length": ColumnLength = Convert.ToInt32(xr.Value,10); break;
case "rowsetlevel": ColumnRowsetLevel = xr.Value; break;
case "definetoken": ColumnDefineToken = xr.Value; break;
case "valuetoken": ColumnValueToken = xr.Value; break;
}
if (("" != ColumnDefineToken) || ("" != ColumnValueToken))
rowset.UsesTokens = true;
}
// Locate the matching column class
bool ColumnFound = false;
foreach (Column c in ct.KnownColumnTypes)
{
if (c.GetType().ToString() == ColumnType)
{ // found the column type -- make a copy to add to the KnownColumns collection
ColumnFound = true;
col = (Column)(c.Copy());
col.Name = ColumnName;
col.DefineToken = ColumnDefineToken;
col.ValueToken = ColumnValueToken;
// Some rowsets (e.g. DBCC INPUTBUFFER) have variable-width columns. For these
// columns, TextRowsets.xml allows specifying a column width wide enough to
// accommodate all possible widths. If a col width was specified, we'll use it
// instead of basing SQL column width on the width of the column in the input file.
if (ColumnLength>0)
col.SqlColumnLength = ColumnLength;
// We normally determine column width dynamically based on the observed column
// header width in the input file. However, non-tabular rowsets don't have column
// headers, so we always need to set their column width explicitly.
if (!rowset.TablularRowset)
{
if (ColumnLength>0)
col.Length = ColumnLength;
else
col.Length = DEFAULT_NONTAB_COLUMN_LEN;
}
col.RowsetLevel = ColumnRowsetLevel.Trim().ToUpper().Equals("TRUE") ? true : false;
rowset.KnownColumns.Add(col);
break;
}
}
if (!ColumnFound)
{ // We didn't find the column type -- skip it.
xr.Skip();
}
xr.Read();
}
// If we get here we should have a valid TextRowset with a populated KnownColumns collection.
// Add the rowset to the KnownRowsets collection.
this.KnownRowsets.Add(rowset);
if (!rowset.TablularRowset)
this.KnownNonTabularRowsets.Add(rowset);
}
// Make sure we don't read past a rowset or past the end of the file.
if (!xr.EOF)
{
if (!xr.EOF && !xr.IsStartElement("Rowset"))
xr.Read();
}
}
return true;
}
catch (Exception e)
{
ErrorDialog ed = new ErrorDialog(e, false, this.logger);
ed.Handle();
return false;
}
}