Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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));
        }
Exemple #6
0
 private static IRunnable CreateRunnable(BuildItems items)
 {
     return(CreateRunnable(items, () => Assembly.Load(items.DllFile, items.PdbFile)));
 }
Exemple #7
0
 private static IRunnable CreateRunnable(BuildItems items, string assemblyPath)
 {
     return(CreateRunnable(items, () => Assembly.LoadFrom(assemblyPath)));
 }
Exemple #8
0
 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);
        }