Exemple #1
0
        private static async Task <CompileInfo> CompileAsync(IDatabase database, string tableName, IRedis redis, Query query)
        {
            var method = query.Method;

            if (method == "update")
            {
                query.Method = "select";
            }

            string sql;
            Dictionary <string, object> namedBindings;

            var compiler = DbUtils.GetCompiler(database.DatabaseType, database.ConnectionString);
            var compiled = compiler.Compile(query);

            if (method == "update")
            {
                var bindings = new List <object>();

                var setList    = new List <string>();
                var components = query.GetComponents("update");
                components.Add(new BasicCondition
                {
                    Column = nameof(Entity.LastModifiedDate),
                    Value  = DateTime.Now
                });
                foreach (var clause in components)
                {
                    if (clause is RawCondition raw)
                    {
                        var set = compiler.WrapIdentifiers(raw.Expression);
                        if (setList.Contains(set, StringComparer.OrdinalIgnoreCase))
                        {
                            continue;
                        }
                        setList.Add(set);
                        if (raw.Bindings != null)
                        {
                            bindings.AddRange(raw.Bindings);
                        }
                    }
                    else if (clause is BasicCondition basic)
                    {
                        var set = compiler.Wrap(basic.Column) + " = ?";
                        if (setList.Contains(set, StringComparer.OrdinalIgnoreCase))
                        {
                            continue;
                        }
                        setList.Add(set);
                        bindings.Add(basic.Value);
                    }
                }
                bindings.AddRange(compiled.Bindings);

                var result = new SqlResult
                {
                    Query = query
                };
                var where = compiler.CompileWheres(result);
                sql       = $"UPDATE {tableName} SET { string.Join(", ", setList)} {where}";

                //sql = Helper.ExpandParameters(sql, "?", bindings.ToArray());
                sql = Helper.ReplaceAll(sql, "?", i => "@p" + i);

                namedBindings = Helper.Flatten(bindings).Select((v, i) => new { i, v })
                                .ToDictionary(x => "@p" + x.i, x => x.v);
            }
            else
            {
                sql           = compiled.Sql;
                namedBindings = compiled.NamedBindings;
            }

            var compileInfo = new CompileInfo
            {
                Sql           = sql,
                NamedBindings = namedBindings
            };

            var cacheList = query.GetComponents <CachingCondition>("cache");

            if (cacheList != null && cacheList.Count > 0)
            {
                var cacheManager = await CachingUtils.GetCacheManagerAsync(redis);

                foreach (var caching in cacheList)
                {
                    if (caching.Action == CachingAction.Remove && caching.CacheKeysToRemove != null)
                    {
                        foreach (var cacheKey in caching.CacheKeysToRemove)
                        {
                            cacheManager.Remove(cacheKey);
                        }
                    }
                    else if (caching.Action == CachingAction.Get)
                    {
                        compileInfo.Caching = caching;
                    }
                }
            }

            return(compileInfo);
        }
Exemple #2
0
 /// <summary>
 /// Set no lock.
 /// </summary>
 public void Set()
 {
     _lockTTL       = _ttl.Ticks;
     _lastTimeStamp = CachingUtils.DiffTicks(DateTime.Now);
 }
Exemple #3
0
 /// <summary>
 /// Verifica se já expirou.
 /// </summary>
 /// <returns></returns>
 public bool HasExpired()
 {
     return(SortKey.CompareTo(CachingUtils.DiffTicks(DateTime.Now)) < 0);
 }
Exemple #4
0
    private IEnumerator DoLoadBundles(string databaseId)
    {
        Console_WriteLine("Loading database " + databaseId + "...");


        if (LoadingStart != null)
        {
            LoadingStart();
        }

        var database = LoadAssetBundlesDatabaseFromId(databaseId);

        if (LoadStart != null)
        {
            LoadStart(database);
        }

        //Console.WriteLine("==== Current language: " + LanguageTextManager.CurSystemLang);

        float       lastYieldTime    = Time.realtimeSinceStartup;
        const float maximumYieldTime = 1.0f / 5.0f;

        int i = 0;

        foreach (var bundleData in database.Bundles)
        {
            BundleInfo bundleInfo = new BundleInfo(bundleData);

            Console_WriteLine("Loading bundle " + bundleData.Name + "...");


            string url = UpdateUrl + "/" + databaseId + "/";

            int version = CachingUtils.GetVersionFromHash(bundleData.Hash);

            if (!Caching.IsVersionCached(bundleData.Filename, version) &&
                IsBundleInShippedDatabase(bundleData.Name, version))
            {
                if (_buildInfo.BundlesCacheIncluded)
                {
                    // Uncompressed cache copy (faster)

                    Console_WriteLine("Caching " + bundleData.Name);

                    CopyToCache(_shippedDatabase[bundleData.Name].CacheName);
                }
                else
                {
                    Console_WriteLine("Caching decompressing " + bundleData.Name);

                    url = StreamingAssetsUrl + "/Bundles/";
                }
            }

            if (LoadProgress != null)
            {
                LoadProgress(database.Bundles.IndexOf(bundleData));
            }

            using (var www = WWW.LoadFromCacheOrDownload(url + bundleData.Filename,
                                                         version))
            {
                yield return(www);

                lastYieldTime     = Time.realtimeSinceStartup;
                bundleInfo.Bundle = www.assetBundle;
            }
            yield return(null);

            foreach (var sceneName in bundleData.SceneNames)
            {
                _scenesMap.Add(sceneName, bundleInfo);
            }

            foreach (var assetId in bundleData.AssetsIds)
            {
                _assetIdMap[assetId] = bundleInfo;
            }

            _bundlesMap.Add(bundleData.Name, bundleInfo);

            // Allow some processing if hanging for too much long
            if (Time.realtimeSinceStartup - lastYieldTime > maximumYieldTime)
            {
                yield return(null);

                lastYieldTime = Time.realtimeSinceStartup;
            }

            i++;
            if (i % 30 == 0)
            {
                yield return(new WaitForSeconds(0.5f));
            }
        }


        Console_WriteLine("Database loaded");


        if (LoadingFinish != null)
        {
            LoadingFinish();
        }
    }
