コード例 #1
0
ファイル: ChannelController.cs プロジェクト: Gavamot/FTPSync
        private IHttpActionResult SetAuto(int brigadeCode, AutoLoadStatus status)
        {
            var val = VideoReg.UpdateChannelAuto(brigadeCode, status);

            switch (val) // Устанавливаем значение в БД
            {
            case UpdateEntetyStatus.notExist: return(BadRequest("The video registrator not exsist."));

            case UpdateEntetyStatus.notUpdate: return(BadRequest("Channel auto the value is the same."));

            case UpdateEntetyStatus.updated:
            {
                // Ставил либо снимаем задачу
                if (status == AutoLoadStatus.on)
                {
                    AutoLoadChannelTaskManager.Instance.SetOnAutoload(brigadeCode);
                }
                else
                {
                    AutoLoadChannelTaskManager.Instance.SetOffAutoload(brigadeCode);
                }
                return(Ok());
            };

            default: return(BadRequest("Unknown error"));
            }
        }
コード例 #2
0
        public bool SyncChannelsByPeriod(VideoReg video, DateInterval interval)
        {
            var cts  = new CancellationTokenSource();
            var task = new Task(() =>
            {
                using (var ftp = FtpLoader.Start(video.FtpSettings))
                {
                    try
                    {
                        // Загружаем данные за необходимый интревал
                        // video.BrigadeCode, video.ChannelFolder, channelFolder
                        string localRoot = Path.Combine(channelFolder, video.BrigadeCode.ToString());
                        ftp.DownloadFilesByInterval(interval, video.ChannelFolder, localRoot, cts);
                    }
                    catch (OperationCanceledException e)
                    {
                        logger.Info(e, $"{video.BrigadeCode}  [{interval}] operation canseled");
                    }
                    catch (Exception e)
                    {
                        logger.Error(e);
                    }
                }

                // Сннимаем задачу из списка задач
                lock (tasksLock)
                {
                    tasks.RemoveAll(t =>
                                    t.BrigadeCode == video.BrigadeCode &&
                                    t.Interval == interval);
                }
            }, cts.Token);

            ChannelTask newTask = new ChannelTask
            {
                BrigadeCode = video.BrigadeCode,
                Interval    = interval,
                Task        = task,
                Cts         = cts
            };

            lock (tasksLock)
            {
                // Проверем выполняется ли в данный момент аналогичная задача если да то не надо ее дублировать
                ChannelTask oldTask = tasks.FirstOrDefault(x =>
                                                           x.BrigadeCode == video.BrigadeCode &&
                                                           x.Interval == interval);
                if (oldTask != null)
                {
                    logger.Warn($"SyncChannelsByPeriod({video.BrigadeCode}, {interval}) [EXECUTION-MISS]");
                    return(false);
                }
                // Ставим задачу на выполнение
                tasks.Add(newTask);
                newTask.Task.Start();
            }

            logger.Info($"SyncChannelsByPeriod({video.BrigadeCode}, {interval}) [EXECUTION]");
            return(true);
        }
コード例 #3
0
        static void TestOrm()
        {
            using (var db = new DataContext())
            {
                db.Camera.Load();
                db.VideoReg.Load();
                foreach (var vid in db.VideoReg.Local)
                {
                    Console.WriteLine(vid.ToString());
                }
                var v = new VideoReg
                {
                    BrigadeCode      = 60,
                    Ip               = "123",
                    User             = "******",
                    Password         = "******",
                    VideoFolder      = "video",
                    ChannelFolder    = "channel",
                    ChannelAutoLoad  = AutoLoadStatus.on,
                    ChannelTimeStamp = DateTime.Now
                };

                var c1 = new Camera
                {
                    VideoReg      = v,
                    Num           = 1,
                    VideoRegId    = 1,
                    AutoLoadVideo = 0,
                    TimeStamp     = DateTime.Now,
                };
                var c2 = new Camera
                {
                    VideoReg      = v,
                    Num           = 2,
                    AutoLoadVideo = 0,
                    VideoRegId    = 1,
                    TimeStamp     = DateTime.Now
                };
                v.Camers = new List <Camera> {
                    c1, c2
                };
                db.VideoReg.Add(v);
                db.SaveChanges();
            }

            Console.WriteLine("----------------------------------------------------");

            using (var db = new DataContext())
            {
                db.Camera.Load();
                db.VideoReg.Load();
                foreach (var v in db.VideoReg.Local)
                {
                    Console.WriteLine(v.ToString());
                }
            }
        }
コード例 #4
0
        public IHttpActionResult Update(VideoReg videoReg)
        {
            var res = regRep.Update(videoReg);

            if (res == UpdateEntetyStatus.updated)
            {
                return(Ok());
            }
            return(BadRequest("Video registrator not found."));
        }
コード例 #5
0
        public void CancelTask(VideoReg video, DateInterval interval)
        {
            lock (tasksLock)
            {
                // Отменяем задачу
                var t = tasks.First(x => x.BrigadeCode == video.BrigadeCode && x.Interval == interval);
                t.Cts.Cancel();

                // Удаляем задачу из списка
                tasks.Remove(t);
            }
        }
コード例 #6
0
ファイル: ChannelController.cs プロジェクト: Gavamot/FTPSync
        public IHttpActionResult CancelTask([FromBody] ChannelIntervalModel model)
        {
            VideoReg reg = regRep.Get(model.BrigadeCode);

            if (reg == null)
            {
                return(BadRequest($"The video registrator with brigadeCode={model.BrigadeCode} was not found"));
            }

            // Выполнение операции
            ChannelTaskManager.Instance.CancelTask(reg, model.Interval);
            return(Ok());
        }
