private static IRunnable CreateRunnable(BuildItems items, Func <Assembly> createAssembly) { var assembly = createAssembly(); var type = assembly.GetType(items.AccessToClassPath); var runnable = (IRunnable)Activator.CreateInstance(type); runnable.Provider = items.SchemaProvider; return(runnable); }
public object Run(string script, TSQLEngine engine) { var items = new BuildItems { RawQuery = script, Engine = engine, }; BuildChain chain = new CreateTree( new TransformToQueryableStreamTree(null)); chain.Build(items); return(items.Result); }
public static (byte[] DllFile, byte[] PdbFile) CompileForStore(string script, ISchemaProvider provider) { var items = new BuildItems { SchemaProvider = provider, RawQuery = script }; var chain = new CreateTree( new TransformTree( new TurnQueryIntoRunnableCode(null))); chain.Build(items); return(items.DllFile, items.PdbFile); }
public static (byte[] DllFile, byte[] PdbFile) CompileForStore(string script, string assemblyName, ISchemaProvider provider) { var items = new BuildItems { SchemaProvider = provider, RawQuery = script, AssemblyName = assemblyName }; RuntimeLibraries.CreateReferences(); var chain = new CreateTree( new TransformTree( new TurnQueryIntoRunnableCode(null))); chain.Build(items); return(items.DllFile, items.PdbFile); }
public static CompiledQuery CompileForExecution(string script, ISchemaProvider schemaProvider) { var items = new BuildItems { SchemaProvider = schemaProvider, RawQuery = script }; var compiled = true; BuildChain chain = new CreateTree( new TransformTree( new TurnQueryIntoRunnableCode(null))); CompilationException compilationError = null; try { chain.Build(items); } catch (CompilationException ce) { compilationError = ce; compiled = false; } if (compiled && !Debugger.IsAttached) { return(new CompiledQuery(CreateRunnable(items))); } var tempPath = Path.Combine(Path.GetTempPath(), "Musoq"); var tempFileName = $"InMemoryAssembly"; var assemblyPath = Path.Combine(tempPath, $"{tempFileName}.dll"); var pdbPath = Path.Combine(tempPath, $"{tempFileName}.pdb"); var csPath = Path.Combine(tempPath, $"{tempFileName}.cs"); var builder = new StringBuilder(); using (var writer = new StringWriter(builder)) { items.Compilation?.SyntaxTrees.ElementAt(0).GetRoot().WriteTo(writer); } using (var file = new StreamWriter(File.Open(csPath, FileMode.Create))) { file.Write(builder.ToString()); } if (items.DllFile != null && items.DllFile.Length > 0) { using (var file = new BinaryWriter(File.Open(assemblyPath, FileMode.Create))) { if (items.DllFile != null) { file.Write(items.DllFile); } } } if (items.PdbFile != null && items.PdbFile.Length > 0) { using (var file = new BinaryWriter(File.Open(pdbPath, FileMode.Create))) { if (items.PdbFile != null) { file.Write(items.PdbFile); } } } if (!compiled && compilationError != null) { throw compilationError; } var runnable = new RunnableDebugDecorator(CreateRunnable(items), csPath, assemblyPath, pdbPath); return(new CompiledQuery(runnable)); }
private static IRunnable CreateRunnable(BuildItems items) { return(CreateRunnable(items, () => Assembly.Load(items.DllFile, items.PdbFile))); }
private static IRunnable CreateRunnable(BuildItems items, string assemblyPath) { return(CreateRunnable(items, () => Assembly.LoadFrom(assemblyPath))); }
public abstract void Build(BuildItems items);
public override ResultTable Evaluate() { var watch = new Stopwatch(); watch.Start(); var query = GetQuery(); var plugins = LoadPlugins(); if (Configuration.DebugInfo) { System.Console.WriteLine($"Loaded plugins ({plugins.Count}):"); foreach (var plugin in plugins) { System.Console.WriteLine($"Assembly {plugin.Value.FullName}"); } } var tempDir = Path.Combine(Path.GetTempPath(), "Musoq", "Compiled"); if (!Directory.Exists(tempDir)) { Directory.CreateDirectory(tempDir); } byte[] queryHash; using (var hashCreator = new MD5CryptoServiceProvider()) { queryHash = hashCreator.ComputeHash(Encoding.UTF8.GetBytes(query)); } var queryHashString = BitConverter.ToString(queryHash).Replace("-", ""); var dllPath = Path.Combine(tempDir, $"{queryHashString}.dll"); var pdbPath = Path.Combine(tempDir, $"{queryHashString}.pdb"); var schemaProvider = new DynamicSchemaProvider(plugins); Assembly assembly; if (!File.Exists(dllPath) || Configuration.CompileOnly) { var items = new BuildItems { SchemaProvider = schemaProvider, RawQuery = query }; new Environment().SetValue(Constants.NetStandardDllEnvironmentName, EnvironmentUtils.GetOrCreateEnvironmentVariable()); var throwAfterSave = false; CompilationException exc = null; try { BuildChain chain = new CreateTree( new TransformTree( new TurnQueryIntoRunnableCode(null))); chain.Build(items); } catch (CompilationException ce) { throwAfterSave = true; exc = ce; } if (items.DllFile?.Length > 0) { using (var writer = new BinaryWriter(File.OpenWrite(dllPath))) { writer.Write(items.DllFile); } } if (items.PdbFile?.Length > 0) { using (var writer = new BinaryWriter(File.OpenWrite(pdbPath))) { writer.Write(items.PdbFile); } } if (!string.IsNullOrEmpty(Configuration.OutputTranslatedQuery)) { var path = Configuration.OutputTranslatedQuery; var fileInfo = new FileInfo(path); if (fileInfo.Directory == null || !fileInfo.Directory.Exists) { throw new DirectoryNotFoundException(fileInfo.DirectoryName); } var builder = new StringBuilder(); using (var writer = new StringWriter(builder)) { items.Compilation?.SyntaxTrees.ElementAt(0).GetRoot().WriteTo(writer); } using (var file = new StreamWriter(File.OpenWrite(path))) { file.Write(builder.ToString()); } } if (throwAfterSave) { throw exc; } assembly = Assembly.Load(items.DllFile, items.PdbFile); } else { assembly = Assembly.LoadFile(dllPath); } if (Configuration.CompileOnly || !string.IsNullOrEmpty(Configuration.OutputTranslatedQuery)) { return(new ResultTable(string.Empty, new string[0], new object[0][], new string[0], TimeSpan.Zero)); } var runnableType = assembly.GetTypes().Single(type => type.FullName.ToLowerInvariant().Contains("query")); var instance = (IRunnable)Activator.CreateInstance(runnableType); instance.Provider = schemaProvider; var compiledQuery = new CompiledQuery(instance); var table = compiledQuery.Run(); watch.Stop(); var columns = table.Columns.Select(f => f.ColumnName).ToArray(); var rows = table.Select(f => f.Values).ToArray(); var result = new ResultTable(table.Name, columns, rows, new string[0], watch.Elapsed); return(result); }