/// <summary> /// Create a new <see cref="SqliteFuncEvalQuery"/> instance. /// </summary> /// <param name="inspectionContext">Context for all function evaluations</param> /// <param name="sqliteInstanceName">Property name of a 'sqlite3 *' instance</param> /// <param name="query">Query to execute</param> /// <returns><see cref="SqliteFuncEvalQuery"/> instance</returns> public static async Task <SqliteFuncEvalQuery> CreateAsync( DkmInspectionContext inspectionContext, string sqliteInstanceName, string query) { // Initialize the query return(await Task.Run(() => { bool isAlreadyInit; DkmComponentManager.InitializeThread(DkmComponentManager.IdeComponentId, out isAlreadyInit); try { var funcEval = new SqliteFuncEvalQuery(inspectionContext, sqliteInstanceName, query); funcEval.PrepareQuery(); int columnCount = funcEval.QueryColumnCount(); funcEval.QueryColumnDetails(columnCount); return funcEval; } finally { if (!isAlreadyInit) { DkmComponentManager.UninitializeThread(DkmComponentManager.IdeComponentId); } } })); }
/// <summary> /// Instaniate a new <see cref="TableDetails"/> instance. /// </summary> /// <param name="tableName">Name of the table</param> /// <param name="query">Associated <see cref="SqliteFuncEvalQuery"/> instance</param> /// <param name="modBuilder"><see cref="ModuleBuilder"/> instance for dynamic row type generation</param> public TableDetails(String tableName, SqliteFuncEvalQuery query, ModuleBuilder modBuilder) { Debug.Assert(query != null && !String.IsNullOrEmpty(tableName) && modBuilder != null, "Arugments should not be null"); this.tableName = tableName; this.modBuilder = modBuilder; this.Query = query; this.VisibleRows = new ObservableCollection <object>(); this.CreateRowType(this.Query.ColumnNames); }
private async Task <IList <string> > LoadTablesAsync() { using (var tableQuery = await SqliteFuncEvalQuery.CreateAsync( this.inspectionContext, this.sqliteInstanceName, "SELECT name FROM sqlite_master WHERE type='table'")) { var tables = new List <String>(); foreach (var t in await tableQuery.ExecuteAsync(int.MaxValue, CancellationToken.None)) { Debug.Assert(t.Length != 0, "All rows should have at least 1 column"); tables.Add(t.First()); } return(tables); } }
private async Task <TableDetails> GetTableDetailsAsync(string table) { TableDetails details; if (!this.tableDetails.TryGetValue(table, out details)) { // Escape string for sqlite - http://www.sqlite.org/lang_expr.html var escapedTableName = this.selectedTable.Replace("\"", "\\\""); escapedTableName = escapedTableName.Replace("'", "''"); var query = await SqliteFuncEvalQuery.CreateAsync( this.inspectionContext, this.sqliteInstanceName, $"SELECT * FROM '{escapedTableName}'"); // Move off the main thread since we are about to do some code gen await TaskScheduler.Default; details = new TableDetails(this.selectedTable, query, this.modBuilder); this.tableDetails[table] = details; } return(details); }