コード例 #7
0
ファイル: VideoController.cs プロジェクト: Gavamot/FTPSync
        public IHttpActionResult SyncByPeriod([FromBody] VideoIntervalModel model)//(int brigadeCode, string start, string end)
        {
            VideoReg reg = regRep.Get(model.BrigadeCode);

            if (reg == null)
            {
                return(BadRequest($"The video registrator with brigadeCode={model.BrigadeCode} was not found"));
            }
            // Выполнение операции
            if (VideoTaskManager.Instance.SyncChannelsByPeriod(reg, model.CameraNum, model.Interval))
            {
                return(Ok());
            }
            return(BadRequest($"{model.BrigadeCode} cam={model.CameraNum}({model.Interval}) - [ALREADY EXECUTE]"));
        }
コード例 #8
0
 public void Add(VideoReg videoReg)
 {
     using (var db = new DataContext())
     {
         videoReg.Camers = new List <Camera>();
         // Добавляем сразу 10 камер
         for (int i = 0; i < 10; i++)
         {
             var cam = new Camera {
                 Num = i
             };
             videoReg.Camers.Add(cam);
         }
         db.VideoReg.Add(videoReg);
         db.SaveChanges();
     }
 }
コード例 #9
0
        public UpdateEntetyStatus Delete(int brigadeCode)
        {
            using (var db = new DataContext())
            {
                VideoReg reg = db.VideoReg
                               .Include(x => x.Camers) // Для каскадного удаления
                               .FirstOrDefault(x => x.BrigadeCode == brigadeCode);

                if (reg == null)
                {
                    return(UpdateEntetyStatus.notExist);
                }

                db.VideoReg.Remove(reg);
                db.SaveChanges();
                return(UpdateEntetyStatus.updated);
            }
        }
コード例 #10
0
 public UpdateEntetyStatus Update(VideoReg videoReg)
 {
     using (var db = new DataContext())
     {
         var v = db.VideoReg.FirstOrDefault(x => x.BrigadeCode == videoReg.BrigadeCode);
         if (v == null)
         {
             return(UpdateEntetyStatus.notExist);
         }
         v.VideoFolder         = videoReg.VideoFolder;
         v.BrigadeCode         = videoReg.BrigadeCode;
         v.Ip                  = videoReg.Ip;
         v.VideoFolder         = videoReg.VideoFolder;
         v.ChannelAutoLoad     = videoReg.ChannelAutoLoad;
         v.ChannelTimeStamp    = videoReg.ChannelTimeStamp;
         v.UpdateChannelValues = videoReg.UpdateChannelValues;
         v.ValuesFile          = videoReg.ValuesFile;
         v.Password            = videoReg.Password;
         v.User                = videoReg.User;
         db.SaveChanges();
     }
     return(UpdateEntetyStatus.updated);
 }
コード例 #11
0
 public IHttpActionResult Add(VideoReg videoReg)
 {
     regRep.Add(videoReg);
     return(Ok());
 }
コード例 #12
0
        public bool SetOn(VideoReg reg)
        {
            var cts = new CancellationTokenSource();
            // Задача постоянного обновления кеша данных с приборов
            var task = new Task(() =>
            {
                logger.Info($"Task [{reg.BrigadeCode}] autoupdate device values was started");
                if (string.IsNullOrEmpty(reg.ValuesFile))
                {
                    logger.Info($"Task [{reg.BrigadeCode}] autoupdate device values. File name is uncorrect.");
                    DeleteTask(reg.BrigadeCode);
                    return;
                }
                using (var ftp = FtpLoader.Start(reg.FtpSettings))
                {
                    while (!cts.IsCancellationRequested)
                    {
                        string strJson = "";
                        try
                        {
                            strJson = ftp.DownloadFile(reg.ValuesFile);
                        }
                        catch (Exception e)
                        {
                            logger.Error(e, $"Task [{reg.BrigadeCode}] autoupdate device values. Faild load file {reg.ValuesFile} [ERROR]");
                        }
                        BrigadeChannelValue obj = null;
                        try
                        {
                            obj = JsonConvert.DeserializeObject <BrigadeChannelValue>(strJson);
                        }
                        catch (Exception e)
                        {
                            logger.Error(e, $"Task [{reg.BrigadeCode}] autoupdate device values. Faild load file {reg.ValuesFile} [ERROR]");
                            return;
                        }

                        if (obj.BrigadeCode != reg.BrigadeCode)
                        {
                            logger.Error($"[IMPORTANT] Task [{reg.BrigadeCode}]  Database data not equals device brigadeCode [ERROR]");
                        }

                        DeviceDataCash.Instance.Set(obj);
                    }
                }
                // Если задача была отменена убераем ее с выполнения
                DeleteTask(reg.BrigadeCode);
                logger.Info($"Task [{reg.BrigadeCode}] autoupdate device values was canceled");
            }, cts.Token);

            DeviceDataTask newTask = new DeviceDataTask
            {
                BrigadeCode = reg.BrigadeCode,
                Task        = task,
                Cts         = cts
            };

            newTask.Task.Start();
            AddTask(newTask);
            logger.Info($"OnAutoUpdateChannelValue({reg.BrigadeCode}) [EXECUTION]");
            return(true);
        }