예제 #1
0
 public User GetUserSync(string username)
 {
     using (var audioViewEntities = new AudioViewEntities())
     {
         return((audioViewEntities.Users.FirstOrDefault(x => x.username.ToLower() == username.ToLower()))?.ToInternal());
     }
 }
예제 #2
0
        public async Task <IList <Project> > SearchProjects(string name, string number, DateTime?leftTime, DateTime?rightTime)
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var request = audioViewEntities.Projects.Where(x => true);

                if (!string.IsNullOrWhiteSpace(name))
                {
                    request = request.Where(x => x.Name.ToLower().Contains(name.Trim().ToLower()));
                }
                if (!string.IsNullOrWhiteSpace(number))
                {
                    request = request.Where(x => x.Number.ToLower().Contains(number.Trim().ToLower()));
                }
                if (leftTime != null)
                {
                    request = request.Where(x => x.Created >= leftTime.Value);
                }
                if (rightTime != null)
                {
                    request = request.Where(x => x.Created <= rightTime.Value);
                }
                request = request.Take(50);

                return((await request.Select(x => new
                {
                    Project = x,
                    Readings = x.Readings.Count
                })
                        .OrderByDescending(x => x.Project.Created)
                        .ToListAsync().ConfigureAwait(false))
                       .Select(x => x.Project.ToInternal(x.Readings)).ToList());
            }
        }
예제 #3
0
        public DataStorageMeterListener(Guid id, DateTime started, MeasurementSettings settings)
        {
            Id       = id;
            Settings = settings;
            created  = started;

            initalCreate = Task.Run(async() =>
            {
                try
                {
                    using (var audioViewEntities = new AudioViewEntities())
                    {
                        if (!audioViewEntities.Projects.Any(x => x.Id == id))
                        {
                            audioViewEntities.Projects.Add(new Project()
                            {
                                Id            = id,
                                Created       = started,
                                MinorDBLimit  = settings.MinorDBLimit,
                                MajorDBLimit  = settings.MajorDBLimit,
                                MajorInterval = settings.MajorInterval.Ticks,
                                MinorInterval = settings.MinorInterval.Ticks,
                                Name          = settings.ProjectName,
                                Number        = settings.ProjectNumber
                            });
                            await audioViewEntities.SaveChangesAsync().ConfigureAwait(false);
                        }
                    }
                }
                catch (Exception exp)
                {
                    logger.Warn(exp, "Unable to add project \"{0}\" to database, do we have internet access?", settings.ProjectName);
                }
            });
        }
예제 #4
0
 public async Task <User> GetUser(string username)
 {
     using (var audioViewEntities = new AudioViewEntities())
     {
         return((await audioViewEntities.Users.FirstOrDefaultAsync(
                     x => x.username.ToLower() == username.ToLower()).ConfigureAwait(false))?.ToInternal());
     }
 }
예제 #5
0
        public async Task <List <User> > GetUsers()
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var result = await audioViewEntities.Users.OrderBy(x => x.username).ToListAsync().ConfigureAwait(false);

                return(result.Select(x => x.ToInternal()).ToList());
            }
        }
예제 #6
0
 public async Task CreateUser(User user, string password)
 {
     using (var audioViewEntities = new AudioViewEntities())
     {
         var userObject = user.ToDatabase();
         userObject.passwordSalt = getRandomSalt();
         userObject.password     = generateHash(password, userObject.passwordSalt);
         audioViewEntities.Users.Add(userObject);
         await audioViewEntities.SaveChangesAsync().ConfigureAwait(false);
     }
 }
예제 #7
0
        public async Task DeleteReading(Guid readingId)
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var reading = await audioViewEntities.Readings.Where(x => x.Id == readingId).FirstOrDefaultAsync().ConfigureAwait(false);

                if (reading == null)
                {
                    return;
                }
                audioViewEntities.Readings.Remove(reading);
                audioViewEntities.SaveChanges();
            }
        }
예제 #8
0
        public async Task DeleteProject(Guid projectId)
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var project = await audioViewEntities.Projects.Where(x => x.Id == projectId).FirstOrDefaultAsync().ConfigureAwait(false);

                if (project == null)
                {
                    return;
                }
                audioViewEntities.Projects.Remove(project);
                audioViewEntities.SaveChanges();
            }
        }