Exemple #5
0
    private IEnumerator DoDownloadBundles(string databaseId)
    {
        ResetUpdateError();


        Console_WriteLine("Downloading database " + databaseId + "...");


        if (DownloadingStart != null)
        {
            DownloadingStart();
        }

        if (DownloadingBundleStart != null)
        {
            DownloadingBundleStart();
        }


        if (DownloadingDatabase != null)
        {
            DownloadingDatabase(databaseId);
        }

        AssetBundlesDatabase database = _shippedDatabase;

        if (databaseId != _shippedDatabase.Id)
        {
            if (!Caching.IsVersionCached("index", CachingUtils.GetVersionFromId(databaseId)))
            {
                if (Application.internetReachability == NetworkReachability.NotReachable)
                {
                    ThrowUpdateError(UpdateErrorType.NoInternetAvailable);
                    yield break;
                }
            }


            // Download requested database
            int version = CachingUtils.GetVersionFromId(databaseId);



            // This do-while: workaround of unity bug of caching startup delay
            do
            {
                using (WWW www = WWW.LoadFromCacheOrDownload(UpdateUrl + "/" + databaseId + "/index", version))
                {
                    yield return(StartCoroutine(WwwDone(www)));

                    if (WwwHasBundleError(www))
                    {
                    }
                    else
                    {
                        database = www.assetBundle.mainAsset as AssetBundlesDatabase;
                        www.assetBundle.Unload(false);
                    }
                }
            } while (!Caching.IsVersionCached("index", version));
        }
        else
        {
            database = _shippedDatabase;
        }

        int totalDownloadSize = 0;

        var bundlesToDownload = new List <AssetBundlesDatabase.BundleData>();

        // Check which bundles must be downloaded/cached
        foreach (var bundleData in EnumerateUncachedBundles(database))
        {
            totalDownloadSize += bundleData.Size;
            bundlesToDownload.Add(bundleData);
        }

        if (bundlesToDownload.Count == 0)
        {
            yield break;
        }

        if (DownloadStart != null)
        {
            DownloadStart(database, bundlesToDownload, totalDownloadSize);
        }

        int totalDownloadedBytes = 0;

        if (bundlesToDownload.Count > 0)
        {
            Console_WriteLine("Will download " + bundlesToDownload.Count + " bundles, with a total of " + totalDownloadSize + " bytes");


            string url = UpdateUrl + "/" + databaseId + "/";

            //foreach (var bundleData in bundlesToDownload)
            for (int i = 0; i < bundlesToDownload.Count;)
            {
                var bundleData = bundlesToDownload.ElementAt(i);

                Console_WriteLine("Downloading bundle " + bundleData.Name + "...");

                using (var www = WWW.LoadFromCacheOrDownload(url + bundleData.Filename,
                                                             CachingUtils.GetVersionFromHash(bundleData.Hash)))
                {
                    int previousDownloadedBytes = totalDownloadedBytes;

                    yield return(StartCoroutine(WwwDone(www, () => {
                        totalDownloadedBytes = previousDownloadedBytes + (int)(www.progress * (float)bundleData.Size);

                        if (DownloadProgress != null)
                        {
                            DownloadProgress(bundlesToDownload.IndexOf(bundleData), totalDownloadedBytes);
                        }
                    })));

                    if (WwwHasBundleError(www))
                    {
                    }
                    else
                    {
                        www.assetBundle.Unload(false);
                        totalDownloadedBytes = previousDownloadedBytes + bundleData.Size;
                    }
                }

                i++;
            }
        }

        Console_WriteLine("Database downloaded");
        if (DownloadingBundleEnd != null)
        {
            DownloadingBundleEnd("success", "url");
        }

        if (DownloadingFinish != null)
        {
            DownloadingFinish();
        }
    }
Exemple #6
0
 /// <summary>
 /// Reseta a instancia.
 /// </summary>
 /// <param name="context"></param>
 /// <returns></returns>
 internal override bool Reset(CacheRuntimeContext context)
 {
     _lastTimeStamp = CachingUtils.DiffSeconds(DateTime.Now);
     return(base.Reset(context));
 }