Example #1
0
        private static async Task <PropertyListSetup> ReadPropertyListSetupAsync(Package package, Type model, string file)
        {
            using (ICacheDataProvider cacheDP = YetaWF.Core.IO.Caching.GetStaticSmallObjectCacheProvider()) {
                // Check cache first
                GetObjectInfo <PropertyListSetup> info = await cacheDP.GetAsync <PropertyListSetup>(file);

                if (info.Success)
                {
                    return(info.Data);
                }

                // Load the file
                if (YetaWFManager.DiagnosticsMode)  // to avoid exception spam
                {
                    if (!await FileSystem.FileSystemProvider.FileExistsAsync(file))
                    {
                        PropertyListSetup setup = new PropertyListSetup {
                            ExplicitDefinitions = false,
                        };
                        await cacheDP.AddAsync <PropertyListSetup>(file, setup);// failure also saved in cache

                        return(setup);
                    }
                }
                string text;
                try {
                    text = await FileSystem.FileSystemProvider.ReadAllTextAsync(file);
                } catch (Exception) {
                    PropertyListSetup setup = new PropertyListSetup {
                        ExplicitDefinitions = false,
                    };
                    await cacheDP.AddAsync <PropertyListSetup>(file, setup);// failure also saved in cache

                    return(setup);
                }

                {
                    PropertyListSetup setup = Utility.JsonDeserialize <PropertyListSetup>(text);
                    setup.ExplicitDefinitions = true;

                    // save in cache
                    await cacheDP.AddAsync <PropertyListSetup>(file, setup);

                    return(setup);
                }
            }
        }
