/// <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);
                    }
                }
            }));
        }
示例#2
0
            /// <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);
            }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
        }