예제 #1
0
        public static bool TryParse(string sql, ISqlDialect dialect, string tablePrefix, IDictionary <string, object> parameters, out string query, out IEnumerable <string> messages)
        {
            try
            {
                TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvmssql);
                sqlparser.sqltext = sql;
                int ret = sqlparser.parse();
                if (ret == 0)
                {
                    // Console.WriteLine("Great!");
                    var sqlParser = new SqlParser(sql, dialect, tablePrefix, parameters);
                    query = sqlParser.Evaluate();

                    messages = Array.Empty <string>();
                    return(true);
                }

                query    = null;
                messages = new[] { sqlparser.Errormessage };
                return(false);
                //  Console.WriteLine("Syntax error detected: {0}",sqlparser.Errormessage);
            }
            catch (SqlParserException se)
            {
                query    = null;
                messages = new string[] { se.Message };
            }
            catch (Exception e)
            {
                query    = null;
                messages = new string[] { "Unexpected error: " + e.Message };
            }

            return(false);
        }
예제 #2
0
        public async Task <IQueryResults> ExecuteQueryAsync(Query query, IDictionary <string, object> parameters)
        {
            var sqlQuery        = query as SqlParserQuery;
            var sqlQueryResults = new SQLQueryResults();
            // var templateContext = new TemplateContext();
            var templateContext = _liquidTemplateManager.Context;

            templateContext.SetValue("Query", sqlQuery);
            // await templateContext.ContextualizeAsync(_serviceProvider);
            if (parameters != null)
            {
                foreach (var parameter in parameters)
                {
                    templateContext.SetValue(parameter.Key, parameter.Value);
                }
            }

            var tokenizedQuery = await _liquidTemplateManager.RenderAsync(sqlQuery.Template, NullEncoder.Default, templateContext);

            var connection = _store.Configuration.ConnectionFactory.CreateConnection();
            var dialect    = _store.Configuration.SqlDialect;

            if (!SqlParser.TryParse(tokenizedQuery, dialect, _store.Configuration.TablePrefix, parameters,
                                    out var rawQuery, out var messages))
            {
                sqlQueryResults.Items = new object[0];
                return(sqlQueryResults);
            }

            if (sqlQuery.ReturnDocuments)
            {
                IEnumerable <int> documentIds;

                using (connection)
                {
                    connection.Open();
                    documentIds = await connection.QueryAsync <int>(rawQuery, parameters);
                }
                sqlQueryResults.Items = await _session.GetAsync <object>(documentIds.ToArray());

                return(sqlQueryResults);
//                return await _session.GetAsync<object>(documentIds.ToArray());
            }
            else
            {
                IEnumerable <dynamic> queryResults;

                using (connection)
                {
                    connection.Open();
                    queryResults = await connection.QueryAsync(rawQuery);
                }

                var results = new List <JObject>();

                foreach (var document in queryResults)
                {
                    results.Add(JObject.FromObject(document));
                }

                sqlQueryResults.Items = results;
                return(sqlQueryResults);
//                return results;
            }
        }