예제 #9
0
        public async Task UpdateExpires(string username, DateTime?expires)
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var user = await audioViewEntities.Users.FirstOrDefaultAsync(x => x.username.ToLower() == username.ToLower());

                if (user == null)
                {
                    return;
                }
                user.expires = expires;
                await audioViewEntities.SaveChangesAsync().ConfigureAwait(false);
            }
        }
예제 #10
0
        public async Task DeleteUser(string username)
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var user = await audioViewEntities.Users.FirstOrDefaultAsync(x => x.username.ToLower() == username.ToLower()).ConfigureAwait(false);

                if (user == null)
                {
                    return;
                }
                audioViewEntities.Users.Remove(user);
                await audioViewEntities.SaveChangesAsync().ConfigureAwait(false);
            }
        }
예제 #11
0
        public async Task UpdatePassword(string username, string newPassword)
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var user = await audioViewEntities.Users.FirstOrDefaultAsync(x => x.username.ToLower() == username.ToLower());

                if (user == null)
                {
                    return;
                }
                user.passwordSalt = getRandomSalt();
                user.password     = generateHash(newPassword, user.passwordSalt);
                await audioViewEntities.SaveChangesAsync().ConfigureAwait(false);
            }
        }
예제 #12
0
        public async Task <IList <Reading> > GetReading(Guid projectId)
        {
            IList <Reading> readings = new List <Reading>();

            using (var audioViewEntities = new AudioViewEntities())
            {
                var results = (await audioViewEntities.Readings
                               .Where(x => x.Project == projectId)
                               .OrderByDescending(x => x.Time)
                               .ToListAsync().ConfigureAwait(false))
                              .Select(x => x.ToInternal());
                foreach (var reading in results)
                {
                    readings.Add(reading);
                }
            }
            return(readings);
        }
예제 #13
0
        public async Task <Project> GetProject(Guid id)
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var project = await audioViewEntities.Projects.Where(x => x.Id == id).Select(x => new
                {
                    Project  = x,
                    Readings = x.Readings.Count
                }).FirstOrDefaultAsync().ConfigureAwait(false);

                if (project == null)
                {
                    return(null);
                }

                return(project.Project.ToInternal(project.Readings));
            }
        }
예제 #14
0
        public async Task <User> Validate(string username, string password)
        {
            using (var audioViewEntities = new AudioViewEntities())
            {
                var user = await audioViewEntities.Users.FirstOrDefaultAsync(x => x.username.ToLower() == username.ToLower()).ConfigureAwait(false);

                if (user == null)
                {
                    return(null);
                }

                var hash = generateHash(password, user.passwordSalt);
                if (user.password != hash)
                {
                    return(null);
                }

                return(user.ToInternal());
            }
        }
