Пример #1
0
        public static IAsyncActionWithProgress <double> ClearCachedGalleriesAsync()
        {
            return(Run <double>(async(token, progress) =>
            {
                using (var db = new GalleryDb())
                {
                    var folder = GalleryImage.ImageFolder ?? await GalleryImage.GetImageFolderAsync();
                    var todelete = await db.ImageSet
                                   .Where(im => !db.SavedSet.Any(sm => im.UsingBy.Any(gi => gi.GalleryId == sm.GalleryId)))
                                   .ToListAsync(token);
                    double count = todelete.Count;
                    var i = 0;
                    foreach (var item in todelete)
                    {
                        var file = await folder.TryGetFileAsync(item.FileName);
                        if (file != null)
                        {
                            await file.DeleteAsync();
                        }

                        progress.Report(++i / count);
                    }
                    db.ImageSet.RemoveRange(todelete);
                    await db.SaveChangesAsync();
                }
            }));
        }
        /// <summary>
        /// Operations to be performed during the downgrade process.
        /// </summary>
        public override void Down()
        {
            using (var ctx = new GalleryDb())
            {
                var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
                asDataSchema.SettingValue = "3.0.0";

                ctx.SaveChanges();
            }
        }
        /// <summary>
        /// Operations to be performed during the downgrade process.
        /// </summary>
        public override void Down()
        {
            using (var ctx = new GalleryDb())
            {
                var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
                asDataSchema.SettingValue = "3.0.1";

                ctx.SaveChanges();
            }
        }
Пример #4
0
        public virtual IAsyncActionWithProgress <SaveGalleryProgress> SaveAsync(ConnectionStrategy strategy)
        {
            return(Run <SaveGalleryProgress>(async(token, progress) =>
            {
                if (this.HasMoreItems)
                {
                    progress.Report(new SaveGalleryProgress(-1, this.RecordCount));
                    while (this.HasMoreItems)
                    {
                        await this.LoadMoreItemsAsync((uint)PageSize);
                        token.ThrowIfCancellationRequested();
                    }
                }

                await Task.Delay(0).ConfigureAwait(false);
                var loadedCount = 0;
                progress.Report(new SaveGalleryProgress(loadedCount, this.RecordCount));

                using (var semaphore = new SemaphoreSlim(16, 16))
                {
                    var loadTasks = this.Select(image => Task.Run(async() =>
                    {
                        await semaphore.WaitAsync();
                        try
                        {
                            token.ThrowIfCancellationRequested();
                            await image.LoadImageAsync(false, strategy, true);
                            Interlocked.Increment(ref loadedCount);
                            progress.Report(new SaveGalleryProgress(loadedCount, this.RecordCount));
                        }
                        finally
                        {
                            semaphore.Release();
                        }
                    })).ToArray();
                    await Task.WhenAll(loadTasks).ConfigureAwait(false);
                }

                using (var db = new GalleryDb())
                {
                    var gid = this.ID;
                    var myModel = db.SavedSet.SingleOrDefault(model => model.GalleryId == gid);
                    if (myModel == null)
                    {
                        db.SavedSet.Add(new SavedGalleryModel().Update(this));
                    }
                    else
                    {
                        myModel.Update(this);
                    }
                    await db.SaveChangesAsync();
                }
            }));
        }
Пример #5
0
 public override IAsyncAction DeleteAsync()
 {
     return(Task.Run(async() =>
     {
         using (var db = new GalleryDb())
         {
             var gid = this.ID;
             db.SavedSet.Remove(db.SavedSet.Single(c => c.GalleryId == gid));
             await db.SaveChangesAsync();
         }
         await base.DeleteAsync();
     }).AsAsyncAction());
 }
