bingo/sqlserver/Source/BingoUtils.cs (175 lines of code) (raw):

using System; using System.IO; using System.Data; using System.Collections.Generic; using Microsoft.SqlServer.Server; using System.Data.SqlTypes; using System.Data.SqlClient; using System.Text; using indigo.SqlAttributes; using System.Diagnostics; using System.Threading; namespace indigo { public class BingoSqlUtils { public static void ExecNonQuery (SqlConnection conn, string command, params object[] args) { string query = String.Format(command, args); using (SqlCommand cmd = new SqlCommand(query, conn)) { cmd.CommandTimeout = 3600 * 10; cmd.ExecuteNonQuery(); } } public static SqlDataReader ExecReader (SqlConnection conn, string command, params object[] args) { string query = String.Format(command, args); using (SqlCommand cmd = new SqlCommand(query, conn)) { cmd.CommandTimeout = 3600 * 10; return cmd.ExecuteReader(); } } public static void ExecNonQueryNoThrow (SqlConnection conn, string command, params object[] args) { try { ExecNonQuery(conn, command, args); } catch (SqlException) { } catch (Exception ex) { BingoLog.logMessage("Exception in ExecNonQueryNoThrow: {0} in {1}:\n{2}", ex.Message, ex.Source, ex.StackTrace); } } public static object ExecObjQuery (SqlConnection conn, string command, params object[] args) { using (SqlCommand cmd = new SqlCommand(String.Format(command, args), conn)) { cmd.CommandTimeout = 3600 * 10; object obj = cmd.ExecuteScalar(); if (obj == DBNull.Value) return null; return obj; } } public static int? ExecIntQuery (SqlConnection conn, string command, params object[] args) { object obj = ExecObjQuery(conn, command, args); if (obj == null) return null; return Convert.ToInt32(obj); } public static string ExecStringQuery (SqlConnection conn, string command, params object[] args) { object obj = ExecObjQuery(conn, command, args); if (obj == null) return null; return Convert.ToString(obj); } public static List<object> ExecQuery (SqlConnection conn, string command, params object[] args) { using (SqlCommand cmd = new SqlCommand(String.Format(command, args), conn)) { cmd.CommandTimeout = 3600; using (SqlDataReader reader = cmd.ExecuteReader()) { if (!reader.Read()) return null; List<object> ret = new List<object>(); for (int i = 0; i < reader.FieldCount; i++) ret.Add(reader[i]); return ret; } } } public static int GetTableObjectID (SqlConnection conn, string table_name) { int? id = ExecIntQuery(conn, "SELECT OBJECT_ID('{0}', 'U')", table_name); if (id == null) throw new Exception("Cannot get ID for table " + table_name); return id.Value; } public static int GetDatabaseID (SqlConnection conn, string database_name) { int? id = ExecIntQuery(conn, "select DB_ID('{0}')", database_name); if (id == null) throw new Exception("Cannot get ID for database " + database_name); return id.Value; } public static string GetConnectionSchema (SqlConnection conn) { return ExecStringQuery(conn, "SELECT SCHEMA_NAME()"); } [SqlFunction] [BingoSqlFunction] public static SqlString ReadFileAsText (SqlString filename) { return File.ReadAllText(filename.Value); } [SqlFunction] [BingoSqlFunction] public static SqlBinary ReadFileAsBinary (SqlString filename) { return File.ReadAllBytes(filename.Value); } [SqlFunction] [BingoSqlFunction(access_level = AccessLevelKind.None)] public static void _ForceGC () { GC.Collect(); GC.WaitForPendingFinalizers(); } } public class BingoLog { static object sync_obj = new object(); // Functionality to detect moment when assembly gets unloaded static BingoLog _log_instance = new BingoLog(); ~BingoLog () { logMessage("Log has been released"); } [SqlFunction] [BingoSqlFunction(access_level = AccessLevelKind.None)] public static void _WriteLog (SqlString message) { try { logMessage(message.Value); SqlContext.Pipe.Send(String.Format( "Message '{0}' should be saved to '{1}'", message.Value, getLogFileName())); } catch (Exception ex) { SqlContext.Pipe.Send(String.Format(@"Error: Cannot save message '{0}' to '{1}'", message.Value, getLogFileName())); SqlContext.Pipe.Send(String.Format("Exception '{0}' in '{1}':\n{2}", ex.Message, ex.Source, ex.StackTrace)); } } public static string getLogFileName () { return System.IO.Path.GetTempPath() + "bingo_sql_server.log"; } public static void logMessageWithThrow (string message, params object[] args) { lock (sync_obj) { try { using (StreamWriter sw = System.IO.File.AppendText(getLogFileName())) { BingoSqlUtils._ForceGC(); string logLine = String.Format( "{0:G}: {1}", DateTime.Now, String.Format(message, args)); sw.WriteLine(logLine); double size_mb = GC.GetTotalMemory(false) / 1024 / 1024.0; int processId = Process.GetCurrentProcess().Id; int threadId = Thread.CurrentThread.ManagedThreadId; Process proc = Process.GetCurrentProcess(); double proc_size_mb = proc.PrivateMemorySize64 / 1024 / 1024.0; sw.WriteLine(String.Format(" GC Memory: {0:0.00} Mb. Process id: {1}. Thread id: {2}. AppDomain: {3}. PrivateMemory: {4:0.00} Mb", size_mb, processId, threadId, AppDomain.CurrentDomain.FriendlyName, proc_size_mb)); } } catch { } } } public static void logMessage (string message, params object[] args) { try { logMessageWithThrow(message, args); } catch { } } } // Profiling timer public class BingoTimer { UInt64 _start; string _name; public BingoTimer (string name) { _start = BingoCore.lib.bingoProfNanoClock(); _name = name; } public void end () { UInt64 end = BingoCore.lib.bingoProfNanoClock(); BingoCore.lib.bingoProfIncTimer(_name, end - _start); } } }