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); }
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; } }