Пример #6
0
        /// <summary>
        /// Get thumb image of a gallery with local cache.
        /// </summary>
        /// <param name="exact"><see langword="true"/> if thumb of first image of the gallery must be used, otherwise, first cached image in the galley will be used.</param>
        /// <param name="bitmap">Bitmap to write thumb data into.</param>
        /// <returns>Local thumb found.</returns>
        private static async Task <bool> getThumbLocalilyAsync(Gallery gallery, bool exact, BitmapImage bitmap)
        {
            GalleryImageModel getImageModel(long gId, bool ex)
            {
                using (var db = new GalleryDb())
                {
                    db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
                    if (ex)
                    {
                        return(db.GalleryImageSet
                               .Include(gi => gi.Image)
                               .Where(gi => gi.GalleryId == gId && gi.PageId == 1)
                               .FirstOrDefault());
                    }
                    else
                    {
                        return(db.GalleryImageSet
                               .Include(gi => gi.Image)
                               .Where(gi => gi.GalleryId == gId)
                               .OrderBy(gi => gi.PageId)
                               .FirstOrDefault());
                    }
                }
            }

            var imageModel = getImageModel(gallery.Id, exact);

            if (imageModel is null)
            {
                return(false);
            }
            var file = await StorageHelper.ImageFolder.TryGetFileAsync(imageModel.Image.FileName);

            if (file is null)
            {
                return(false);
            }
            try
            {
                using (var stream = await file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem))
                {
                    await bitmap.SetSourceAsync(stream);

                    return(true);
                }
            }
            catch (Exception)
            {
                return(false);
            }
        }
Пример #7
0
        public override void Down()
        {
            DropIndex("gsp.Metadata", "UC_Metadata_MetaName_MetadataId");

            AlterColumn("gsp.Metadata", "RawValue", c => c.String(maxLength: 1000));

            using (var ctx = new GalleryDb())
            {
                var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
                asDataSchema.SettingValue = "3.1.0";

                ctx.SaveChanges();
            }
        }
Пример #8
0
 public static IAsyncOperation <ObservableList <Gallery> > LoadList()
 {
     return(Task.Run <ObservableList <Gallery> >(() =>
     {
         using (var db = new GalleryDb())
         {
             db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
             var query = db.SavedSet
                         .OrderByDescending(s => s.saved)
                         .Select(s => s.Gallery);
             return new SavedGalleryList(query.ToList());
         }
     }).AsAsyncOperation());
 }
        public override void Down()
        {
            DropIndex("gsp.Metadata", "UC_Metadata_MetaName_MetadataId");

            AlterColumn("gsp.Metadata", "RawValue", c => c.String(maxLength: 1000));

            using (var ctx = new GalleryDb())
            {
                var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
                asDataSchema.SettingValue = "3.1.0";

                ctx.SaveChanges();
            }
        }
Пример #10
0
        /// <summary>
        /// Verify there are gallery settings for the current gallery that match every template gallery setting, creating any
        /// if necessary.
        /// </summary>
        /// <returns><c>true</c> if data was changed that necessitates reloading data from the data store, <c>false</c> otherwise.</returns>
        private bool ConfigureGallerySettingsTable()
        {
            var foundTmplGallerySettings = false;
            var needToClearCache         = false;

            using (var repo = new GallerySettingRepository())
            {
                //repo.Load();
                var gallerySettingNamesInGallery = repo.Where(gs => gs.FKGalleryId == GalleryId).Select(gs => gs.SettingName).ToList();

                // Loop through each template gallery setting.
                foreach (var gsTmpl in repo.Where(g => g.Gallery.IsTemplate))
                {
                    foundTmplGallerySettings = true;
                    //if (!repo.Local.Any(gs => gs.SettingName == gsTmpl.SettingName && gs.FKGalleryId == GalleryId))
                    //if (!repo.Where(gs => gs.SettingName == gsTmpl.SettingName && gs.FKGalleryId == GalleryId).Any())
                    if (!gallerySettingNamesInGallery.Contains(gsTmpl.SettingName))
                    {
                        // This gallery is missing an entry for a gallery setting. Create one by copying it from the template gallery.
                        repo.Add(new GallerySettingDto()
                        {
                            FKGalleryId  = GalleryId,
                            SettingName  = gsTmpl.SettingName,
                            SettingValue = gsTmpl.SettingValue
                        });

                        needToClearCache = true;
                    }
                }

                repo.Save();
            }

            if (!foundTmplGallerySettings)
            {
                // If there weren't *any* template gallery settings, insert the seed data. Generally this won't be necessary, but it
                // can help recover from certain conditions, such as when a SQL Server connection is accidentally specified without
                // the MultipleActiveResultSets keyword (or it was false). In this situation the galleries are inserted but an error
                // prevents the remaining data from being inserted. Once the user corrects this and tries again, this code can run to
                // finish inserting the seed data.
                using (var ctx = new GalleryDb())
                {
                    SeedController.InsertSeedData(ctx);
                }
                Factory.ValidateGalleries();
            }

            return(needToClearCache);
        }
