Raven.Database.Json.ScriptedJsonPatcher.CreateEngine C# (CSharp) 메소드

CreateEngine() 개인적인 메소드

private CreateEngine ( Raven.Abstractions.Data.ScriptedPatchRequest patch ) : JintEngine
patch Raven.Abstractions.Data.ScriptedPatchRequest
리턴 Jint.JintEngine
		private JintEngine CreateEngine(ScriptedPatchRequest patch)
		{
			var scriptWithProperLines = NormalizeLineEnding(patch.Script);
			var wrapperScript = String.Format(@"
function ExecutePatchScript(docInner){{
  (function(doc){{
	{0}
  }}).apply(docInner);
}};
", scriptWithProperLines);

			var jintEngine = new JintEngine()
				.AllowClr(false)
				.SetDebugMode(false)
				.SetMaxRecursions(50)
				.SetMaxSteps(10 * 1000);


			AddScript(jintEngine, "Raven.Database.Json.Map.js");
			AddScript(jintEngine, "Raven.Database.Json.ToJson.js");
			AddScript(jintEngine, "Raven.Database.Json.lodash.js");
			AddScript(jintEngine, "Raven.Database.Json.RavenDB.js");

			jintEngine.SetFunction("LoadDocument", ((Func<string, object>)(value =>
			{
				var loadedDoc = loadDocumentStatic(value);
				if (loadedDoc == null)
					return null;
				loadedDoc[Constants.DocumentIdFieldName] = value;
				return ToJsObject(jintEngine.Global, loadedDoc);
			})));

            jintEngine.Run(wrapperScript);

			return jintEngine;
		}

Usage Example

예제 #1
0
        public Jint.JintEngine CheckoutScript(ScriptedPatchRequest request)
        {
            CachedResult value;

            if (cacheDic.TryGetValue(request, out value))
            {
                Interlocked.Increment(ref value.Usage);
                Jint.JintEngine context;
                if (value.Queue.TryDequeue(out context))
                {
                    return(context);
                }
            }
            var result = ScriptedJsonPatcher.CreateEngine(request);

            var cachedResult = new CachedResult
            {
                Usage     = 1,
                Queue     = new ConcurrentQueue <Jint.JintEngine>(),
                Timestamp = SystemTime.UtcNow
            };

            cacheDic.AddOrUpdate(request, cachedResult, (_, existing) =>
            {
                Interlocked.Increment(ref existing.Usage);
                return(existing);
            });
            if (cacheDic.Count > CacheMaxSize)
            {
                foreach (var source in cacheDic
                         .OrderByDescending(x => x.Value.Usage)
                         .ThenBy(x => x.Value.Timestamp)
                         .Skip(CacheMaxSize))
                {
                    if (Equals(source.Key, request))
                    {
                        continue;                         // we don't want to remove the one we just added
                    }
                    CachedResult ignored;
                    cacheDic.TryRemove(source.Key, out ignored);
                }
            }

            return(result);
        }