예제 #15
0
        public static Task UploadLocalFiles()
        {
            return(Task.Run(() =>
            {
                lock (LogFileLock)
                {
                    DirectoryInfo directory = new DirectoryInfo(DataFolder);
                    logger.Trace("Looking or unuploade files in \"{0}\".", directory.FullName);
                    if (!directory.Exists)
                    {
                        logger.Trace("No files where found in \"{0}\".", directory.FullName);
                        return;
                    }

                    List <string> filesToDelete = new List <string>();
                    foreach (var fileInfo in directory.GetFiles())
                    {
                        try
                        {
                            logger.Info("Found file to upload \"{0}\"", fileInfo.FullName);
                            var lines = File.ReadAllLines(fileInfo.FullName);
                            var settings = JsonConvert.DeserializeObject <MeasurementSettingsDataStorageWarpper>(lines[0]);
                            var readings =
                                lines.Skip(1)
                                .Select(JsonConvert.DeserializeObject <ReadingDataDataStorageWarpper>)
                                .ToList();
                            logger.Debug("File had {0} readings.", readings.Count);

                            using (var audioViewEntities = new AudioViewEntities())
                            {
                                if (!audioViewEntities.Projects.Any(x => x.Id == settings.Id))
                                {
                                    logger.Debug("Project \"{0}\" was not in the database adding.", settings.MeasurementSettings.ProjectName);
                                    audioViewEntities.Projects.Add(new Project()
                                    {
                                        Id = settings.Id,
                                        Created = settings.Created,
                                        MinorDBLimit = settings.MeasurementSettings.MinorDBLimit,
                                        MajorDBLimit = settings.MeasurementSettings.MajorDBLimit,
                                        MajorInterval = settings.MeasurementSettings.MajorInterval.Ticks,
                                        MinorInterval = settings.MeasurementSettings.MinorInterval.Ticks,
                                        Name = settings.MeasurementSettings.ProjectName,
                                        Number = settings.MeasurementSettings.ProjectNumber
                                    });
                                    audioViewEntities.SaveChanges();
                                }

                                var knownReadings =
                                    audioViewEntities.Readings.Where(x => x.Project == settings.Id)
                                    .Select(x => x.Id)
                                    .ToList();
                                logger.Trace("Got {0} known readings for {1}", knownReadings.Count, settings.Id);
                                var readingsToUpload = readings.Where(x => !knownReadings.Contains(x.Id)).ToList();
                                foreach (var r in readingsToUpload)
                                {
                                    audioViewEntities.Readings.Add(new Reading()
                                    {
                                        Id = r.Id,
                                        Project = settings.Id,
                                        Major = r.IsMajor ? (byte)1 : (byte)0,
                                        Time = r.Time,
                                        LAeq = r.Data.LAeq,
                                    });
                                }
                                logger.Trace("Added {0} new readings for {1}", readingsToUpload.Count, settings.Id);
                                audioViewEntities.SaveChanges();
                            }
                            // If we got to here is the file uploaded
                            filesToDelete.Add(fileInfo.FullName);
                        }
                        catch (DbEntityValidationException e)
                        {
                            logger.Error(e, "Was unable to uploade \"{0}\"", fileInfo.FullName);
                            foreach (var eve in e.EntityValidationErrors)
                            {
                                logger.Error("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                             eve.Entry.Entity.GetType().Name, eve.Entry.State);
                                foreach (var ve in eve.ValidationErrors)
                                {
                                    logger.Error("- Property: \"{0}\", Error: \"{1}\"",
                                                 ve.PropertyName, ve.ErrorMessage);
                                }
                            }
                            throw;
                        }
                        catch (Exception exp)
                        {
                            logger.Error(exp, "Was unable to uploade \"{0}\"", fileInfo.FullName);
                        }
                    }

                    foreach (var f in filesToDelete)
                    {
                        try
                        {
                            new FileInfo(f).Delete();
                        }
                        catch (Exception exp)
                        {
                            logger.Error(exp, "Was unable to delete \"{0}\" all data have been uploaded.", f);
                        }
                    }
                }
            }));
        }
예제 #16
0
        private async void WriteReading(bool major, DateTime time, ReadingData data)
        {
            var readingGuid = Guid.NewGuid();

            try
            {
                // Ensure the inital create have finished
                if (initalCreate != null)
                {
                    lock (initalCreateLock)
                    {
                        if (initalCreate != null)
                        {
                            Task.WaitAll(initalCreate);
                            initalCreate = null;
                        }
                    }
                }

                var reading = new Reading()
                {
                    Id      = readingGuid,
                    Project = this.Id,
                    Major   = major ? (byte)1 : (byte)0,
                    Time    = time,
                    LAeq    = data.LAeq,
                    LAMax   = data.LAMax,
                    LAMin   = data.LAMin,
                    LZMax   = data.LZMax,
                    LZMin   = data.LZMin,

                    // 1/3
                    Hz6_3   = data.LAeqOctaveBandOneThird.Hz6_3,
                    Hz8     = data.LAeqOctaveBandOneThird.Hz8,
                    Hz10    = data.LAeqOctaveBandOneThird.Hz10,
                    Hz12_5  = data.LAeqOctaveBandOneThird.Hz12_5,
                    Hz16    = data.LAeqOctaveBandOneThird.Hz16,
                    Hz20    = data.LAeqOctaveBandOneThird.Hz20,
                    Hz25    = data.LAeqOctaveBandOneThird.Hz25,
                    Hz31_5  = data.LAeqOctaveBandOneThird.Hz31_5,
                    Hz40    = data.LAeqOctaveBandOneThird.Hz40,
                    Hz50    = data.LAeqOctaveBandOneThird.Hz50,
                    Hz63    = data.LAeqOctaveBandOneThird.Hz63,
                    Hz80    = data.LAeqOctaveBandOneThird.Hz80,
                    Hz100   = data.LAeqOctaveBandOneThird.Hz100,
                    Hz125   = data.LAeqOctaveBandOneThird.Hz125,
                    Hz160   = data.LAeqOctaveBandOneThird.Hz160,
                    Hz200   = data.LAeqOctaveBandOneThird.Hz200,
                    Hz250   = data.LAeqOctaveBandOneThird.Hz250,
                    Hz315   = data.LAeqOctaveBandOneThird.Hz315,
                    Hz400   = data.LAeqOctaveBandOneThird.Hz400,
                    Hz500   = data.LAeqOctaveBandOneThird.Hz500,
                    Hz630   = data.LAeqOctaveBandOneThird.Hz630,
                    Hz800   = data.LAeqOctaveBandOneThird.Hz800,
                    Hz1000  = data.LAeqOctaveBandOneThird.Hz1000,
                    Hz1250  = data.LAeqOctaveBandOneThird.Hz1250,
                    Hz1600  = data.LAeqOctaveBandOneThird.Hz1600,
                    Hz2000  = data.LAeqOctaveBandOneThird.Hz2000,
                    Hz2500  = data.LAeqOctaveBandOneThird.Hz2500,
                    Hz3150  = data.LAeqOctaveBandOneThird.Hz3150,
                    Hz4000  = data.LAeqOctaveBandOneThird.Hz4000,
                    Hz5000  = data.LAeqOctaveBandOneThird.Hz5000,
                    Hz6300  = data.LAeqOctaveBandOneThird.Hz6300,
                    Hz8000  = data.LAeqOctaveBandOneThird.Hz8000,
                    Hz10000 = data.LAeqOctaveBandOneThird.Hz10000,
                    Hz12500 = data.LAeqOctaveBandOneThird.Hz12500,
                    Hz16000 = data.LAeqOctaveBandOneThird.Hz16000,
                    Hz20000 = data.LAeqOctaveBandOneThird.Hz20000,

                    // 1/1
                    OOHz16    = data.LAeqOctaveBandOneOne.Hz16,
                    OOHz31_5  = data.LAeqOctaveBandOneOne.Hz31_5,
                    OOHz63    = data.LAeqOctaveBandOneOne.Hz63,
                    OOHz125   = data.LAeqOctaveBandOneOne.Hz125,
                    OOHz250   = data.LAeqOctaveBandOneOne.Hz250,
                    OOHz500   = data.LAeqOctaveBandOneOne.Hz500,
                    OOHz1000  = data.LAeqOctaveBandOneOne.Hz1000,
                    OOHz2000  = data.LAeqOctaveBandOneOne.Hz2000,
                    OOHz4000  = data.LAeqOctaveBandOneOne.Hz4000,
                    OOHz8000  = data.LAeqOctaveBandOneOne.Hz8000,
                    OOHz16000 = data.LAeqOctaveBandOneOne.Hz16000
                };

                using (var audioViewEntities = new AudioViewEntities())
                {
                    audioViewEntities.Readings.Add(reading);
                    await audioViewEntities.SaveChangesAsync();
                }


                if (isServerDown && OnSQLServerStatusChanged != null)
                {
                    OnSQLServerStatusChanged(false);
                }
                isServerDown = false;

                // Reading ok, try to load offline files
                await UploadLocalFiles();
            }
            catch (Exception exp)
            {
                logger.Debug(exp, "Got database exception, starting to write offline for \"{0}\".", this.Settings.ProjectName);
                WriteOfline(major, time, data, readingGuid);

                if (!isServerDown && OnSQLServerStatusChanged != null)
                {
                    OnSQLServerStatusChanged(true);
                }
                isServerDown = true;
            }
        }