Пример #11
0
 public static IAsyncOperation <ObservableList <Gallery> > LoadList()
 {
     return(Task.Run <ObservableList <Gallery> >(() =>
     {
         using (var db = new GalleryDb())
         {
             db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
             var query = from gm in db.GallerySet
                         where gm.Images.Count != 0
                         where !db.SavedSet.Any(sm => sm.GalleryId == gm.GalleryModelId)
                         orderby gm.posted descending
                         select gm;
             return new CachedGalleryList(query.ToList());
         }
     }).AsAsyncOperation());
 }
        public override void Down()
        {
            DropColumn("gsp.Metadata", "RawValue");
            DropColumn("gsp.MediaQueue", "ConversionType");
            DropColumn("gsp.MediaQueue", "RotationAmount");

            AddColumn("gsp.MediaObject", "HashKey", c => c.String(nullable: false, maxLength: 47));

            using (var ctx = new GalleryDb())
            {
                var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
                asDataSchema.SettingValue = "3.0.3";

                ctx.SaveChanges();
            }
        }
        public override void Down()
        {
            DropColumn("gsp.Metadata", "RawValue");
            DropColumn("gsp.MediaQueue", "ConversionType");
            DropColumn("gsp.MediaQueue", "RotationAmount");

            AddColumn("gsp.MediaObject", "HashKey", c => c.String(nullable: false, maxLength: 47));

            using (var ctx = new GalleryDb())
            {
                var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
                asDataSchema.SettingValue = "3.0.3";

                ctx.SaveChanges();
            }
        }
        /// <summary>
        /// Operations to be performed during the downgrade process.
        /// </summary>
        public override void Down()
        {
            AddColumn("gsp.Album", "DateEnd", c => c.DateTime());
            AddColumn("gsp.Album", "DateStart", c => c.DateTime());

            // Don't actually reduce column length to 10 chars, since we'll lose data
            //DropIndex("gsp.MimeType", "UC_MimeType_FileExtension");
            //AlterColumn("gsp.MimeType", "FileExtension", c => c.String(nullable: false, maxLength: 10));
            //CreateIndex("gsp.MimeType", "FileExtension", true, "UC_MimeType_FileExtension");

            using (var ctx = new GalleryDb())
            {
                var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
                asDataSchema.SettingValue = "3.2.1";

                ctx.SaveChanges();
            }
        }
Пример #15
0
 protected override IAsyncAction InitOverrideAsync()
 {
     return(Task.Run(async() =>
     {
         using (var db = new GalleryDb())
         {
             db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
             var gid = this.ID;
             var models = db.GalleryImageSet
                          .Include(gi => gi.Image)
                          .Where(gi => gi.GalleryId == gid);
             foreach (var item in models)
             {
                 await this[item.PageId - 1].PopulateCachedImageAsync(item, item.Image);
                 this.LoadedItems[item.PageId - 1] = true;
             }
         }
     }).AsAsyncAction());
 }
Пример #16
0
 protected virtual IAsyncAction InitOverrideAsync()
 {
     return(Task.Run(() =>
     {
         using (var db = new GalleryDb())
         {
             var gid = Id;
             var myModel = db.GallerySet.SingleOrDefault(model => model.GalleryModelId == gid);
             if (myModel is null)
             {
                 db.GallerySet.Add(new GalleryModel().Update(this));
             }
             else
             {
                 myModel.Update(this);
             }
             db.SaveChanges();
         }
     }).AsAsyncAction());
 }
Пример #17
0
 internal void LoadImageModels()
 {
     if (this.GalleryImageModels != null)
     {
         return;
     }
     this.GalleryImageModels = new GalleryImageModel[this.RecordCount];
     using (var db = new GalleryDb())
     {
         db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
         var gid    = this.ID;
         var models = db.GalleryImageSet
                      .Include(gi => gi.Image)
                      .Where(gi => gi.GalleryId == gid);
         foreach (var item in models)
         {
             this.GalleryImageModels[item.PageId - 1] = item;
         }
     }
 }
