bingo/sqlserver/Source/BingoIndexID.cs (85 lines of code) (raw):
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Text.RegularExpressions;
namespace indigo
{
public class BingoIndexID
{
public int table_id;
public int database_id;
private string name; // Name for logging
// Detect database, schema, and table; some from table_name, some from SQL connection
public BingoIndexID (SqlConnection connection, string table_name)
{
table_id = BingoSqlUtils.GetTableObjectID(connection, table_name);
string database = null, schema = null, table = null;
parseTableName(table_name, ref database, ref schema, ref table);
if (database == null)
database = connection.Database;
database_id = BingoSqlUtils.GetDatabaseID(connection, database);
name = table_name;
}
public BingoIndexID (int table_id, int database_id)
{
this.table_id = table_id;
this.database_id = database_id;
name = String.Format("object_id = {0}, database_id = {1}", table_id, database_id);
}
public bool Equals (BingoIndexID other)
{
return table_id == other.table_id && database_id == other.database_id;
}
private void parseTableName (string table_name, ref string database, ref string schema, ref string table)
{
Match match = Regex.Match(table_name, @"((\[(.*)\])|(.*))\.((\[(.*)\])|(.*))\.((\[(.*)\])|(.*))");
if (match != Match.Empty)
{
database = (match.Groups[3].Length > 0 ? match.Groups[3].Value : match.Groups[4].Value);
schema = (match.Groups[7].Length > 0 ? match.Groups[7].Value : match.Groups[8].Value);
table = (match.Groups[11].Length > 0 ? match.Groups[11].Value : match.Groups[12].Value);
}
else
{
match = Regex.Match(table_name, @"((\[(.*)\])|(.*))\.((\[(.*)\])|(.*))");
if (match != Match.Empty)
{
schema = (match.Groups[3].Length > 0 ? match.Groups[3].Value : match.Groups[4].Value);
table = (match.Groups[7].Length > 0 ? match.Groups[7].Value : match.Groups[8].Value);
match = Match.Empty;
}
else
{
match = Regex.Match(table_name, @"\[(.*)\]");
if (match != Match.Empty)
table = match.Groups[1].Value;
else
table = table_name;
}
}
}
public string SchemaName (SqlConnection connection)
{
return BingoSqlUtils.ExecStringQuery(connection,
@"SELECT QUOTENAME(OBJECT_SCHEMA_NAME({0}, {1}))", table_id, database_id);
}
public string DatabaseName (SqlConnection connection)
{
return BingoSqlUtils.ExecStringQuery(connection,
@"SELECT QUOTENAME(DB_NAME({0}))", database_id);
}
public string FullTableName (SqlConnection connection)
{
return BingoSqlUtils.ExecStringQuery(connection,
@"SELECT QUOTENAME(DB_NAME({0})) + N'.' +
QUOTENAME(OBJECT_SCHEMA_NAME({1}, {0})) + N'.' +
QUOTENAME(OBJECT_NAME({1}, {0}))", database_id, table_id);
}
public string InformationName ()
{
return String.Format("{0} (db_id={1}, obj_id={2})", name, database_id, table_id);
}
public string InformationName (SqlConnection connection)
{
return String.Format("{0} (db_id={1}, obj_id={2})", FullTableName(connection), database_id, table_id);
}
}
}