using System; using System.Collections.Generic; using System.Text; using Npgsql; using System.Collections; namespace SafeMobileLib { public class DBrecordingsManager:DBmanager { public DBrecordingsManager(string p_server, string p_dbname, string p_user, string p_password, string p_port) : base(p_server, p_dbname, p_user, p_password, p_port) { } public List GetAllRecordingsForGW(int gwID, int radiogwID,Int32 sc_id,Int64 start_time,Int64 stop_time,Int32 call_type) { List retList = new List(); try { using (NpgsqlConnection connection = new NpgsqlConnection()) { connection.ConnectionString = getConnectionString(); connection.Open(); String glwhere = $"WHERE gw_id = {gwID} and radiogw_id = {radiogwID}"; if (sc_id != 0) glwhere += $" AND dispatcher_id= {sc_id} AND typesd=0"; if (start_time != 0) glwhere += $" AND time_start >= {start_time} AND time_stop <= {stop_time}"; if (call_type != 10) glwhere += $" AND calltype = {call_type}"; Console.WriteLine("Glwhere:" + glwhere); string command = "SELECT rec_id, time_start, time_stop, s.imei::int as subscriber_id, hdd_file_path, gw_id,radiogw_id,typesd,calltype " + " ,g.cps_id as group_id, dispatcher_id " + "FROM \"VoiceRecordings\" vr " + " LEFT JOIN subscriber s on vr.subscriber_id = s.sc_id " + " LEFT JOIN groups g on vr.group_id = g.id " + glwhere + " ORDER BY time_start desc " + " LIMIT 100"; using (NpgsqlCommand cmd = new NpgsqlCommand(command, connection)) { Console.WriteLine(cmd.CommandText); using (NpgsqlDataReader dr = cmd.ExecuteReader()) { if (dr != null) retList = GetRecordingList(dr); } } } } catch (Exception ex) { Console.WriteLine("GetAllRecordingsInInterval() :" + ex.Message); } return retList; } public List GetAllRecordingsForSD(int userID, Int32 sc_id, Int64 start_time, Int64 stop_time) { List retList = new List(); try { using (NpgsqlConnection connection = new NpgsqlConnection()) { connection.ConnectionString = getConnectionString(); connection.Open(); //String glwhere = "WHERE gw_id=0 and subscriber_id=" + userID.ToString(); String glwhere = "WHERE gw_id=0 AND user_id = {userID}"; if (sc_id != 0) glwhere += $" AND radiogw_id = {sc_id}"; if (start_time != 0) glwhere += $" AND time_start >= {start_time} AND time_stop <= {stop_time}"; string command = "SELECT rec_id, time_start, time_stop, s.imei::int as subscriber_id, hdd_file_path, gw_id,radiogw_id,typesd,calltype " + ", g.cps_id as group_id, dispatcher_id " + " FROM \"VoiceRecordings\" vr " + " LEFT JOIN subscriber s on vr.subscriber_id = s.sc_id " + " LEFT JOIN groups g on vr.group_id = g.id " + glwhere + " ORDER BY time_start desc" + " LIMIT 100"; using (NpgsqlCommand cmd = new NpgsqlCommand(command, connection)) { Console.WriteLine(cmd.CommandText); using (NpgsqlDataReader dr = cmd.ExecuteReader()) { if (dr != null) retList = GetRecordingList(dr); } } } } catch (Exception ex) { Console.WriteLine($"GetAllRecordingsInInterval() : {ex.Message}"); } return retList; } private List GetRecordingList(NpgsqlDataReader dr) { List retList = new List(); if (dr == null) return retList; while (dr.Read()) { Int64 rec_id = Convert.ToInt64(dr["rec_id"]); Int64 time_start = Convert.ToInt64(dr["time_start"]); Int64 time_stop = Convert.ToInt64(dr["time_stop"]); int? subsc_id = (dr["subscriber_id"] == DBNull.Value) ? null : (int?)(dr["subscriber_id"]); ; string hdd_file_path = dr["hdd_file_path"].ToString(); int gw_id = Convert.ToInt32(dr["gw_id"]); int radiogw_id = Convert.ToInt32(dr["radiogw_id"]); int typesd = Convert.ToInt32(dr["typesd"]); int calltype = Convert.ToInt32(dr["calltype"]); int? dispatcher_id = (dr["dispatcher_id"] == DBNull.Value) ? null : (int?)(dr["dispatcher_id"]); int? group_id = (dr["group_id"] == DBNull.Value) ? null : (int?)(dr["group_id"]); Recording obj = new Recording(rec_id, time_start, time_stop, DateTime.Now, DateTime.Now, hdd_file_path, subsc_id, gw_id, radiogw_id, typesd, calltype, group_id, dispatcher_id); retList.Add(obj); } return retList; } //FROM "VoiceRecordings" where ((subscriber_id=101 and gw_id=4 and radiogw_id=16)or(subscriber_id=2 and gw_id=1 and radiogw_id=8)) and time_start>1370012345 // parameters order // 0 typesd 0 =gateway 1 = dispather // 1 gw_id // 2 radiogw_id //sc_id from the field in case o dispatcher // 3 subscriber_id // user_id of dispatcher public List GetAllRecordingsForDispatcherAndAssignGateway(ArrayList parameters, Int64 start_time, Int64 stop_time, Int32 useridx) { List retList = new List(); try { Int32 index = 0; Int32 typesd = 0; Int32 gw_id = 0; Int32 radiogw_id = 0; Int32 subcriber_id = 0; String glwhere = ""; while (index= {start_time} and time_stop <= {stop_time}"; Console.WriteLine("Glwhere:" + glwhere); string command = "SELECT rec_id, time_start, time_stop, s.imei::int as subscriber_id, hdd_file_path, gw_id,radiogw_id,typesd,calltype" + " , g.cps_id as group_id, dispatcher_id " + " FROM \"VoiceRecordings\" vr " + " LEFT JOIN subscriber s on vr.subscriber_id = s.sc_id " + " LEFT JOIN groups g on vr.group_id = g.id " + glwhere + " ORDER BY time_start desc " + " LIMIT 500"; using (NpgsqlConnection connection = new NpgsqlConnection()) { connection.ConnectionString = getConnectionString(); connection.Open(); using (NpgsqlCommand cmd = new NpgsqlCommand(command, connection)) { Console.WriteLine(cmd.CommandText); using (NpgsqlDataReader dr = cmd.ExecuteReader()) { if (dr != null) retList = GetRecordingList(dr); } } } } catch (Exception ex) { Console.WriteLine($"GetAllRecordingsInInterval() : {ex.Message}"); } return retList; } /// /// to allow the foreign keys to be used we need to add one more column (user_id) and also allow null values for /// subscriber_id and group_id /// /// ALTER TABLE "VoiceRecordings" ADD COLUMN dispatcher_id integer NULL; // add column dispatcher_id /// ALTER TABLE "VoiceRecordings" ALTER COLUMN subscriber_id DROP NOT NULL; // remove not null from subscribe_id /// ALTER TABLE "VoiceRecordings" ALTER COLUMN group_id DROP NOT NULL; // remove not null from group_id /// /// /// public sqlResponse addRecording(Recording rec) { sqlResponse resp; try { StringBuilder buffer = new StringBuilder(4096); buffer.Append($"INSERT INTO \"VoiceRecordings\" (rec_id, subscriber_id, dispatcher_id, gw_id, radiogw_id, hdd_file_path, time_start, time_stop, typesd, calltype, group_id) "); buffer.Append($"SELECT {rec.id} as rec_id, #subsID# as sc_id, #dispatcherID# AS dispatcher_id, {rec.gwID} as gw_id, {rec.radioGWID} as radiogw_id, '{rec.hddLocation}' as hdd_file_path, {rec.startTime} as time_start, {rec.endTime} as time_stop, {rec.typeSD} as typesd, {rec.calltype} as calltype, #groupID# as group_id"); if (rec.calltype == 0) // dispatcher - radio (private call) { buffer.Replace("#subsID#", $"(SELECT sc_id FROM subscriber WHERE imei = '{rec.subs_imei}')"); buffer.Replace("#dispatcherID#", rec.dispatcher_id.ToString()); buffer.Replace("#groupID#", "null"); } else if (rec.calltype == 1) // dispatcher - radio (group call) { buffer.Replace("#subsID#", "null"); buffer.Replace("#dispatcherID#", rec.dispatcher_id.ToString()); buffer.Replace("#groupID#", $"(SELECT id FROM groups WHERE cps_id = '{rec.group_cpsId}')"); } else if (rec.calltype == 2) // dispatcher - radio (all call) { buffer.Replace("#subsID#", "null"); buffer.Replace("#dispatcherID#", rec.dispatcher_id.ToString()); buffer.Replace("#groupID#", "null"); } else if (rec.calltype == 4) // radio - dispatcher (private call) { buffer.Replace("#subsID#", $"(SELECT sc_id FROM subscriber WHERE imei = '{rec.subs_imei}')"); buffer.Replace("#dispatcherID#", rec.dispatcher_id.ToString()); buffer.Replace("#groupID#", "null"); } else if (rec.calltype == 5) // radio - dispatcher (group call) { buffer.Replace("#subsID#", $"(SELECT sc_id FROM subscriber WHERE imei = '{rec.subs_imei}')"); buffer.Replace("#dispatcherID#", "null"); buffer.Replace("#groupID#", $"(SELECT id FROM groups WHERE cps_id = '{rec.group_cpsId}')"); } else if (rec.calltype == 6) // radio - dispatcher (all call) { buffer.Replace("#subsID#", $"(SELECT sc_id FROM subscriber WHERE imei = '{rec.subs_imei}')"); buffer.Replace("#dispatcherID#", "null"); buffer.Replace("#groupID#", "null"); } using (NpgsqlConnection connection = new NpgsqlConnection()) { connection.ConnectionString = getConnectionString(); connection.Open(); using (NpgsqlCommand cmd = new NpgsqlCommand(buffer.ToString(), connection)) { Console.WriteLine(cmd.CommandText); cmd.ExecuteNonQuery(); } } resp = sqlResponse.done; } catch (Exception ee) { Console.WriteLine(ee.Message + " " + ee.StackTrace + " " + ee.Source); resp = sqlResponse.SQLerror; } return resp; } public string getFilePath(long id) { string filePath =""; try { using (NpgsqlConnection connection = new NpgsqlConnection()) { connection.ConnectionString = getConnectionString(); connection.Open(); string command = $"SELECT hdd_file_path FROM \"VoiceRecordings\" WHERE rec_id={id}"; using (NpgsqlCommand cmd = new NpgsqlCommand(command, connection)) { Console.WriteLine(cmd.CommandText); using (NpgsqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { filePath = reader.GetString(0); } } } } } catch (Exception ex) { Console.WriteLine($"getFilePath() : {ex.Message}"); } return filePath; } } public class Recording { public Int64 id; public long startTime; public long endTime; public DateTime startDateTime; public DateTime endDateTime; public string hddLocation; public int? subs_imei; public int gwID; public int radioGWID; public int typeSD; public int calltype; public int? group_cpsId; public int? dispatcher_id; public int subID; public int Group_ID; public Recording(Int64 _id, long _startTime, long _endTime, DateTime _startDateTime, DateTime _endDateTime, string _hddLocation, int? _subsc_imei, int _gwID, int _radioGWID, int _typeSD, int _calltype, int? _group_cpsId, int? _dispatcher_id) { id = _id; startTime = _startTime; endTime = _endTime; startDateTime = _startDateTime; endDateTime = _endDateTime; hddLocation = _hddLocation; subs_imei = _subsc_imei; gwID = _gwID; radioGWID = _radioGWID; typeSD = _typeSD; calltype = _calltype; group_cpsId = _group_cpsId; dispatcher_id = _dispatcher_id; } } public class RecordingComparer : IComparer { public RecordingComparer() : base() { } int IComparer.Compare(object x, object y) { Recording X = x as Recording; Recording Y = y as Recording; if (X.startTime < Y.startTime) return 1; else if (X.startTime == Y.startTime) return 0; else return -1; } } }