using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Collections;
using Com.StellmanGreene.PubMed;
using Com.StellmanGreene.CSVReader;
namespace SCGen
{
///
/// Class to wrap around the AAMC roster file
///
class Roster
{
///
/// RosterData contains the AAMC roster entries read from the file
///
public DataTable RosterData;
///
/// MatchNames contains all of the values in match_name1 and match_name2 as the
/// keys, with the array offset of the roster entry in RosterData
///
public Hashtable MatchNames;
///
/// Read the AAMC roster
///
/// CSV or XML file that contains the roster
public Roster(string RosterFile)
{
string Folder = Path.GetDirectoryName(RosterFile);
string Filename = Path.GetFileName(RosterFile);
// int Rows = 0;
if (Filename.ToLower().EndsWith(".csv"))
{
// Get the publication types from the input file
// We're replacing ODBC CSV code with our own CSVReader
//
// string ConnectionString =
// "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="
// + Folder + ";";
// OdbcConnection Connection = new OdbcConnection(ConnectionString);
// OdbcDataAdapter DataAdapter = new OdbcDataAdapter
// (@"SELECT setnb, fname, mname, lname, suffix, match_name1,
// match_name2, search_name1, search_name2, search_name3,
// search_name4, query FROM [" + Filename + "]", Connection);
// RosterData = new DataTable();
// RosterData.TableName = Filename;
// Rows = DataAdapter.Fill(RosterData);
RosterData = CSVReader.ReadCSVFile(RosterFile, true);
RosterData.TableName = Filename;
if (File.Exists(Folder + "\\" + Filename + ".xml"))
File.Delete(Folder + "\\" + Filename + ".xml");
RosterData.WriteXml(Folder + "\\" + Filename + ".xml", XmlWriteMode.WriteSchema);
}
else if (Filename.ToLower().EndsWith(".xml"))
{
RosterData = new DataTable();
RosterData.ReadXml(RosterFile);
}
// Populate MatchNames -- initialize it with case insensitive comparer
MatchNames = new Hashtable(StringComparer.CurrentCultureIgnoreCase);
for (int i = 0; i < RosterData.Rows.Count; i++)
{
DataRow Row = RosterData.Rows[i];
if (Row["match_name1"].ToString() != "")
AddMatch(Row["match_name1"].ToString(), i);
if (Row["match_name2"].ToString() != "")
AddMatch(Row["match_name2"].ToString(), i);
}
}
///
/// Add a matching name to the MatchNames hashtable
///
/// Name to add
/// Row in RosterData that the name corresponds to
private void AddMatch(string MatchName, int RosterRow)
{
// Each value in MatchNames is an ArrayList of integers that contains
// the roster rows for that match
if (!MatchNames.ContainsKey(MatchName))
MatchNames[MatchName] = new ArrayList();
ArrayList RosterRows = (ArrayList) MatchNames[MatchName];
if (!RosterRows.Contains(RosterRow))
RosterRows.Add(RosterRow);
MatchNames[MatchName] = RosterRows;
}
///
/// Find a person in the AAMC roster
///
/// Medline-formatted name to find
/// A Person object containing the person if found (null if no match was found)
public Person[] FindPerson(string NameToMatch)
{
// See if the matchname exists in the roster
if (NameToMatch == null || !MatchNames.ContainsKey(NameToMatch))
{
return null;
}
else
{
// Fetch the ArrayList of row numbers
ArrayList RosterRows = (ArrayList)MatchNames[NameToMatch];
// Dimension the return array
Person[] PeopleToReturn = new Person[RosterRows.Count];
int Count = 0;
foreach (int RowNum in RosterRows)
{
Count++;
DataRow Row = RosterData.Rows[RowNum];
// Build the array of searchnames
string[] Names = new string[1];
Names[0] = Row["search_name1"].ToString();
for (int i = 2; i <= 4; i++)
{
string col = "search_name" + i.ToString();
if ((!Row[col].Equals(DBNull.Value)) && (Row[col].ToString() != ""))
{
Array.Resize(ref Names, Names.Length + 1);
Names[Names.GetUpperBound(0)] = Row[col].ToString();
}
}
// Add the person to the return array
PeopleToReturn[Count - 1] = new Person(Row["Setnb"].ToString(), Row["fname"].ToString(),
Row["mname"].ToString(), Row["lname"].ToString(), false,
Names, Row["query"].ToString());
}
return PeopleToReturn;
}
}
}
}