SafeDispatch/SafeMobileLIB_DLL/DBmanagers/DBmanager.cs

201 lines
5.6 KiB
C#
Raw Normal View History

2024-02-22 16:43:59 +00:00
using System;
using System.Collections.Generic;
using System.Text;
using Npgsql;
using System.Data;
using System.Threading;
namespace SafeMobileLib
{
public class DBmanager
{
public NpgsqlConnection cn;
private string p_server;
private string p_dbname;
private string p_user;
private string p_password;
private string p_port;
String MyConString = "";
public static int countConn = 0;
public DBmanager(string p_server, string p_dbname, string p_user, string p_password, string p_port)
{
this.p_server = p_server;
this.p_dbname = p_dbname;
this.p_user = p_user;
this.p_password = p_password;
this.p_port = p_port;
MyConString = getConnectionString();
}
public void InitConnection()
{
cn = new NpgsqlConnection();
cn.ConnectionString = getConnectionString();
try
{
cn.Open();
Interlocked.Increment(ref countConn); //countConn = countConn + 1;
Utils.WriteLine($"Open a new connection. Active connections : {countConn}", ConsoleColor.DarkGreen);
if (countConn > 280)
Utils.WriteLine($"Max limit of active connections is abount to be reached: {countConn}/300", ConsoleColor.Red);
}
catch (Exception o)
{
if (cn != null)
{
cn.Close();
}
if (o.ToString().Contains("The connection pool has been exhausted"))
{
NpgsqlConnection.ClearAllPools();
countConn = 0;
}
}
}
public sqlResponse RunCommand(string command)
{
sqlResponse toReturn = sqlResponse.done;
try
{
using (NpgsqlConnection connection = new NpgsqlConnection())
{
connection.ConnectionString = getConnectionString();
connection.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(command, connection))
{
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ee)
{
Console.WriteLine(ee.Message + " " + ee.StackTrace + " " + ee.Source, ConsoleColor.Red);
toReturn = sqlResponse.SQLerror;
}
return toReturn;
}
public int GetInt32Result(string command)
{
string result = GetStringResult(command);
if (result == string.Empty)
return -1;
return Int32.Parse(result);
}
public string GetStringResult(string command)
{
string result = string.Empty;
try
{
using (NpgsqlConnection connection = new NpgsqlConnection())
{
connection.ConnectionString = getConnectionString();
connection.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(command, connection))
{
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
reader.Read();
result = reader.GetValue(0).ToString();
}
}
}
}
catch (Exception ee)
{
if(!ee.ToString().Contains("No row is available"))
Console.WriteLine(ee.ToString(), ConsoleColor.Red);
}
return result;
}
public int CommandTimeout = 60;
public String getConnectionString()
{
return String.Format("Server={0};Port={1};" +
"User Id={2};Password={3};Database={4};Pooling=true;MinPoolSize=30;MaxPoolSize=300;Timeout=15;CommandTimeout={5};",
p_server, p_port, p_user, p_password, p_dbname, CommandTimeout);
}
public void InitConnectionHistoryReport()
{
cn = new NpgsqlConnection();
cn.ConnectionString = getConnectionString();
try
{
if (cn != null && cn.State == System.Data.ConnectionState.Closed)
cn.Open();
}
catch (Exception o)
{
if (cn != null)
{
cn.Close();
}
throw new ArgumentException(o.Message.ToString());
}
}
public void CloseConnection()
{
try
{
if (cn != null)
{
cn.Close();
Interlocked.Decrement(ref countConn); //countConn = countConn - 1;
if (countConn > 280)
{
Utils.WriteLine("CLOSED : " + countConn, ConsoleColor.Blue);
NpgsqlConnection.ClearAllPools();
countConn = 0;
}
}
}
catch(Exception ex)
{
Utils.WriteLine(ex.ToString(), ConsoleColor.Magenta);
}
}
}
public enum sqlResponse
{
done,
SQLerror,
noUpdate
}
}