Example #1
0
        // 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);
        }
Example #3
0
        // 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));
        }
Example #4
0
        // 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));
        }