Пример #18
0
 public static IAsyncOperation <Gallery> TryLoadGalleryAsync(long galleryId)
 {
     return(Task.Run(async() =>
     {
         using (var db = new GalleryDb())
         {
             db.ChangeTracker.QueryTrackingBehavior = Microsoft.EntityFrameworkCore.QueryTrackingBehavior.NoTracking;
             var cm = db.SavedSet.SingleOrDefault(c => c.GalleryId == galleryId);
             var gm = db.GallerySet.SingleOrDefault(g => g.GalleryModelId == galleryId);
             if (gm == null)
             {
                 return null;
             }
             var r = (cm == null) ?
                     new Gallery(gm) :
                     new SavedGallery(gm);
             await r.InitAsync();
             return r;
         }
     }).AsAsyncOperation());
 }
Пример #19
0
 protected IAsyncOperation <ImageSource> GetThumbLocalilyAsync()
 {
     return(Run <ImageSource>(async token =>
     {
         using (var db = new GalleryDb())
         {
             db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
             var gId = this.ID;
             var imageModel = db.GalleryImageSet
                              .Include(gi => gi.Image)
                              .Where(gi => gi.GalleryId == gId)
                              .OrderBy(gi => gi.PageId)
                              .FirstOrDefault();
             if (imageModel is null)
             {
                 return null;
             }
             var folder = GalleryImage.ImageFolder ?? await GalleryImage.GetImageFolderAsync();
             var file = await folder.TryGetFileAsync(imageModel.Image.FileName);
             if (file is null)
             {
                 return null;
             }
             try
             {
                 using (var stream = await file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem))
                 {
                     await CoreApplication.MainView.Dispatcher.Yield();
                     var image = new BitmapImage();
                     await image.SetSourceAsync(stream);
                     return image;
                 }
             }
             catch (Exception)
             {
                 return null;
             }
         }
     }));
 }
Пример #20
0
 public static IAsyncActionWithProgress <double> ClearAllGalleriesAsync()
 {
     return(Run <double>(async(token, progress) =>
     {
         progress.Report(double.NaN);
         var getFiles = StorageHelper.ImageFolder.GetFilesAsync();
         using (var db = new GalleryDb())
         {
             db.SavedSet.RemoveRange(db.SavedSet);
             db.ImageSet.RemoveRange(db.ImageSet);
             await db.SaveChangesAsync();
         }
         var files = await getFiles;
         double c = files.Count;
         var i = 0;
         foreach (var item in files)
         {
             await item.DeleteAsync();
             progress.Report(++i / c);
         }
     }));
 }
Пример #21
0
 protected IAsyncOperation <SoftwareBitmap> GetThumbLocalilyAsync()
 {
     return(Run(async token =>
     {
         using (var db = new GalleryDb())
         {
             db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
             var gId = this.ID;
             var imageModel = db.GalleryImageSet
                              .Include(gi => gi.Image)
                              .Where(gi => gi.GalleryId == gId)
                              .OrderBy(gi => gi.PageId)
                              .FirstOrDefault();
             if (imageModel == null)
             {
                 return null;
             }
             var folder = GalleryImage.ImageFolder ?? await GalleryImage.GetImageFolderAsync();
             var file = await folder.TryGetFileAsync(imageModel.Image.FileName);
             if (file == null)
             {
                 return null;
             }
             try
             {
                 using (var stream = await file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.SingleItem))
                 {
                     var decoder = await BitmapDecoder.CreateAsync(stream);
                     return await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
                 }
             }
             catch (Exception)
             {
                 return null;
             }
         }
     }));
 }
