From 07ef6b754e91a3e318fb1e632564ece38d3e2ccd Mon Sep 17 00:00:00 2001 From: FootStark Date: Thu, 18 Feb 2016 19:33:08 +0100 Subject: [PATCH] Update ExtensionMethods.cs --- .../Library/Main/Database/ExtensionMethods.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Duplicati/Library/Main/Database/ExtensionMethods.cs b/Duplicati/Library/Main/Database/ExtensionMethods.cs index dbb6fd58b..01bb7234a 100644 --- a/Duplicati/Library/Main/Database/ExtensionMethods.cs +++ b/Duplicati/Library/Main/Database/ExtensionMethods.cs @@ -147,7 +147,27 @@ namespace Duplicati.Library.Main.Database con.Transaction = transaction; return con; } - + + /// Small helper method querying and returning a textual representation of the SQLite execution plan. + public static string GetSQLiteExecutionPlan(this System.Data.IDbCommand cmd) + { + var qpCmd = cmd.Connection.CreateCommand(); + qpCmd.CommandText = "EXPLAIN QUERY PLAN " + cmd.CommandText; + qpCmd.Connection = cmd.Connection; + qpCmd.CommandType = cmd.CommandType; + qpCmd.Transaction = cmd.Transaction; + + System.Data.DataTable dt = new System.Data.DataTable(); + using (var rd = qpCmd.ExecuteReader()) + dt.Load(rd); + + string plan = + String.Join("\t", dt.Columns.Cast().Select(c => c.ColumnName).ToArray()) + "\n" + + string.Join("\n", dt.Rows.Cast().Select(r => String.Join("\t", r.ItemArray.Select(o => o == null ? "" : o.ToString()).ToArray())).ToArray()); + + return plan; + } + public static void DumpSQL(this System.Data.IDbConnection self, System.Data.IDbTransaction trans, string sql, params object[] parameters) { using (var c = self.CreateCommand())