// Saves the key frame by converting the string attrubute to a Jpeg image file on the server and // Returns the file path to where it was saved. private static string SaveKeyImage(PerSecondStat stat) { string modifiedTimestamp = stat.DateTime.Substring(0, 19).Replace(" ", "").Replace(":", "").Replace("-", ""); string folderPath = DatabasePerSecondStat.FRM_JPG_FOLDER_PATH + stat.CameraKey; DirectoryInfo outputDirectory = Directory.CreateDirectory(folderPath); string fullFilePath = Path.Combine(outputDirectory.FullName, "stat_frm" + modifiedTimestamp + ".jpg"); bool success = ImageDecodingTools.SaveBase64StringToFile(stat.FrameAsJpg, fullFilePath); if (success) { return(fullFilePath); } return(null); }
public bool PersistNewPerSecondStats(List <PerSecondStat> distinctStats) { // Define the bulk insert query without any values to insert. string bulkInsertCommand = $"INSERT INTO {DatabasePerSecondStat.TABLE_NAME} " + $"({DatabasePerSecondStat.CAMERA_ID_LABEL},{DatabasePerSecondStat.NUM_DETECTED_OBJECTS_LABEL}, " + $"{DatabasePerSecondStat.DATE_TIME_LABEL},{DatabasePerSecondStat.HAS_SAVED_IMAGE_LABEL}) VALUES "; // Append the values one by one to the bulk insert query. PerSecondStat lastStat = distinctStats.Last(); foreach (PerSecondStat stat in distinctStats) { string cameraId = stat.CameraId.ToString(); string numDetectedObjects = stat.NumTrackedPeople.ToString(); string hasImage = "0"; if (stat.HasSavedImage) { hasImage = "1"; } bulkInsertCommand += $"({cameraId},{numDetectedObjects},'{stat.DateTime}',{hasImage})"; if (stat != lastStat) { bulkInsertCommand += ","; } } // Open connection and execute bulk insert command. using (MySqlConnection conn = GetConnection()) { conn.Open(); try { MySqlCommand cmd = new MySqlCommand(bulkInsertCommand, conn); cmd.ExecuteNonQuery(); } catch (Exception e) { Console.WriteLine(e); // Write to Log return(false); // This is probably not going to be executed... } } return(true); }
// Used for processing a request for a DataMessage with all PerSecondStat objects within a TimeInterval. public DataMessage RetrievePerSecondStatsBetweenInterval(TimeInterval verifiedTimeInterval) { List <DatabasePerSecondStat> queryResults = _dbQueryService.GetStatsFromInterval(verifiedTimeInterval); PerSecondStat[] stats = new PerSecondStat[queryResults.Count()]; int x = 0; foreach (DatabasePerSecondStat second in queryResults) { PerSecondStat temp = new PerSecondStat(second.DateTime.ToString("yyyy-MM-dd HH:mm:ss"), second.CameraId, second.NumDetectedObjects, second.HasSavedImage); stats[x] = temp; x++; } return(new DataMessage("SYSTEM_RESPONSE", stats)); }
// Once a DataMessage is verified, this method allows persisting all contents (PerSecondStat objects) into the database. public bool StoreStatsFromDataMessage(DataMessage verifiedMessage) { List <DatabasePerSecondStat> dbSecondsToPersist = new List <DatabasePerSecondStat>(); // Remove any possible duplicates. List <PerSecondStat> distinctPerSecondStats = verifiedMessage.RealTimeStats.Distinct().ToList(); for (int y = 0; y < distinctPerSecondStats.Count; y++) { PerSecondStat stat = distinctPerSecondStats[y]; int cameraId = _dbQueryService.GetCameraIdFromKey(stat.CameraKey); // Only persist PerSecondStats from valid Cameras (with valid CameraKeys). if (cameraId > 0) { DatabasePerSecondStat dbPerSecondStat = new DatabasePerSecondStat(); dbPerSecondStat.CameraId = cameraId; dbPerSecondStat.DateTime = MySqlDateTimeConverter.ToDateTime(stat.DateTime); dbPerSecondStat.HasSavedImage = stat.HasSavedImage; dbPerSecondStat.PerHourStatId = null; dbPerSecondStat.NumDetectedObjects = stat.NumTrackedPeople; dbPerSecondStat.DateTimeReceived = DateTime.Now; // If PerSecondStat has a key frame. if (stat.HasSavedImage && String.IsNullOrWhiteSpace(stat.FrameAsJpg) == false) { // Save it to the server. dbPerSecondStat.FrameJpgPath = SaveKeyImage(stat); } else { dbPerSecondStat.HasSavedImage = false; dbPerSecondStat.FrameJpgPath = null; } dbSecondsToPersist.Add(dbPerSecondStat); } } return(_dbQueryService.PersistNewPerSecondStats(dbSecondsToPersist)); }