Example #2
0
        private async Task <HelpFileInfo> TryHelpFileAsync(string url, bool useCache)
        {
            string file = Utility.UrlToPhysical(url);

            using (ICacheDataProvider cacheDP = YetaWF.Core.IO.Caching.GetStaticSmallObjectCacheProvider()) {
                // Check cache first
                GetObjectInfo <HelpFileInfo> cache = await cacheDP.GetAsync <HelpFileInfo>(file);

                if (cache.Success)
                {
                    return(cache.Data);
                }

                // read file
                if (!await FileSystem.FileSystemProvider.FileExistsAsync(file))
                {
                    HelpFileInfo noInfo = new HelpFileInfo {
                        Contents = null,
                        Exists   = false,
                    };
                    await cacheDP.AddAsync <HelpFileInfo>(file, noInfo);// failure also saved in cache

                    return(noInfo);
                }
                string contents = await FileSystem.FileSystemProvider.ReadAllTextAsync(file);

                HelpFileInfo info = new HelpFileInfo {
                    Contents = contents,
                    Exists   = true,
                };
                // save in cache
                if (contents.Length < MAXSIZE && useCache)
                {
                    await cacheDP.AddAsync <HelpFileInfo>(file, info);
                }
                return(info);
            }
        }
        internal async Task <DesignedPagesDictionaryByUrl> GetDesignedPagesWithoutLockAsync()
        {
            if (!await DataProvider.IsInstalledAsync())
            {
                return(new DesignedPagesDictionaryByUrl());// don't save this, it's not permanent
            }
            using (ICacheDataProvider staticCacheDP = YetaWF.Core.IO.Caching.GetStaticCacheProvider()) {
                DesignedPagesDictionaryByUrl data;
                GetObjectInfo <DesignedPagesDictionaryByUrl> info = await staticCacheDP.GetAsync <DesignedPagesDictionaryByUrl>(DESIGNEDPAGESKEY);

                if (!info.Success)
                {
                    data = await DataProviderIOMode.GetDesignedPagesAsync();

                    await staticCacheDP.AddAsync(DESIGNEDPAGESKEY, data);
                }
                else
                {
                    data = info.Data;
                }
                return(data);
            }
        }
        public async Task <GetObjectInfo <TYPE> > GetAsync <TYPE>(string key)
        {
            key = KeyPrefix + key;
            // get locally cached version
            GetObjectInfo <LocalSharedCacheObject> localInfo;

            using (ICacheDataProvider localCacheDP = YetaWF.Core.IO.Caching.GetLocalCacheProvider()) {
                localInfo = await localCacheDP.GetAsync <LocalSharedCacheObject>(key);

                if (!localInfo.Success)
                {
                    // no locally cached data
                    localInfo = new GetObjectInfo <LocalSharedCacheObject> {
                        Data = new LocalSharedCacheObject {
                            Created = DateTime.MinValue,
                            Key     = key,
                            Value   = null,
                        },
                        Success = false,
                    };
                }
                // get shared cached version
                IDatabase db = Redis.GetDatabase();
                long?     val;
                if (YetaWFManager.IsSync())
                {
                    val = (long?)db.StringGet(GetVersionKey(key));
                }
                else
                {
                    val = (long?)await db.StringGetAsync(GetVersionKey(key));
                }
                if (val != null)
                {
                    DateTime sharedCacheCreated = new DateTime((long)val);
                    if (sharedCacheCreated != localInfo.Data.Created)
                    {
                        // shared cached version is different, retrieve and save locally
                        byte[] sharedCacheData;
                        if (YetaWFManager.IsSync())
                        {
                            sharedCacheData = db.StringGet(GetDataKey(key));
                        }
                        else
                        {
                            sharedCacheData = await db.StringGetAsync(GetDataKey(key));
                        }
                        if (sharedCacheData == null)   // this shouldn't happen, we just got the shared version
                                                       // return the local data instead
                        {
                        }
                        else
                        {
                            LocalSharedCacheObject localCacheObj = new LocalSharedCacheObject {
                                Created = sharedCacheCreated,
                                Key     = key,
                                Value   = sharedCacheData,
                            };
                            await localCacheDP.AddAsync(key, localCacheObj); // save as locally cached version

                            return(new GetObjectInfo <TYPE> {
                                Success = true,
                                Data = new GeneralFormatter().Deserialize <TYPE>(sharedCacheData),
                            });
                        }
                    }
                    else
                    {
                        // shared version same as local version
                    }
                }
                else
                {
                    // there is no shared version
                }
                // return the local data
                if (localInfo.Success)
                {
                    return(new GetObjectInfo <TYPE> {
                        Success = true,
                        Data = new GeneralFormatter().Deserialize <TYPE>(localInfo.Data.Value),
                    });
                }
                else
                {
                    return(new GetObjectInfo <TYPE> {
                        Success = false,
                    });
                }
            }
        }
        public async Task <GetObjectInfo <TYPE> > GetAsync <TYPE>(string key)
        {
            // get locally cached version
            GetObjectInfo <LocalSharedCacheObject> localInfo;

            using (ICacheDataProvider localCacheDP = YetaWF.Core.IO.Caching.GetLocalCacheProvider()) {
                localInfo = await localCacheDP.GetAsync <LocalSharedCacheObject>(key);

                if (!localInfo.Success)
                {
                    // no locally cached data
                    localInfo = new GetObjectInfo <LocalSharedCacheObject> {
                        Data = new LocalSharedCacheObject {
                            Created = DateTime.MinValue,
                            Key     = key,
                            Value   = null,
                        },
                        Success = false,
                    };
                }
                // get shared cached version
                SharedCacheVersion sharedInfo = await SharedCacheVersionPostgreSQLDataProvider.SharedCacheVersionDP.GetVersionAsync(key);

                if (sharedInfo != null)
                {
                    if (sharedInfo.Created != localInfo.Data.Created)
                    {
                        // shared cached version is different, retrieve and save locally
                        SharedCacheObject sharedCacheObj = await DataProvider.GetAsync(key);

                        if (sharedCacheObj == null)   // this shouldn't happen, we just got the shared version
                                                      // return the local data instead
                        {
                        }
                        else
                        {
                            LocalSharedCacheObject localCacheObj = new LocalSharedCacheObject {
                                Created = sharedCacheObj.Created,
                                Key     = sharedCacheObj.Key,
                                Value   = sharedCacheObj.Value,
                            };
                            await localCacheDP.AddAsync(key, localCacheObj); // save as locally cached version

                            return(new GetObjectInfo <TYPE> {
                                Success = true,
                                Data = new GeneralFormatter().Deserialize <TYPE>(sharedCacheObj.Value),
                            });
                        }
                    }
                    else
                    {
                        // shared version same as local version
                    }
                }
                else
                {
                    // there is no shared version
                }
                // return the local data
                if (localInfo.Success)
                {
                    return(new GetObjectInfo <TYPE> {
                        Success = true,
                        Data = new GeneralFormatter().Deserialize <TYPE>(localInfo.Data.Value),
                    });
                }
                else
                {
                    return(new GetObjectInfo <TYPE> {
                        Success = false,
                    });
                }
            }
        }