Пример #22
0
        public virtual IAsyncActionWithProgress <SaveGalleryProgress> SaveAsync(ConnectionStrategy strategy)
        {
            return(Run <SaveGalleryProgress>((token, progress) => Task.Run(async() =>
            {
                await Task.Yield();
                progress.Report(new SaveGalleryProgress(-1, Count));
                var loadOP = LoadItemsAsync(0, Count);
                token.Register(loadOP.Cancel);
                await loadOP;
                token.ThrowIfCancellationRequested();
                var loadedCount = 0;
                progress.Report(new SaveGalleryProgress(loadedCount, Count));

                using (var semaphore = new SemaphoreSlim(10, 10))
                {
                    async Task loadSingleImage(GalleryImage i)
                    {
                        try
                        {
                            Debug.WriteLine($"Start {i.PageId}");
                            token.ThrowIfCancellationRequested();
                            var firstFailed = false;
                            try
                            {
                                var firstChance = i.LoadImageAsync(false, strategy, true);
                                var firstTask = firstChance.AsTask(token);
                                var c = await Task.WhenAny(Task.Delay(30_000), firstTask);
                                if (c != firstTask)
                                {
                                    Debug.WriteLine($"Timeout 1st {i.PageId}");
                                    firstFailed = true;
                                    firstChance.Cancel();
                                }
                            }
                            catch (Exception)
                            {
                                Debug.WriteLine($"Fail 1st {i.PageId}");
                                firstFailed = true;
                            }
                            if (firstFailed)
                            {
                                Debug.WriteLine($"Retry {i.PageId}");
                                token.ThrowIfCancellationRequested();
                                await i.LoadImageAsync(true, strategy, true).AsTask(token);
                            }
                            progress.Report(new SaveGalleryProgress(Interlocked.Increment(ref loadedCount), Count));
                            Debug.WriteLine($"Success {i.PageId}");
                        }
                        finally
                        {
                            semaphore.Release();
                            Debug.WriteLine($"End {i.PageId}");
                        }
                    }

                    var pendingTasks = new List <Task>(Count);
                    await Task.Run(async() =>
                    {
                        foreach (var item in this)
                        {
                            await semaphore.WaitAsync().ConfigureAwait(false);
                            pendingTasks.Add(loadSingleImage(item));
                        }
                    }, token).ConfigureAwait(false);

                    await Task.WhenAll(pendingTasks).ConfigureAwait(false);
                }

                using (var db = new GalleryDb())
                {
                    var gid = Id;
                    var myModel = db.SavedSet.SingleOrDefault(model => model.GalleryId == gid);
                    if (myModel is null)
                    {
                        db.SavedSet.Add(new SavedGalleryModel().Update(this));
                    }
                    else
                    {
                        myModel.Update(this);
                    }
                    await db.SaveChangesAsync();
                }
            })));
        }
Пример #23
0
        public virtual IAsyncActionWithProgress <SaveGalleryProgress> SaveAsync(ConnectionStrategy strategy)
        {
            return(Run <SaveGalleryProgress>((token, progress) => Task.Run(async() =>
            {
                await Task.Yield();
                progress.Report(new SaveGalleryProgress(-1, this.Count));
                var loadOP = LoadItemsAsync(0, this.Count);
                token.Register(loadOP.Cancel);
                await loadOP;
                token.ThrowIfCancellationRequested();
                var loadedCount = 0;
                progress.Report(new SaveGalleryProgress(loadedCount, this.Count));

                using (var semaphore = new SemaphoreSlim(16, 16))
                {
                    var loadTasks = this.Select(image => Task.Run(async() =>
                    {
                        await semaphore.WaitAsync();
                        try
                        {
                            token.ThrowIfCancellationRequested();
                            var firstFailed = false;
                            try
                            {
                                var firstChance = image.LoadImageAsync(false, strategy, true);
                                var firstTask = firstChance.AsTask(token);
                                var c = await Task.WhenAny(Task.Delay(30_000), firstTask);
                                if (c != firstTask)
                                {
                                    firstFailed = true;
                                    firstChance.Cancel();
                                }
                            }
                            catch (Exception)
                            {
                                firstFailed = true;
                            }
                            if (firstFailed)
                            {
                                token.ThrowIfCancellationRequested();
                                await image.LoadImageAsync(false, strategy, true).AsTask(token);
                            }
                            progress.Report(new SaveGalleryProgress(Interlocked.Increment(ref loadedCount), this.Count));
                        }
                        finally
                        {
                            semaphore.Release();
                        }
                    })).ToArray();
                    await Task.WhenAll(loadTasks).ConfigureAwait(false);
                }

                using (var db = new GalleryDb())
                {
                    var gid = this.ID;
                    var myModel = db.SavedSet.SingleOrDefault(model => model.GalleryId == gid);
                    if (myModel is null)
                    {
                        db.SavedSet.Add(new SavedGalleryModel().Update(this));
                    }
                    else
                    {
                        myModel.Update(this);
                    }
                    await db.SaveChangesAsync();
                }
            })));
        }