public static IEnumerable FindPHkeysAndSlots(SqlInt16 partsnap, SqlInt16 fofsnap, SqlString temp_partid_table_name, SqlInt32 numparts)
{
//string temp_partid_table = "#temp_partid_list";
List<PhkeySlot> keysAndSlots = new List<PhkeySlot>();
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
connection.Open();
string getFoFGroupIDsCommandString = "select partid from " + temp_partid_table_name.ToString();
SqlCommand getFoFGroupIDsListCommand = new SqlCommand(getFoFGroupIDsCommandString, connection);
SqlDataReader getFOFGroupIDsReader = getFoFGroupIDsListCommand.ExecuteReader();
Int64[] partids = new Int64[(int) numparts];
int numlines = 0;
while (getFOFGroupIDsReader.Read())
{
partids[numlines] = Int64.Parse(getFOFGroupIDsReader["partid"].ToString());
++numlines;
}
getFOFGroupIDsReader.Close();
// Find the index blocks we need to look in
HashSet<Int64> blocks = new HashSet<Int64>();
foreach (Int64 id in partids)
{
blocks.Add((id - 1) / 1024 / 1024);
}
//means we want all snaps
string rawCommand = "";
if (partsnap < 0)
{
rawCommand = "select a.snap, a.phkey, a.slot from particleDB.dbo.index{0} a, " + temp_partid_table_name.ToString() + " b "
+ " where a.partid = b.partid";
}
else
{
rawCommand = "select a.snap, a.phkey, a.slot from particleDB.dbo.index{0} a, " + temp_partid_table_name.ToString() + " b "
+ " where a.partid = b.partid and a.snap = @partsnap";
}
foreach (Int64 blockID in blocks)
{
string joinFoFGroupIndexCommandString = string.Format(rawCommand, blockID);
SqlCommand joinFofGroupIndexCommand = new SqlCommand(joinFoFGroupIndexCommandString, connection);
SqlParameter partsnapParam = new SqlParameter("@partsnap", System.Data.SqlDbType.SmallInt);
partsnapParam.Value = partsnap;
joinFofGroupIndexCommand.Parameters.Add(partsnapParam);
SqlDataReader joinReader = joinFofGroupIndexCommand.ExecuteReader();
while (joinReader.Read())
{
int snap = Int32.Parse(joinReader["snap"].ToString());
int phkey = Int32.Parse(joinReader["phkey"].ToString());
short slot = Int16.Parse(joinReader["slot"].ToString());
PhkeySlot current = new PhkeySlot(snap, phkey, slot);
keysAndSlots.Add(current);
}
joinReader.Close();
}
}
return keysAndSlots;
}