Example #6
0
        private static async Task <ReadGridDictionaryInfo> ReadGridDictionaryAsync(Package package, Type recordType, string file)
        {
            using (ICacheDataProvider cacheDP = YetaWF.Core.IO.Caching.GetStaticSmallObjectCacheProvider()) {
                // Check cache first
                GetObjectInfo <ReadGridDictionaryInfo> info = await cacheDP.GetAsync <ReadGridDictionaryInfo>(file);

                if (info.Success)
                {
                    return(info.Data);
                }

                // Load the file
                Dictionary <string, GridColumnInfo> dict = new Dictionary <string, GridColumnInfo>();

                if (YetaWFManager.DiagnosticsMode)  // to avoid exception spam
                {
                    if (!await FileSystem.FileSystemProvider.FileExistsAsync(file))
                    {
                        ReadGridDictionaryInfo dictInfo = new ReadGridDictionaryInfo {
                            ColumnInfo = dict,
                            SortColumn = null,
                            SortBy     = GridDefinition.SortBy.NotSpecified,
                            Success    = false,
                        };
                        await cacheDP.AddAsync <ReadGridDictionaryInfo>(file, dictInfo);// failure also saved in cache

                        return(dictInfo);
                    }
                }

                List <string> lines;
                try {
                    lines = await FileSystem.FileSystemProvider.ReadAllLinesAsync(file);
                } catch (Exception) {
                    ReadGridDictionaryInfo dictInfo = new ReadGridDictionaryInfo {
                        ColumnInfo = dict,
                        SortColumn = null,
                        SortBy     = GridDefinition.SortBy.NotSpecified,
                        Success    = false,
                    };
                    await cacheDP.AddAsync <ReadGridDictionaryInfo>(file, dictInfo);// failure also saved in cache

                    return(dictInfo);
                }

                // Parse the file
                string sortCol = null;
                GridDefinition.SortBy sortDir = GridDefinition.SortBy.NotSpecified;

                Config config = null;

                foreach (string line in lines)
                {
                    string[]       parts   = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    GridColumnInfo gridCol = new GridColumnInfo();
                    int            len     = parts.Length;
                    if (len > 0)
                    {
                        bool   add  = true;
                        string name = parts[0];
                        if (name == "Config")
                        {
                            if (config != null)
                            {
                                throw new InternalError($"Only one Config statement can be used in {file}");
                            }
                            string rest = string.Join(" ", parts.Skip(1));
                            config = Utility.JsonDeserialize <Config>(rest);
                            continue;
                        }
                        for (int i = 1; i < len; ++i)
                        {
                            string part = GetPart(parts[i], package, recordType, file, name);
                            if (string.Compare(part, "sort", true) == 0)
                            {
                                gridCol.Sortable = true;
                            }
                            else if (string.Compare(part, "locked", true) == 0)
                            {
                                gridCol.Locked = true;
                            }
                            else if (string.Compare(part, "left", true) == 0)
                            {
                                gridCol.Alignment = GridHAlignmentEnum.Left;
                            }
                            else if (string.Compare(part, "center", true) == 0)
                            {
                                gridCol.Alignment = GridHAlignmentEnum.Center;
                            }
                            else if (string.Compare(part, "right", true) == 0)
                            {
                                gridCol.Alignment = GridHAlignmentEnum.Right;
                            }
                            else if (string.Compare(part, "hidden", true) == 0)
                            {
                                gridCol.Hidden = true;
                            }
                            else if (string.Compare(part, "onlysubmitwhenchecked", true) == 0)
                            {
                                gridCol.OnlySubmitWhenChecked = true;
                            }
                            else if (string.Compare(part, "icons", true) == 0)
                            {
                                int n = GetNextNumber(parts, i, part, file, name);
                                if (n < 1)
                                {
                                    throw new InternalError("Icons must be >= 1 for column {0} in {1}", name, file);
                                }
                                gridCol.Icons     = n;
                                gridCol.Alignment = GridHAlignmentEnum.Center;// default is centered
                                ++i;
                            }
                            else if (string.Compare(part, "defaultSort", true) == 0)
                            {
                                sortCol = name;
                                part    = GetNextPart(parts, i, part, file, name);
                                if (part == "asc")
                                {
                                    sortDir = GridDefinition.SortBy.Ascending;
                                }
                                else if (part == "desc")
                                {
                                    sortDir = GridDefinition.SortBy.Descending;
                                }
                                else
                                {
                                    throw new InternalError("Missing Asc/Desc following defaultSort for column {1} in {2}", part, name, file);
                                }
                                ++i;
                            }
                            else if (string.Compare(part, "internal", true) == 0)
                            {
                                bool showInternals = UserSettings.GetProperty <bool>("ShowInternals");
                                if (!showInternals)
                                {
                                    add = false;
                                    break;
                                }
                            }
                            else if (string.Compare(part, "filter", true) == 0)
                            {
                                if (gridCol.FilterOptions.Count > 0)
                                {
                                    throw new InternalError("Multiple filter options in {0} for {1}", file, name);
                                }
                                gridCol.FilterOptions = GetAllFilterOptions();
                            }
                            else if (part.StartsWith("filter(", StringComparison.InvariantCultureIgnoreCase))
                            {
                                if (gridCol.FilterOptions.Count > 0)
                                {
                                    throw new InternalError("Multiple filter options in {0} for {1}", file, name);
                                }
                                gridCol.FilterOptions = GetFilterOptions(part.Substring(6), file, name);
                            }
                            else if (part.EndsWith("pix", StringComparison.InvariantCultureIgnoreCase))
                            {
                                if (gridCol.ChWidth != 0)
                                {
                                    throw new InternalError("Can't use character width and pixel width at the same time in {0} for {1}", file, name);
                                }
                                part = part.Substring(0, part.Length - 3);
                                int n = GetNumber(part, file, name);
                                gridCol.PixWidth = n;
                            }
                            else
                            {
                                if (gridCol.PixWidth != 0)
                                {
                                    throw new InternalError("Can't use character width and pixel width at the same time in {0} for {1}", file, name);
                                }
                                int n = GetNumber(part, file, name);
                                gridCol.ChWidth = n;
                            }
                        }
                        if (add)
                        {
                            try {
                                dict.Add(name, gridCol);
                            } catch (Exception exc) {
                                throw new InternalError("Can't add {1} in {0} - {2}", file, name, ErrorHandling.FormatExceptionMessage(exc));
                            }
                        }
                    }
                }
                {
                    ReadGridDictionaryInfo dictInfo = new ReadGridDictionaryInfo {
                        ColumnInfo        = dict,
                        SortBy            = sortDir,
                        SortColumn        = sortCol,
                        Success           = true,
                        SaveColumnWidths  = config != null ? config.SaveWidths : null,
                        SaveColumnFilters = config != null ? config.SaveFilters : null,
                        InitialPageSize   = config != null ? config?.InitialPageSize : null,
                        PageSizes         = config?.PageSizes,
                        ShowHeader        = config?.ShowHeader,
                        ShowFilter        = config?.ShowFilter,
                        ShowPager         = config?.ShowPager,
                        SizeStyle         = config?.SizeStyle,
                    };

                    // save in cache
                    await cacheDP.AddAsync <ReadGridDictionaryInfo>(file, dictInfo);

                    return(dictInfo);
                }
            }
        }