System.Data.SQLite
Check-in [c9f62dd914]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Enhance the design-time components and installer in order to better support EF6 model entity generation.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: c9f62dd914072378aec9c18ce8f3dd13a56120b7
User & Date: mistachkin 2014-09-04 03:42:49
Context
2014-09-04
18:31
Update imported SQLite core library documentation. check-in: 8e13c43294 user: mistachkin tags: trunk
03:46
Merge updates from trunk. check-in: 30a16ee47c user: mistachkin tags: nugetChanges
03:42
Enhance the design-time components and installer in order to better support EF6 model entity generation. check-in: c9f62dd914 user: mistachkin tags: trunk
03:30
Merge updates from trunk. Closed-Leaf check-in: 8dba4cc370 user: mistachkin tags: designOptions
02:48
Update batch build tool to include the 'Debug' configuration by default. check-in: daec116031 user: mistachkin tags: trunk
Changes
Hide Diffs Side-by-Side Diffs Ignore Whitespace Patch

Changes to Doc/Extra/Provider/dbfactorysupport.html.

    57     57           Add the following code to your app.config file:</p>
    58     58         <div class="syntax">
    59     59           <PRE>&lt;configuration&gt;
    60     60     &lt;system.data&gt;
    61     61       &lt;DbProviderFactories&gt;
    62     62         &lt;remove invariant="System.Data.SQLite"/&gt;
    63     63         &lt;add name="SQLite Data Provider" invariant="System.Data.SQLite"
    64         -           description=".Net Framework Data Provider for SQLite"<br />           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /&gt;
           64  +           description=".NET Framework Data Provider for SQLite"<br />           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /&gt;
    65     65       &lt;/DbProviderFactories&gt;
    66     66     &lt;/system.data&gt;
    67     67   &lt;/configuration&gt;
    68     68   </PRE>
    69     69         </div>
    70     70         <h4>
    71     71           Scenario 2:&nbsp; Version Dependent, using either the DLL located in the same folder
................................................................................
    79     79         <div class="syntax">
    80     80           <PRE>
    81     81   &lt;configuration&gt;
    82     82     &lt;system.data&gt;
    83     83       &lt;DbProviderFactories&gt;
    84     84         &lt;remove invariant="System.Data.SQLite"/&gt;
    85     85         &lt;add name="SQLite Data Provider" invariant="System.Data.SQLite" 
    86         -           description=".Net Framework Data Provider for SQLite"
           86  +           description=".NET Framework Data Provider for SQLite"
    87     87              type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite,
    88     88                    Version=1.0.94.0, Culture=neutral,
    89     89                    PublicKeyToken=db937bc2d44ff139"/&gt;
    90     90       &lt;/DbProviderFactories&gt;
    91     91     &lt;/system.data&gt;
    92     92   &lt;/configuration&gt;
    93     93   </pre>

Changes to Doc/Extra/Provider/version.html.

  1078   1078         <li>The designer has had another round of cleanup applied, in preparation for moving
  1079   1079           to a VS package.</li>
  1080   1080         <li>Added SQLiteMetaDataCollectionNames class.</li>
  1081   1081       </ul>
  1082   1082       <p><b>1.0.24.6 beta - January 23, 2006</b></p>
  1083   1083       <ul>
  1084   1084       <li>This beta is built from sqlite.org's 3.3.2 beta.</li><li>Eliminated the static linking of mscoree from all binaries.&nbsp; Native projects
  1085         -      can now use the library without any dependencies on the .NET framework, while managed
         1085  +      can now use the library without any dependencies on the .NET Framework, while managed
  1086   1086         projects continue to be able to use the library normally.</li></ul>
  1087   1087       <p><b>1.0.24.5 beta - January 20, 2006</b></p>
  1088   1088       <ul>
  1089   1089       <li>This beta is built from sqlite.org's 3.3.1 alpha and contains development-in-progress code.&nbsp; Therefore no guarantees
  1090   1090         can be made regarding its suitability for production use.</li>
  1091   1091       <li><strong>You no longer need to distribute 2 files on the CompactFramework.&nbsp;
  1092   1092         You can delete SQLite.Interop.DLL entirely.&nbsp; </strong>I wrote a custom tool

Changes to SQLite.Designer/Editors/ViewDesignerDoc.cs.

    73     73         try
    74     74         {
    75     75           _typeQB = SQLiteDataAdapterToolboxItem._vsdesigner.GetType("Microsoft.VSDesigner.Data.Design.QueryBuilderControl");
    76     76   
    77     77           if (_typeQB != null)
    78     78           {
    79     79             _queryDesigner = Activator.CreateInstance(_typeQB) as UserControl;
    80         -          _typeQB.InvokeMember("Provider", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.NonPublic, null, _queryDesigner, new object[] { "System.Data.SQLite" });
           80  +          _typeQB.InvokeMember("Provider", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.NonPublic, null, _queryDesigner, new object[] { SQLiteOptions.GetProviderName() });
    81     81             _typeQB.InvokeMember("ConnectionString", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.NonPublic, null, _queryDesigner, new object[] { _connection.ConnectionSupport.ConnectionString });
    82     82             _typeQB.InvokeMember("EnableMorphing", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.NonPublic, null, _queryDesigner, new object[] { false });
    83     83             Controls.Add(_queryDesigner);
    84     84             _queryDesigner.Dock = DockStyle.Fill;
    85     85             _queryDesigner.Visible = true;
    86     86           }
    87     87   

Changes to SQLite.Designer/SQLite.Designer.2005.csproj.

   131    131       </Compile>
   132    132       <Compile Include="SQLiteDataAdapterToolboxItem.cs" />
   133    133       <Compile Include="SQLiteDataConnectionSupport.cs" />
   134    134       <Compile Include="SQLiteDataObjectIdentifierResolver.cs" />
   135    135       <Compile Include="SQLiteDataObjectSupport.cs" />
   136    136       <Compile Include="SQLiteDataSourceInformation.cs" />
   137    137       <Compile Include="SQLiteDataViewSupport.cs" />
          138  +    <Compile Include="SQLiteOptions.cs" />
   138    139       <Compile Include="SQLitePackage.cs" />
   139    140       <Compile Include="SQLiteProviderObjectFactory.cs" />
   140    141       <Compile Include="TableNameDialog.cs">
   141    142         <SubType>Form</SubType>
   142    143       </Compile>
   143    144       <Compile Include="TableNameDialog.Designer.cs">
   144    145         <DependentUpon>TableNameDialog.cs</DependentUpon>

Changes to SQLite.Designer/SQLite.Designer.2008.csproj.

   136    136       </Compile>
   137    137       <Compile Include="SQLiteDataAdapterToolboxItem.cs" />
   138    138       <Compile Include="SQLiteDataConnectionSupport.cs" />
   139    139       <Compile Include="SQLiteDataObjectIdentifierResolver.cs" />
   140    140       <Compile Include="SQLiteDataObjectSupport.cs" />
   141    141       <Compile Include="SQLiteDataSourceInformation.cs" />
   142    142       <Compile Include="SQLiteDataViewSupport.cs" />
          143  +    <Compile Include="SQLiteOptions.cs" />
   143    144       <Compile Include="SQLitePackage.cs" />
   144    145       <Compile Include="SQLiteProviderObjectFactory.cs" />
   145    146       <Compile Include="TableNameDialog.cs">
   146    147         <SubType>Form</SubType>
   147    148       </Compile>
   148    149       <Compile Include="TableNameDialog.Designer.cs">
   149    150         <DependentUpon>TableNameDialog.cs</DependentUpon>

Changes to SQLite.Designer/SQLite.Designer.2010.csproj.

   136    136       </Compile>
   137    137       <Compile Include="SQLiteDataAdapterToolboxItem.cs" />
   138    138       <Compile Include="SQLiteDataConnectionSupport.cs" />
   139    139       <Compile Include="SQLiteDataObjectIdentifierResolver.cs" />
   140    140       <Compile Include="SQLiteDataObjectSupport.cs" />
   141    141       <Compile Include="SQLiteDataSourceInformation.cs" />
   142    142       <Compile Include="SQLiteDataViewSupport.cs" />
          143  +    <Compile Include="SQLiteOptions.cs" />
   143    144       <Compile Include="SQLitePackage.cs" />
   144    145       <Compile Include="SQLiteProviderObjectFactory.cs" />
   145    146       <Compile Include="TableNameDialog.cs">
   146    147         <SubType>Form</SubType>
   147    148       </Compile>
   148    149       <Compile Include="TableNameDialog.Designer.cs">
   149    150         <DependentUpon>TableNameDialog.cs</DependentUpon>

Changes to SQLite.Designer/SQLite.Designer.2012.csproj.

   142    142       </Compile>
   143    143       <Compile Include="SQLiteDataAdapterToolboxItem.cs" />
   144    144       <Compile Include="SQLiteDataConnectionSupport.cs" />
   145    145       <Compile Include="SQLiteDataObjectIdentifierResolver.cs" />
   146    146       <Compile Include="SQLiteDataObjectSupport.cs" />
   147    147       <Compile Include="SQLiteDataSourceInformation.cs" />
   148    148       <Compile Include="SQLiteDataViewSupport.cs" />
          149  +    <Compile Include="SQLiteOptions.cs" />
   149    150       <Compile Include="SQLitePackage.cs" />
   150    151       <Compile Include="SQLiteProviderObjectFactory.cs" />
   151    152       <Compile Include="TableNameDialog.cs">
   152    153         <SubType>Form</SubType>
   153    154       </Compile>
   154    155       <Compile Include="TableNameDialog.Designer.cs">
   155    156         <DependentUpon>TableNameDialog.cs</DependentUpon>

Changes to SQLite.Designer/SQLite.Designer.2013.csproj.

   142    142       </Compile>
   143    143       <Compile Include="SQLiteDataAdapterToolboxItem.cs" />
   144    144       <Compile Include="SQLiteDataConnectionSupport.cs" />
   145    145       <Compile Include="SQLiteDataObjectIdentifierResolver.cs" />
   146    146       <Compile Include="SQLiteDataObjectSupport.cs" />
   147    147       <Compile Include="SQLiteDataSourceInformation.cs" />
   148    148       <Compile Include="SQLiteDataViewSupport.cs" />
          149  +    <Compile Include="SQLiteOptions.cs" />
   149    150       <Compile Include="SQLitePackage.cs" />
   150    151       <Compile Include="SQLiteProviderObjectFactory.cs" />
   151    152       <Compile Include="TableNameDialog.cs">
   152    153         <SubType>Form</SubType>
   153    154       </Compile>
   154    155       <Compile Include="TableNameDialog.Designer.cs">
   155    156         <DependentUpon>TableNameDialog.cs</DependentUpon>

Changes to SQLite.Designer/SQLiteConnectionProperties.cs.

    19     19     {
    20     20       public SQLiteConnectionProperties()
    21     21         : this(null)
    22     22       {
    23     23       }
    24     24   
    25     25       public SQLiteConnectionProperties(string connectionString)
    26         -      : base("System.Data.SQLite", connectionString)
           26  +      : base(SQLiteOptions.GetProviderName(), connectionString)
    27     27       {
    28     28       }
    29     29   
    30     30       public override string[] GetBasicProperties()
    31     31       {
    32     32         return new string[] { "data source" };
    33     33       }
................................................................................
    38     38   
    39     39         return base.ShouldPersistProperty(propertyName);
    40     40       }
    41     41   
    42     42       public override bool Contains(string propertyName)
    43     43       {
    44     44         if (String.Compare(propertyName, "Database", StringComparison.OrdinalIgnoreCase) == 0)
    45         -        return (base.Contains("data source") || base.Contains("uri"));
           45  +        return (base.Contains("data source") || base.Contains("uri") || base.Contains("fulluri"));
    46     46   
    47     47         return base.Contains(propertyName);
    48     48       }
    49     49   
    50     50       public override object this[string propertyName]
    51     51       {
    52     52         get
................................................................................
    64     64   
    65     65       internal string GetDatabaseFile()
    66     66       {
    67     67         if (this["data source"] is string && ((string)this["data source"]).Length > 0)
    68     68           return (string)this["data source"];
    69     69         else if (this["uri"] is string)
    70     70           return MapUriPath((string)this["uri"]);
           71  +      else if (this["fulluri"] is string)
           72  +        return (string)this["fulluri"];
    71     73         return String.Empty;
    72     74       }
    73     75   
    74     76       public override bool  IsComplete
    75     77       {
    76     78         get 
    77     79         {
................................................................................
    80     82             if (this["data source"] is string && ((string)this["data source"]).Length > 0)
    81     83               return true;
    82     84           }
    83     85           else if (Contains("uri") == true)
    84     86           {
    85     87             if (this["uri"] is string && MapUriPath((string)this["uri"]).Length > 0)
    86     88               return true;
           89  +        }
           90  +        else if (Contains("fulluri") == true)
           91  +        {
           92  +          if (this["fulluri"] is string && ((string)this["fulluri"]).Length > 0)
           93  +            return true;
    87     94           }
    88     95   
    89     96           return false;
    90     97         }
    91     98       }
    92     99   
    93    100       internal static string MapUriPath(string path)

Changes to SQLite.Designer/SQLiteConnectionStringEditor.cs.

    56     56           if (connectionString == null && newConnection != null)
    57     57           {
    58     58             if (_managerType != null)
    59     59             {
    60     60               object manager = Activator.CreateInstance(_managerType, new object[] { provider });
    61     61               if (manager != null)
    62     62               {
    63         -              index = (int)_managerType.InvokeMember("AddNewConnection", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, manager, new object[] { "System.Data.SQLite" });
           63  +              index = (int)_managerType.InvokeMember("AddNewConnection", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, manager, new object[] { SQLiteOptions.GetProviderName() });
    64     64                 if (index > -1 && _selector != null)
    65     65                 {
    66     66                   connectionString = (string)_managerType.InvokeMember("GetConnectionString", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, manager, new object[] { index });
    67     67                   _selector.SelectedNode = _selector.AddNode((string)_managerType.InvokeMember("GetConnectionName", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, manager, new object[] { index }), connectionString, null);
    68     68                 }
    69     69               }
    70     70             }
................................................................................
   100    100           string connectionName;
   101    101   
   102    102           for (int n = 0; n < items; n++)
   103    103           {
   104    104             connectionString = (string)_managerType.InvokeMember("GetConnectionString", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, manager, new object[] { n });
   105    105             connectionName = (string)_managerType.InvokeMember("GetConnectionName", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, manager, new object[] { n });
   106    106             dataProvider = (string)_managerType.InvokeMember("GetProvider", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, manager, new object[] { n });
   107         -          if (String.Compare(dataProvider, "System.Data.SQLite", StringComparison.OrdinalIgnoreCase) == 0)
          107  +          if (String.Compare(dataProvider, SQLiteOptions.GetProviderName(), StringComparison.OrdinalIgnoreCase) == 0)
   108    108             {
   109    109               node = selector.AddNode(connectionName, connectionString, null);
   110    110               
   111    111               if (String.Compare(connectionString, connection.ConnectionString, StringComparison.OrdinalIgnoreCase) == 0)
   112    112                 selector.SelectedNode = node;
   113    113             }
   114    114           }
   115    115           selector.AddNode("<New Connection...>", this, null);
   116    116         }
   117    117       }
   118    118     }
   119    119   }

Changes to SQLite.Designer/SQLiteConnectionUIControl.Designer.cs.

     1      1   /********************************************************
     2      2    * ADO.NET 2.0 Data Provider for SQLite Version 3.X
     3      3    * Written by Robert Simpson (robert@blackcastlesoft.com)
     4         - * 
            4  + *
     5      5    * Released to the public domain, use at your own risk!
     6      6    ********************************************************/
     7      7   
     8      8   namespace SQLite.Designer
     9      9   {
    10         -  partial class SQLiteConnectionUIControl
    11         -  {
    12         -    /// <summary>
    13         -    /// Required designer variable.
    14         -    /// </summary>
    15         -    private System.ComponentModel.IContainer components = null;
    16         -
    17         -    /// <summary>
    18         -    /// Clean up any resources being used.
    19         -    /// </summary>
    20         -    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    21         -    protected override void Dispose(bool disposing)
           10  +    partial class SQLiteConnectionUIControl
    22     11       {
    23         -      if (disposing && (components != null))
    24         -      {
    25         -        components.Dispose();
    26         -      }
    27         -      base.Dispose(disposing);
    28         -    }
           12  +        /// <summary>
           13  +        /// Required designer variable.
           14  +        /// </summary>
           15  +        private System.ComponentModel.IContainer components = null;
    29     16   
    30         -    #region Windows Form Designer generated code
           17  +        /// <summary>
           18  +        /// Clean up any resources being used.
           19  +        /// </summary>
           20  +        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
           21  +        protected override void Dispose(bool disposing)
           22  +        {
           23  +            if (disposing && (components != null))
           24  +            {
           25  +                components.Dispose();
           26  +            }
           27  +            base.Dispose(disposing);
           28  +        }
    31     29   
    32         -    /// <summary>
    33         -    /// Required method for Designer support - do not modify
    34         -    /// the contents of this method with the code editor.
    35         -    /// </summary>
    36         -    private void InitializeComponent()
    37         -    {
    38         -      System.Windows.Forms.Label labelPassword;
    39         -      System.Windows.Forms.GroupBox securityGroup;
    40         -      System.Windows.Forms.GroupBox encodingGroup;
    41         -      System.Windows.Forms.GroupBox dateTimeGroup;
    42         -      System.Windows.Forms.GroupBox databaseGroup;
    43         -      System.Windows.Forms.Label cacheSizeLabel;
    44         -      System.Windows.Forms.Label pageSizeLabel;
    45         -      System.Windows.Forms.GroupBox syncGroup;
    46         -      this.passwordTextBox = new System.Windows.Forms.TextBox();
    47         -      this.utf16RadioButton = new System.Windows.Forms.RadioButton();
    48         -      this.utf8RadioButton = new System.Windows.Forms.RadioButton();
    49         -      this.ticksRadioButton = new System.Windows.Forms.RadioButton();
    50         -      this.iso8601RadioButton = new System.Windows.Forms.RadioButton();
    51         -      this.cacheSizeTextbox = new System.Windows.Forms.TextBox();
    52         -      this.pageSizeTextBox = new System.Windows.Forms.TextBox();
    53         -      this.fileTextBox = new System.Windows.Forms.TextBox();
    54         -      this.browseButton = new System.Windows.Forms.Button();
    55         -      this.newDatabase = new System.Windows.Forms.Button();
    56         -      this.offRadioButton = new System.Windows.Forms.RadioButton();
    57         -      this.normalRadioButton = new System.Windows.Forms.RadioButton();
    58         -      this.fullRadioButton = new System.Windows.Forms.RadioButton();
    59         -      this.julianRadioButton = new System.Windows.Forms.RadioButton();
    60         -      labelPassword = new System.Windows.Forms.Label();
    61         -      securityGroup = new System.Windows.Forms.GroupBox();
    62         -      encodingGroup = new System.Windows.Forms.GroupBox();
    63         -      dateTimeGroup = new System.Windows.Forms.GroupBox();
    64         -      databaseGroup = new System.Windows.Forms.GroupBox();
    65         -      cacheSizeLabel = new System.Windows.Forms.Label();
    66         -      pageSizeLabel = new System.Windows.Forms.Label();
    67         -      syncGroup = new System.Windows.Forms.GroupBox();
    68         -      securityGroup.SuspendLayout();
    69         -      encodingGroup.SuspendLayout();
    70         -      dateTimeGroup.SuspendLayout();
    71         -      databaseGroup.SuspendLayout();
    72         -      syncGroup.SuspendLayout();
    73         -      this.SuspendLayout();
    74         -      // 
    75         -      // labelPassword
    76         -      // 
    77         -      labelPassword.AutoSize = true;
    78         -      labelPassword.Location = new System.Drawing.Point(6, 23);
    79         -      labelPassword.Name = "labelPassword";
    80         -      labelPassword.Size = new System.Drawing.Size(53, 13);
    81         -      labelPassword.TabIndex = 0;
    82         -      labelPassword.Text = "Password";
    83         -      // 
    84         -      // securityGroup
    85         -      // 
    86         -      securityGroup.Controls.Add(this.passwordTextBox);
    87         -      securityGroup.Controls.Add(labelPassword);
    88         -      securityGroup.Location = new System.Drawing.Point(3, 263);
    89         -      securityGroup.Name = "securityGroup";
    90         -      securityGroup.Size = new System.Drawing.Size(306, 56);
    91         -      securityGroup.TabIndex = 10;
    92         -      securityGroup.TabStop = false;
    93         -      securityGroup.Text = "Encryption";
    94         -      // 
    95         -      // passwordTextBox
    96         -      // 
    97         -      this.passwordTextBox.Location = new System.Drawing.Point(65, 20);
    98         -      this.passwordTextBox.Name = "passwordTextBox";
    99         -      this.passwordTextBox.Size = new System.Drawing.Size(235, 21);
   100         -      this.passwordTextBox.TabIndex = 1;
   101         -      this.passwordTextBox.UseSystemPasswordChar = true;
   102         -      this.passwordTextBox.Leave += new System.EventHandler(this.passwordTextBox_Leave);
   103         -      // 
   104         -      // encodingGroup
   105         -      // 
   106         -      encodingGroup.Controls.Add(this.utf16RadioButton);
   107         -      encodingGroup.Controls.Add(this.utf8RadioButton);
   108         -      encodingGroup.Location = new System.Drawing.Point(3, 159);
   109         -      encodingGroup.Name = "encodingGroup";
   110         -      encodingGroup.Size = new System.Drawing.Size(75, 98);
   111         -      encodingGroup.TabIndex = 7;
   112         -      encodingGroup.TabStop = false;
   113         -      encodingGroup.Text = "Encoding";
   114         -      // 
   115         -      // utf16RadioButton
   116         -      // 
   117         -      this.utf16RadioButton.AutoSize = true;
   118         -      this.utf16RadioButton.Location = new System.Drawing.Point(6, 44);
   119         -      this.utf16RadioButton.Name = "utf16RadioButton";
   120         -      this.utf16RadioButton.Size = new System.Drawing.Size(60, 17);
   121         -      this.utf16RadioButton.TabIndex = 1;
   122         -      this.utf16RadioButton.TabStop = true;
   123         -      this.utf16RadioButton.Text = "UTF-16";
   124         -      this.utf16RadioButton.UseVisualStyleBackColor = true;
   125         -      this.utf16RadioButton.CheckedChanged += new System.EventHandler(this.encoding_Changed);
   126         -      // 
   127         -      // utf8RadioButton
   128         -      // 
   129         -      this.utf8RadioButton.AutoSize = true;
   130         -      this.utf8RadioButton.Checked = true;
   131         -      this.utf8RadioButton.Location = new System.Drawing.Point(7, 21);
   132         -      this.utf8RadioButton.Name = "utf8RadioButton";
   133         -      this.utf8RadioButton.Size = new System.Drawing.Size(54, 17);
   134         -      this.utf8RadioButton.TabIndex = 0;
   135         -      this.utf8RadioButton.TabStop = true;
   136         -      this.utf8RadioButton.Text = "UTF-8";
   137         -      this.utf8RadioButton.UseVisualStyleBackColor = true;
   138         -      this.utf8RadioButton.CheckedChanged += new System.EventHandler(this.encoding_Changed);
   139         -      // 
   140         -      // dateTimeGroup
   141         -      // 
   142         -      dateTimeGroup.Controls.Add(this.julianRadioButton);
   143         -      dateTimeGroup.Controls.Add(this.ticksRadioButton);
   144         -      dateTimeGroup.Controls.Add(this.iso8601RadioButton);
   145         -      dateTimeGroup.Location = new System.Drawing.Point(84, 159);
   146         -      dateTimeGroup.Name = "dateTimeGroup";
   147         -      dateTimeGroup.Size = new System.Drawing.Size(113, 98);
   148         -      dateTimeGroup.TabIndex = 8;
   149         -      dateTimeGroup.TabStop = false;
   150         -      dateTimeGroup.Text = "Date/Time Format";
   151         -      // 
   152         -      // ticksRadioButton
   153         -      // 
   154         -      this.ticksRadioButton.AutoSize = true;
   155         -      this.ticksRadioButton.Location = new System.Drawing.Point(7, 66);
   156         -      this.ticksRadioButton.Name = "ticksRadioButton";
   157         -      this.ticksRadioButton.Size = new System.Drawing.Size(48, 17);
   158         -      this.ticksRadioButton.TabIndex = 1;
   159         -      this.ticksRadioButton.TabStop = true;
   160         -      this.ticksRadioButton.Text = "Ticks";
   161         -      this.ticksRadioButton.UseVisualStyleBackColor = true;
   162         -      this.ticksRadioButton.CheckedChanged += new System.EventHandler(this.datetime_Changed);
   163         -      // 
   164         -      // iso8601RadioButton
   165         -      // 
   166         -      this.iso8601RadioButton.AutoSize = true;
   167         -      this.iso8601RadioButton.Checked = true;
   168         -      this.iso8601RadioButton.Location = new System.Drawing.Point(7, 21);
   169         -      this.iso8601RadioButton.Name = "iso8601RadioButton";
   170         -      this.iso8601RadioButton.Size = new System.Drawing.Size(71, 17);
   171         -      this.iso8601RadioButton.TabIndex = 0;
   172         -      this.iso8601RadioButton.TabStop = true;
   173         -      this.iso8601RadioButton.Text = "ISO-8601";
   174         -      this.iso8601RadioButton.UseVisualStyleBackColor = true;
   175         -      this.iso8601RadioButton.CheckedChanged += new System.EventHandler(this.datetime_Changed);
   176         -      // 
   177         -      // databaseGroup
   178         -      // 
   179         -      databaseGroup.Controls.Add(cacheSizeLabel);
   180         -      databaseGroup.Controls.Add(this.cacheSizeTextbox);
   181         -      databaseGroup.Controls.Add(pageSizeLabel);
   182         -      databaseGroup.Controls.Add(this.pageSizeTextBox);
   183         -      databaseGroup.Controls.Add(this.fileTextBox);
   184         -      databaseGroup.Controls.Add(this.browseButton);
   185         -      databaseGroup.Controls.Add(this.newDatabase);
   186         -      databaseGroup.Location = new System.Drawing.Point(3, 3);
   187         -      databaseGroup.Name = "databaseGroup";
   188         -      databaseGroup.Size = new System.Drawing.Size(306, 150);
   189         -      databaseGroup.TabIndex = 8;
   190         -      databaseGroup.TabStop = false;
   191         -      databaseGroup.Text = "Database";
   192         -      // 
   193         -      // cacheSizeLabel
   194         -      // 
   195         -      cacheSizeLabel.AutoSize = true;
   196         -      cacheSizeLabel.Location = new System.Drawing.Point(7, 116);
   197         -      cacheSizeLabel.Name = "cacheSizeLabel";
   198         -      cacheSizeLabel.Size = new System.Drawing.Size(59, 13);
   199         -      cacheSizeLabel.TabIndex = 5;
   200         -      cacheSizeLabel.Text = "Cache Size";
   201         -      // 
   202         -      // cacheSizeTextbox
   203         -      // 
   204         -      this.cacheSizeTextbox.Location = new System.Drawing.Point(72, 113);
   205         -      this.cacheSizeTextbox.Name = "cacheSizeTextbox";
   206         -      this.cacheSizeTextbox.Size = new System.Drawing.Size(100, 21);
   207         -      this.cacheSizeTextbox.TabIndex = 6;
   208         -      this.cacheSizeTextbox.Text = "2000";
   209         -      this.cacheSizeTextbox.Leave += new System.EventHandler(this.cacheSizeTextbox_Leave);
   210         -      // 
   211         -      // pageSizeLabel
   212         -      // 
   213         -      pageSizeLabel.AutoSize = true;
   214         -      pageSizeLabel.Location = new System.Drawing.Point(13, 89);
   215         -      pageSizeLabel.Name = "pageSizeLabel";
   216         -      pageSizeLabel.Size = new System.Drawing.Size(53, 13);
   217         -      pageSizeLabel.TabIndex = 3;
   218         -      pageSizeLabel.Text = "Page Size";
   219         -      // 
   220         -      // pageSizeTextBox
   221         -      // 
   222         -      this.pageSizeTextBox.Location = new System.Drawing.Point(72, 86);
   223         -      this.pageSizeTextBox.Name = "pageSizeTextBox";
   224         -      this.pageSizeTextBox.Size = new System.Drawing.Size(100, 21);
   225         -      this.pageSizeTextBox.TabIndex = 4;
   226         -      this.pageSizeTextBox.Text = "1024";
   227         -      this.pageSizeTextBox.Leave += new System.EventHandler(this.pageSizeTextBox_Leave);
   228         -      // 
   229         -      // fileTextBox
   230         -      // 
   231         -      this.fileTextBox.Location = new System.Drawing.Point(6, 20);
   232         -      this.fileTextBox.Name = "fileTextBox";
   233         -      this.fileTextBox.Size = new System.Drawing.Size(294, 21);
   234         -      this.fileTextBox.TabIndex = 0;
   235         -      this.fileTextBox.Leave += new System.EventHandler(this.fileTextBox_Leave);
   236         -      // 
   237         -      // browseButton
   238         -      // 
   239         -      this.browseButton.Location = new System.Drawing.Point(6, 47);
   240         -      this.browseButton.Name = "browseButton";
   241         -      this.browseButton.Size = new System.Drawing.Size(75, 23);
   242         -      this.browseButton.TabIndex = 1;
   243         -      this.browseButton.Text = "&Browse ...";
   244         -      this.browseButton.UseVisualStyleBackColor = true;
   245         -      this.browseButton.Click += new System.EventHandler(this.browseButton_Click);
   246         -      // 
   247         -      // newDatabase
   248         -      // 
   249         -      this.newDatabase.Location = new System.Drawing.Point(87, 47);
   250         -      this.newDatabase.Name = "newDatabase";
   251         -      this.newDatabase.Size = new System.Drawing.Size(75, 23);
   252         -      this.newDatabase.TabIndex = 2;
   253         -      this.newDatabase.Text = "&New ...";
   254         -      this.newDatabase.UseVisualStyleBackColor = true;
   255         -      this.newDatabase.Click += new System.EventHandler(this.newDatabase_Click);
   256         -      // 
   257         -      // syncGroup
   258         -      // 
   259         -      syncGroup.Controls.Add(this.offRadioButton);
   260         -      syncGroup.Controls.Add(this.normalRadioButton);
   261         -      syncGroup.Controls.Add(this.fullRadioButton);
   262         -      syncGroup.Location = new System.Drawing.Point(204, 159);
   263         -      syncGroup.Name = "syncGroup";
   264         -      syncGroup.Size = new System.Drawing.Size(105, 98);
   265         -      syncGroup.TabIndex = 9;
   266         -      syncGroup.TabStop = false;
   267         -      syncGroup.Text = "Synchronization";
   268         -      // 
   269         -      // offRadioButton
   270         -      // 
   271         -      this.offRadioButton.AutoSize = true;
   272         -      this.offRadioButton.Location = new System.Drawing.Point(6, 66);
   273         -      this.offRadioButton.Name = "offRadioButton";
   274         -      this.offRadioButton.Size = new System.Drawing.Size(41, 17);
   275         -      this.offRadioButton.TabIndex = 2;
   276         -      this.offRadioButton.Text = "Off";
   277         -      this.offRadioButton.UseVisualStyleBackColor = true;
   278         -      this.offRadioButton.CheckedChanged += new System.EventHandler(this.sync_Changed);
   279         -      // 
   280         -      // normalRadioButton
   281         -      // 
   282         -      this.normalRadioButton.AutoSize = true;
   283         -      this.normalRadioButton.Checked = true;
   284         -      this.normalRadioButton.Location = new System.Drawing.Point(6, 43);
   285         -      this.normalRadioButton.Name = "normalRadioButton";
   286         -      this.normalRadioButton.Size = new System.Drawing.Size(58, 17);
   287         -      this.normalRadioButton.TabIndex = 1;
   288         -      this.normalRadioButton.TabStop = true;
   289         -      this.normalRadioButton.Text = "Normal";
   290         -      this.normalRadioButton.UseVisualStyleBackColor = true;
   291         -      this.normalRadioButton.CheckedChanged += new System.EventHandler(this.sync_Changed);
   292         -      // 
   293         -      // fullRadioButton
   294         -      // 
   295         -      this.fullRadioButton.AutoSize = true;
   296         -      this.fullRadioButton.Location = new System.Drawing.Point(6, 20);
   297         -      this.fullRadioButton.Name = "fullRadioButton";
   298         -      this.fullRadioButton.Size = new System.Drawing.Size(41, 17);
   299         -      this.fullRadioButton.TabIndex = 0;
   300         -      this.fullRadioButton.Text = "Full";
   301         -      this.fullRadioButton.UseVisualStyleBackColor = true;
   302         -      this.fullRadioButton.CheckedChanged += new System.EventHandler(this.sync_Changed);
   303         -      // 
   304         -      // julianRadioButton
   305         -      // 
   306         -      this.julianRadioButton.AutoSize = true;
   307         -      this.julianRadioButton.Location = new System.Drawing.Point(7, 44);
   308         -      this.julianRadioButton.Name = "julianRadioButton";
   309         -      this.julianRadioButton.Size = new System.Drawing.Size(74, 17);
   310         -      this.julianRadioButton.TabIndex = 2;
   311         -      this.julianRadioButton.TabStop = true;
   312         -      this.julianRadioButton.Text = "Julian Day";
   313         -      this.julianRadioButton.UseVisualStyleBackColor = true;
   314         -      this.julianRadioButton.CheckedChanged += new System.EventHandler(this.datetime_Changed);
   315         -      // 
   316         -      // SQLiteConnectionUIControl
   317         -      // 
   318         -      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
   319         -      this.Controls.Add(syncGroup);
   320         -      this.Controls.Add(databaseGroup);
   321         -      this.Controls.Add(dateTimeGroup);
   322         -      this.Controls.Add(encodingGroup);
   323         -      this.Controls.Add(securityGroup);
   324         -      this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
   325         -      this.Name = "SQLiteConnectionUIControl";
   326         -      this.Size = new System.Drawing.Size(312, 322);
   327         -      securityGroup.ResumeLayout(false);
   328         -      securityGroup.PerformLayout();
   329         -      encodingGroup.ResumeLayout(false);
   330         -      encodingGroup.PerformLayout();
   331         -      dateTimeGroup.ResumeLayout(false);
   332         -      dateTimeGroup.PerformLayout();
   333         -      databaseGroup.ResumeLayout(false);
   334         -      databaseGroup.PerformLayout();
   335         -      syncGroup.ResumeLayout(false);
   336         -      syncGroup.PerformLayout();
   337         -      this.ResumeLayout(false);
           30  +        #region Windows Form Designer generated code
           31  +        /// <summary>
           32  +        /// Required method for Designer support - do not modify
           33  +        /// the contents of this method with the code editor.
           34  +        /// </summary>
           35  +        private void InitializeComponent()
           36  +        {
           37  +            System.Windows.Forms.Label labelPassword;
           38  +            System.Windows.Forms.GroupBox securityGroup;
           39  +            System.Windows.Forms.GroupBox encodingGroup;
           40  +            System.Windows.Forms.GroupBox dateTimeGroup;
           41  +            System.Windows.Forms.GroupBox databaseGroup;
           42  +            System.Windows.Forms.Label cacheSizeLabel;
           43  +            System.Windows.Forms.Label pageSizeLabel;
           44  +            System.Windows.Forms.GroupBox syncGroup;
           45  +            System.Windows.Forms.GroupBox providerGroup;
           46  +            this.passwordTextBox = new System.Windows.Forms.TextBox();
           47  +            this.utf16RadioButton = new System.Windows.Forms.RadioButton();
           48  +            this.utf8RadioButton = new System.Windows.Forms.RadioButton();
           49  +            this.ticksRadioButton = new System.Windows.Forms.RadioButton();
           50  +            this.iso8601RadioButton = new System.Windows.Forms.RadioButton();
           51  +            this.cacheSizeTextbox = new System.Windows.Forms.TextBox();
           52  +            this.pageSizeTextBox = new System.Windows.Forms.TextBox();
           53  +            this.fileTextBox = new System.Windows.Forms.TextBox();
           54  +            this.browseButton = new System.Windows.Forms.Button();
           55  +            this.newDatabase = new System.Windows.Forms.Button();
           56  +            this.offRadioButton = new System.Windows.Forms.RadioButton();
           57  +            this.normalRadioButton = new System.Windows.Forms.RadioButton();
           58  +            this.fullRadioButton = new System.Windows.Forms.RadioButton();
           59  +            this.julianRadioButton = new System.Windows.Forms.RadioButton();
           60  +            this.providerComboBox = new System.Windows.Forms.ComboBox();
           61  +            labelPassword = new System.Windows.Forms.Label();
           62  +            securityGroup = new System.Windows.Forms.GroupBox();
           63  +            encodingGroup = new System.Windows.Forms.GroupBox();
           64  +            dateTimeGroup = new System.Windows.Forms.GroupBox();
           65  +            databaseGroup = new System.Windows.Forms.GroupBox();
           66  +            cacheSizeLabel = new System.Windows.Forms.Label();
           67  +            pageSizeLabel = new System.Windows.Forms.Label();
           68  +            syncGroup = new System.Windows.Forms.GroupBox();
           69  +            providerGroup = new System.Windows.Forms.GroupBox();
           70  +            securityGroup.SuspendLayout();
           71  +            encodingGroup.SuspendLayout();
           72  +            dateTimeGroup.SuspendLayout();
           73  +            databaseGroup.SuspendLayout();
           74  +            syncGroup.SuspendLayout();
           75  +            providerGroup.SuspendLayout();
           76  +            this.SuspendLayout();
           77  +            //
           78  +            // labelPassword
           79  +            //
           80  +            labelPassword.AutoSize = true;
           81  +            labelPassword.Location = new System.Drawing.Point(6, 23);
           82  +            labelPassword.Name = "labelPassword";
           83  +            labelPassword.Size = new System.Drawing.Size(53, 13);
           84  +            labelPassword.TabIndex = 0;
           85  +            labelPassword.Text = "Password";
           86  +            //
           87  +            // securityGroup
           88  +            //
           89  +            securityGroup.Controls.Add(this.passwordTextBox);
           90  +            securityGroup.Controls.Add(labelPassword);
           91  +            securityGroup.Location = new System.Drawing.Point(3, 263);
           92  +            securityGroup.Name = "securityGroup";
           93  +            securityGroup.Size = new System.Drawing.Size(306, 56);
           94  +            securityGroup.TabIndex = 10;
           95  +            securityGroup.TabStop = false;
           96  +            securityGroup.Text = "Encryption";
           97  +            //
           98  +            // passwordTextBox
           99  +            //
          100  +            this.passwordTextBox.Location = new System.Drawing.Point(65, 20);
          101  +            this.passwordTextBox.Name = "passwordTextBox";
          102  +            this.passwordTextBox.Size = new System.Drawing.Size(235, 21);
          103  +            this.passwordTextBox.TabIndex = 1;
          104  +            this.passwordTextBox.UseSystemPasswordChar = true;
          105  +            this.passwordTextBox.Leave += new System.EventHandler(this.passwordTextBox_Leave);
          106  +            //
          107  +            // encodingGroup
          108  +            //
          109  +            encodingGroup.Controls.Add(this.utf16RadioButton);
          110  +            encodingGroup.Controls.Add(this.utf8RadioButton);
          111  +            encodingGroup.Location = new System.Drawing.Point(3, 159);
          112  +            encodingGroup.Name = "encodingGroup";
          113  +            encodingGroup.Size = new System.Drawing.Size(75, 98);
          114  +            encodingGroup.TabIndex = 7;
          115  +            encodingGroup.TabStop = false;
          116  +            encodingGroup.Text = "Encoding";
          117  +            //
          118  +            // utf16RadioButton
          119  +            //
          120  +            this.utf16RadioButton.AutoSize = true;
          121  +            this.utf16RadioButton.Location = new System.Drawing.Point(6, 44);
          122  +            this.utf16RadioButton.Name = "utf16RadioButton";
          123  +            this.utf16RadioButton.Size = new System.Drawing.Size(60, 17);
          124  +            this.utf16RadioButton.TabIndex = 1;
          125  +            this.utf16RadioButton.TabStop = true;
          126  +            this.utf16RadioButton.Text = "UTF-16";
          127  +            this.utf16RadioButton.UseVisualStyleBackColor = true;
          128  +            this.utf16RadioButton.CheckedChanged += new System.EventHandler(this.encoding_Changed);
          129  +            //
          130  +            // utf8RadioButton
          131  +            //
          132  +            this.utf8RadioButton.AutoSize = true;
          133  +            this.utf8RadioButton.Checked = true;
          134  +            this.utf8RadioButton.Location = new System.Drawing.Point(7, 21);
          135  +            this.utf8RadioButton.Name = "utf8RadioButton";
          136  +            this.utf8RadioButton.Size = new System.Drawing.Size(54, 17);
          137  +            this.utf8RadioButton.TabIndex = 0;
          138  +            this.utf8RadioButton.TabStop = true;
          139  +            this.utf8RadioButton.Text = "UTF-8";
          140  +            this.utf8RadioButton.UseVisualStyleBackColor = true;
          141  +            this.utf8RadioButton.CheckedChanged += new System.EventHandler(this.encoding_Changed);
          142  +            //
          143  +            // dateTimeGroup
          144  +            //
          145  +            dateTimeGroup.Controls.Add(this.julianRadioButton);
          146  +            dateTimeGroup.Controls.Add(this.ticksRadioButton);
          147  +            dateTimeGroup.Controls.Add(this.iso8601RadioButton);
          148  +            dateTimeGroup.Location = new System.Drawing.Point(84, 159);
          149  +            dateTimeGroup.Name = "dateTimeGroup";
          150  +            dateTimeGroup.Size = new System.Drawing.Size(113, 98);
          151  +            dateTimeGroup.TabIndex = 8;
          152  +            dateTimeGroup.TabStop = false;
          153  +            dateTimeGroup.Text = "Date/Time Format";
          154  +            //
          155  +            // ticksRadioButton
          156  +            //
          157  +            this.ticksRadioButton.AutoSize = true;
          158  +            this.ticksRadioButton.Location = new System.Drawing.Point(7, 66);
          159  +            this.ticksRadioButton.Name = "ticksRadioButton";
          160  +            this.ticksRadioButton.Size = new System.Drawing.Size(48, 17);
          161  +            this.ticksRadioButton.TabIndex = 1;
          162  +            this.ticksRadioButton.TabStop = true;
          163  +            this.ticksRadioButton.Text = "Ticks";
          164  +            this.ticksRadioButton.UseVisualStyleBackColor = true;
          165  +            this.ticksRadioButton.CheckedChanged += new System.EventHandler(this.datetime_Changed);
          166  +            //
          167  +            // iso8601RadioButton
          168  +            //
          169  +            this.iso8601RadioButton.AutoSize = true;
          170  +            this.iso8601RadioButton.Checked = true;
          171  +            this.iso8601RadioButton.Location = new System.Drawing.Point(7, 21);
          172  +            this.iso8601RadioButton.Name = "iso8601RadioButton";
          173  +            this.iso8601RadioButton.Size = new System.Drawing.Size(71, 17);
          174  +            this.iso8601RadioButton.TabIndex = 0;
          175  +            this.iso8601RadioButton.TabStop = true;
          176  +            this.iso8601RadioButton.Text = "ISO-8601";
          177  +            this.iso8601RadioButton.UseVisualStyleBackColor = true;
          178  +            this.iso8601RadioButton.CheckedChanged += new System.EventHandler(this.datetime_Changed);
          179  +            //
          180  +            // databaseGroup
          181  +            //
          182  +            databaseGroup.Controls.Add(cacheSizeLabel);
          183  +            databaseGroup.Controls.Add(this.cacheSizeTextbox);
          184  +            databaseGroup.Controls.Add(pageSizeLabel);
          185  +            databaseGroup.Controls.Add(this.pageSizeTextBox);
          186  +            databaseGroup.Controls.Add(this.fileTextBox);
          187  +            databaseGroup.Controls.Add(this.browseButton);
          188  +            databaseGroup.Controls.Add(this.newDatabase);
          189  +            databaseGroup.Location = new System.Drawing.Point(3, 3);
          190  +            databaseGroup.Name = "databaseGroup";
          191  +            databaseGroup.Size = new System.Drawing.Size(306, 150);
          192  +            databaseGroup.TabIndex = 8;
          193  +            databaseGroup.TabStop = false;
          194  +            databaseGroup.Text = "Database";
          195  +            //
          196  +            // cacheSizeLabel
          197  +            //
          198  +            cacheSizeLabel.AutoSize = true;
          199  +            cacheSizeLabel.Location = new System.Drawing.Point(7, 116);
          200  +            cacheSizeLabel.Name = "cacheSizeLabel";
          201  +            cacheSizeLabel.Size = new System.Drawing.Size(59, 13);
          202  +            cacheSizeLabel.TabIndex = 5;
          203  +            cacheSizeLabel.Text = "Cache Size";
          204  +            //
          205  +            // cacheSizeTextbox
          206  +            //
          207  +            this.cacheSizeTextbox.Location = new System.Drawing.Point(72, 113);
          208  +            this.cacheSizeTextbox.Name = "cacheSizeTextbox";
          209  +            this.cacheSizeTextbox.Size = new System.Drawing.Size(100, 21);
          210  +            this.cacheSizeTextbox.TabIndex = 6;
          211  +            this.cacheSizeTextbox.Text = "2000";
          212  +            this.cacheSizeTextbox.Leave += new System.EventHandler(this.cacheSizeTextbox_Leave);
          213  +            //
          214  +            // pageSizeLabel
          215  +            //
          216  +            pageSizeLabel.AutoSize = true;
          217  +            pageSizeLabel.Location = new System.Drawing.Point(13, 89);
          218  +            pageSizeLabel.Name = "pageSizeLabel";
          219  +            pageSizeLabel.Size = new System.Drawing.Size(53, 13);
          220  +            pageSizeLabel.TabIndex = 3;
          221  +            pageSizeLabel.Text = "Page Size";
          222  +            //
          223  +            // pageSizeTextBox
          224  +            //
          225  +            this.pageSizeTextBox.Location = new System.Drawing.Point(72, 86);
          226  +            this.pageSizeTextBox.Name = "pageSizeTextBox";
          227  +            this.pageSizeTextBox.Size = new System.Drawing.Size(100, 21);
          228  +            this.pageSizeTextBox.TabIndex = 4;
          229  +            this.pageSizeTextBox.Text = "1024";
          230  +            this.pageSizeTextBox.Leave += new System.EventHandler(this.pageSizeTextBox_Leave);
          231  +            //
          232  +            // fileTextBox
          233  +            //
          234  +            this.fileTextBox.Location = new System.Drawing.Point(6, 20);
          235  +            this.fileTextBox.Name = "fileTextBox";
          236  +            this.fileTextBox.Size = new System.Drawing.Size(294, 21);
          237  +            this.fileTextBox.TabIndex = 0;
          238  +            this.fileTextBox.Leave += new System.EventHandler(this.fileTextBox_Leave);
          239  +            //
          240  +            // browseButton
          241  +            //
          242  +            this.browseButton.Location = new System.Drawing.Point(6, 47);
          243  +            this.browseButton.Name = "browseButton";
          244  +            this.browseButton.Size = new System.Drawing.Size(75, 23);
          245  +            this.browseButton.TabIndex = 1;
          246  +            this.browseButton.Text = "&Browse ...";
          247  +            this.browseButton.UseVisualStyleBackColor = true;
          248  +            this.browseButton.Click += new System.EventHandler(this.browseButton_Click);
          249  +            //
          250  +            // newDatabase
          251  +            //
          252  +            this.newDatabase.Location = new System.Drawing.Point(87, 47);
          253  +            this.newDatabase.Name = "newDatabase";
          254  +            this.newDatabase.Size = new System.Drawing.Size(75, 23);
          255  +            this.newDatabase.TabIndex = 2;
          256  +            this.newDatabase.Text = "&New ...";
          257  +            this.newDatabase.UseVisualStyleBackColor = true;
          258  +            this.newDatabase.Click += new System.EventHandler(this.newDatabase_Click);
          259  +            //
          260  +            // syncGroup
          261  +            //
          262  +            syncGroup.Controls.Add(this.offRadioButton);
          263  +            syncGroup.Controls.Add(this.normalRadioButton);
          264  +            syncGroup.Controls.Add(this.fullRadioButton);
          265  +            syncGroup.Location = new System.Drawing.Point(204, 159);
          266  +            syncGroup.Name = "syncGroup";
          267  +            syncGroup.Size = new System.Drawing.Size(105, 98);
          268  +            syncGroup.TabIndex = 9;
          269  +            syncGroup.TabStop = false;
          270  +            syncGroup.Text = "Synchronization";
          271  +            //
          272  +            // offRadioButton
          273  +            //
          274  +            this.offRadioButton.AutoSize = true;
          275  +            this.offRadioButton.Location = new System.Drawing.Point(6, 66);
          276  +            this.offRadioButton.Name = "offRadioButton";
          277  +            this.offRadioButton.Size = new System.Drawing.Size(41, 17);
          278  +            this.offRadioButton.TabIndex = 2;
          279  +            this.offRadioButton.Text = "Off";
          280  +            this.offRadioButton.UseVisualStyleBackColor = true;
          281  +            this.offRadioButton.CheckedChanged += new System.EventHandler(this.sync_Changed);
          282  +            //
          283  +            // normalRadioButton
          284  +            //
          285  +            this.normalRadioButton.AutoSize = true;
          286  +            this.normalRadioButton.Checked = true;
          287  +            this.normalRadioButton.Location = new System.Drawing.Point(6, 43);
          288  +            this.normalRadioButton.Name = "normalRadioButton";
          289  +            this.normalRadioButton.Size = new System.Drawing.Size(58, 17);
          290  +            this.normalRadioButton.TabIndex = 1;
          291  +            this.normalRadioButton.TabStop = true;
          292  +            this.normalRadioButton.Text = "Normal";
          293  +            this.normalRadioButton.UseVisualStyleBackColor = true;
          294  +            this.normalRadioButton.CheckedChanged += new System.EventHandler(this.sync_Changed);
          295  +            //
          296  +            // fullRadioButton
          297  +            //
          298  +            this.fullRadioButton.AutoSize = true;
          299  +            this.fullRadioButton.Location = new System.Drawing.Point(6, 20);
          300  +            this.fullRadioButton.Name = "fullRadioButton";
          301  +            this.fullRadioButton.Size = new System.Drawing.Size(41, 17);
          302  +            this.fullRadioButton.TabIndex = 0;
          303  +            this.fullRadioButton.Text = "Full";
          304  +            this.fullRadioButton.UseVisualStyleBackColor = true;
          305  +            this.fullRadioButton.CheckedChanged += new System.EventHandler(this.sync_Changed);
          306  +            //
          307  +            // julianRadioButton
          308  +            //
          309  +            this.julianRadioButton.AutoSize = true;
          310  +            this.julianRadioButton.Location = new System.Drawing.Point(7, 44);
          311  +            this.julianRadioButton.Name = "julianRadioButton";
          312  +            this.julianRadioButton.Size = new System.Drawing.Size(74, 17);
          313  +            this.julianRadioButton.TabIndex = 2;
          314  +            this.julianRadioButton.TabStop = true;
          315  +            this.julianRadioButton.Text = "Julian Day";
          316  +            this.julianRadioButton.UseVisualStyleBackColor = true;
          317  +            this.julianRadioButton.CheckedChanged += new System.EventHandler(this.datetime_Changed);
          318  +            //
          319  +            // providerGroup
          320  +            //
          321  +            providerGroup.Controls.Add(this.providerComboBox);
          322  +            providerGroup.Location = new System.Drawing.Point(3, 325);
          323  +            providerGroup.Name = "providerGroup";
          324  +            providerGroup.Size = new System.Drawing.Size(306, 56);
          325  +            providerGroup.TabIndex = 11;
          326  +            providerGroup.TabStop = false;
          327  +            providerGroup.Text = "Provider";
          328  +            //
          329  +            // providerComboBox
          330  +            //
          331  +            this.providerComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
          332  +            this.providerComboBox.FormattingEnabled = true;
          333  +            this.providerComboBox.Location = new System.Drawing.Point(6, 20);
          334  +            this.providerComboBox.Name = "providerComboBox";
          335  +            this.providerComboBox.Size = new System.Drawing.Size(294, 21);
          336  +            this.providerComboBox.TabIndex = 0;
          337  +            this.providerComboBox.SelectedIndexChanged += new System.EventHandler(this.provider_Changed);
          338  +            //
          339  +            // SQLiteConnectionUIControl
          340  +            //
          341  +            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
          342  +            this.Controls.Add(providerGroup);
          343  +            this.Controls.Add(syncGroup);
          344  +            this.Controls.Add(databaseGroup);
          345  +            this.Controls.Add(dateTimeGroup);
          346  +            this.Controls.Add(encodingGroup);
          347  +            this.Controls.Add(securityGroup);
          348  +            this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
          349  +            this.Name = "SQLiteConnectionUIControl";
          350  +            this.Size = new System.Drawing.Size(312, 386);
          351  +            securityGroup.ResumeLayout(false);
          352  +            securityGroup.PerformLayout();
          353  +            encodingGroup.ResumeLayout(false);
          354  +            encodingGroup.PerformLayout();
          355  +            dateTimeGroup.ResumeLayout(false);
          356  +            dateTimeGroup.PerformLayout();
          357  +            databaseGroup.ResumeLayout(false);
          358  +            databaseGroup.PerformLayout();
          359  +            syncGroup.ResumeLayout(false);
          360  +            syncGroup.PerformLayout();
          361  +            providerGroup.ResumeLayout(false);
          362  +            providerGroup.PerformLayout();
          363  +            this.ResumeLayout(false);
          364  +        }
          365  +        #endregion
   338    366   
          367  +        private System.Windows.Forms.TextBox fileTextBox;
          368  +        private System.Windows.Forms.Button browseButton;
          369  +        private System.Windows.Forms.Button newDatabase;
          370  +        private System.Windows.Forms.TextBox passwordTextBox;
          371  +        private System.Windows.Forms.RadioButton utf16RadioButton;
          372  +        private System.Windows.Forms.RadioButton utf8RadioButton;
          373  +        private System.Windows.Forms.RadioButton ticksRadioButton;
          374  +        private System.Windows.Forms.RadioButton iso8601RadioButton;
          375  +        private System.Windows.Forms.TextBox pageSizeTextBox;
          376  +        private System.Windows.Forms.TextBox cacheSizeTextbox;
          377  +        private System.Windows.Forms.RadioButton offRadioButton;
          378  +        private System.Windows.Forms.RadioButton normalRadioButton;
          379  +        private System.Windows.Forms.RadioButton fullRadioButton;
          380  +        private System.Windows.Forms.RadioButton julianRadioButton;
          381  +        private System.Windows.Forms.ComboBox providerComboBox;
   339    382       }
   340         -
   341         -    #endregion
   342         -
   343         -    private System.Windows.Forms.TextBox fileTextBox;
   344         -    private System.Windows.Forms.Button browseButton;
   345         -    private System.Windows.Forms.Button newDatabase;
   346         -    private System.Windows.Forms.TextBox passwordTextBox;
   347         -    private System.Windows.Forms.RadioButton utf16RadioButton;
   348         -    private System.Windows.Forms.RadioButton utf8RadioButton;
   349         -    private System.Windows.Forms.RadioButton ticksRadioButton;
   350         -    private System.Windows.Forms.RadioButton iso8601RadioButton;
   351         -    private System.Windows.Forms.TextBox pageSizeTextBox;
   352         -    private System.Windows.Forms.TextBox cacheSizeTextbox;
   353         -    private System.Windows.Forms.RadioButton offRadioButton;
   354         -    private System.Windows.Forms.RadioButton normalRadioButton;
   355         -    private System.Windows.Forms.RadioButton fullRadioButton;
   356         -    private System.Windows.Forms.RadioButton julianRadioButton;
   357         -  }
   358    383   }

Changes to SQLite.Designer/SQLiteConnectionUIControl.cs.

     1      1   /********************************************************
     2      2    * ADO.NET 2.0 Data Provider for SQLite Version 3.X
     3      3    * Written by Robert Simpson (robert@blackcastlesoft.com)
     4         - * 
            4  + *
     5      5    * Released to the public domain, use at your own risk!
     6      6    ********************************************************/
     7      7   
     8      8   namespace SQLite.Designer
     9      9   {
    10     10     using System;
    11         -  using System.Collections.Generic;
    12     11     using System.ComponentModel;
    13         -  using System.Data;
    14         -  using System.Drawing;
    15         -  using System.Text;
    16     12     using System.Windows.Forms;
    17     13     using System.Globalization;
    18     14     using Microsoft.VisualStudio.Data;
    19         -  using Microsoft.Win32;
    20     15   
    21     16     /// <summary>
    22     17     /// Provides a UI to edit/create SQLite database connections
    23     18     /// </summary>
    24     19     [ToolboxItem(false)]
    25     20     public partial class SQLiteConnectionUIControl : DataConnectionUIControl
    26     21     {
    27     22       public SQLiteConnectionUIControl()
    28     23       {
    29     24         InitializeComponent();
           25  +      SQLiteOptions.AddProviderNames(providerComboBox.Items);
    30     26       }
    31     27   
    32     28       private void browseButton_Click(object sender, EventArgs e)
    33     29       {
    34     30         OpenFileDialog dlg = new OpenFileDialog();
    35     31         dlg.FileName = fileTextBox.Text;
    36     32         dlg.Title = "Select SQLite Database File";
................................................................................
    53     49         }
    54     50       }
    55     51   
    56     52       #region IDataConnectionUIControl Members
    57     53   
    58     54       public override void LoadProperties()
    59     55       {
           56  +      SQLiteOptions.SelectProviderName(providerComboBox);
           57  +
           58  +      fileTextBox.Text = String.Empty;
           59  +      passwordTextBox.Text = String.Empty;
           60  +
           61  +      if (ConnectionProperties == null)
           62  +        return;
           63  +
    60     64         if (ConnectionProperties.Contains("data source"))
    61     65           fileTextBox.Text = ConnectionProperties["data source"] as string;
    62         -      else
    63         -        fileTextBox.Text = String.Empty;
    64     66   
    65     67         if (ConnectionProperties.Contains("password"))
    66     68           passwordTextBox.Text = ConnectionProperties["password"] as string;
    67         -      else
    68         -        passwordTextBox.Text = String.Empty;
    69     69       }
    70     70   
    71     71       #endregion
    72     72   
    73     73       private void passwordTextBox_Leave(object sender, EventArgs e)
    74     74       {
           75  +      if (ConnectionProperties == null)
           76  +       return;
           77  +
    75     78         if (String.IsNullOrEmpty(passwordTextBox.Text))
    76     79           ConnectionProperties.Remove("password");
    77     80         else
    78     81           ConnectionProperties["password"] = passwordTextBox.Text;
    79     82       }
    80     83   
    81     84       private void encoding_Changed(object sender, EventArgs e)
    82     85       {
           86  +      if (ConnectionProperties == null)
           87  +        return;
           88  +
    83     89         if (utf8RadioButton.Checked == true)
    84     90           ConnectionProperties.Remove("useutf16encoding");
    85     91         else
    86     92           ConnectionProperties["useutf16encoding"] = utf16RadioButton.Checked;
    87     93       }
    88     94   
    89     95       private void datetime_Changed(object sender, EventArgs e)
    90     96       {
           97  +      if (ConnectionProperties == null)
           98  +        return;
           99  +
    91    100         if (iso8601RadioButton.Checked == true)
    92    101           ConnectionProperties.Remove("datetimeformat");
    93    102         else if (ticksRadioButton.Checked == true)
    94    103           ConnectionProperties["datetimeformat"] = "Ticks";
    95    104         else
    96    105           ConnectionProperties["datetimeformat"] = "JulianDay";
    97    106       }
          107  +
          108  +    private void provider_Changed(object sender, EventArgs e)
          109  +    {
          110  +        object item = providerComboBox.SelectedItem;
          111  +
          112  +        if (item != null)
          113  +            SQLiteOptions.SetProviderName(item.ToString());
          114  +    }
    98    115   
    99    116       private void sync_Changed(object sender, EventArgs e)
   100    117       {
          118  +      if (ConnectionProperties == null)
          119  +        return;
          120  +
   101    121         string sync = "Normal";
   102    122         if (fullRadioButton.Checked == true) sync = "Full";
   103    123         else if (offRadioButton.Checked == true) sync = "Off";
   104    124   
   105    125         if (sync == "Normal")
   106    126           ConnectionProperties.Remove("synchronous");
   107    127         else
   108    128           ConnectionProperties["synchronous"] = sync;
   109    129       }
   110    130   
   111    131       private void pageSizeTextBox_Leave(object sender, EventArgs e)
   112    132       {
          133  +      if (ConnectionProperties == null)
          134  +        return;
          135  +
   113    136         int n = Convert.ToInt32(pageSizeTextBox.Text, CultureInfo.CurrentCulture);
   114    137         ConnectionProperties["page size"] = n;
   115    138       }
   116    139   
   117    140       private void cacheSizeTextbox_Leave(object sender, EventArgs e)
   118    141       {
          142  +      if (ConnectionProperties == null)
          143  +        return;
          144  +
   119    145         int n = Convert.ToInt32(cacheSizeTextbox.Text, CultureInfo.CurrentCulture);
   120    146         ConnectionProperties["cache size"] = n;
   121    147       }
   122    148   
   123    149       private void fileTextBox_Leave(object sender, EventArgs e)
   124    150       {
          151  +      if (ConnectionProperties == null)
          152  +        return;
          153  +
   125    154         ConnectionProperties["data source"] = fileTextBox.Text;
   126    155       }
   127    156     }
   128    157   }

Changes to SQLite.Designer/SQLiteConnectionUIControl.resx.

     1      1   <?xml version="1.0" encoding="utf-8"?>
     2      2   <root>
     3         -  <!-- 
     4         -    Microsoft ResX Schema 
     5         -    
            3  +  <!--
            4  +    Microsoft ResX Schema
            5  +
     6      6       Version 2.0
     7         -    
     8         -    The primary goals of this format is to allow a simple XML format 
     9         -    that is mostly human readable. The generation and parsing of the 
    10         -    various data types are done through the TypeConverter classes 
            7  +
            8  +    The primary goals of this format is to allow a simple XML format
            9  +    that is mostly human readable. The generation and parsing of the
           10  +    various data types are done through the TypeConverter classes
    11     11       associated with the data types.
    12         -    
           12  +
    13     13       Example:
    14         -    
           14  +
    15     15       ... ado.net/XML headers & schema ...
    16     16       <resheader name="resmimetype">text/microsoft-resx</resheader>
    17     17       <resheader name="version">2.0</resheader>
    18     18       <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    19     19       <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    20     20       <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
    21     21       <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
................................................................................
    22     22       <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
    23     23           <value>[base64 mime encoded serialized .NET Framework object]</value>
    24     24       </data>
    25     25       <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
    26     26           <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
    27     27           <comment>This is a comment</comment>
    28     28       </data>
    29         -                
    30         -    There are any number of "resheader" rows that contain simple 
           29  +
           30  +    There are any number of "resheader" rows that contain simple
    31     31       name/value pairs.
    32         -    
    33         -    Each data row contains a name, and value. The row also contains a 
    34         -    type or mimetype. Type corresponds to a .NET class that support 
    35         -    text/value conversion through the TypeConverter architecture. 
    36         -    Classes that don't support this are serialized and stored with the 
           32  +
           33  +    Each data row contains a name, and value. The row also contains a
           34  +    type or mimetype. Type corresponds to a .NET class that support
           35  +    text/value conversion through the TypeConverter architecture.
           36  +    Classes that don't support this are serialized and stored with the
    37     37       mimetype set.
    38         -    
    39         -    The mimetype is used for serialized objects, and tells the 
    40         -    ResXResourceReader how to depersist the object. This is currently not 
           38  +
           39  +    The mimetype is used for serialized objects, and tells the
           40  +    ResXResourceReader how to depersist the object. This is currently not
    41     41       extensible. For a given mimetype the value must be set accordingly:
    42         -    
    43         -    Note - application/x-microsoft.net.object.binary.base64 is the format 
    44         -    that the ResXResourceWriter will generate, however the reader can 
           42  +
           43  +    Note - application/x-microsoft.net.object.binary.base64 is the format
           44  +    that the ResXResourceWriter will generate, however the reader can
    45     45       read any of the formats listed below.
    46         -    
           46  +
    47     47       mimetype: application/x-microsoft.net.object.binary.base64
    48         -    value   : The object must be serialized with 
           48  +    value   : The object must be serialized with
    49     49               : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    50     50               : and then encoded with base64 encoding.
    51         -    
           51  +
    52     52       mimetype: application/x-microsoft.net.object.soap.base64
    53         -    value   : The object must be serialized with 
           53  +    value   : The object must be serialized with
    54     54               : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
    55     55               : and then encoded with base64 encoding.
    56     56   
    57     57       mimetype: application/x-microsoft.net.object.bytearray.base64
    58         -    value   : The object must be serialized into a byte array 
           58  +    value   : The object must be serialized into a byte array
    59     59               : using a System.ComponentModel.TypeConverter
    60     60               : and then encoded with base64 encoding.
    61     61       -->
    62     62     <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    63     63       <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    64     64       <xsd:element name="root" msdata:IsDataSet="true">
    65     65         <xsd:complexType>
................................................................................
   136    136       <value>False</value>
   137    137     </metadata>
   138    138     <metadata name="pageSizeLabel.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
   139    139       <value>False</value>
   140    140     </metadata>
   141    141     <metadata name="syncGroup.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
   142    142       <value>False</value>
          143  +  </metadata>
          144  +  <metadata name="providerGroup.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
          145  +    <value>False</value>
   143    146     </metadata>
   144    147   </root>

Changes to SQLite.Designer/SQLiteDataAdapterToolboxItem.cs.

    59     59       /// <summary>
    60     60       /// Creates the necessary components associated with this data adapter instance
    61     61       /// </summary>
    62     62       /// <param name="host">The designer host</param>
    63     63       /// <returns>The components created by this toolbox item</returns>
    64     64       protected override IComponent[] CreateComponentsCore(IDesignerHost host)
    65     65       {
    66         -      DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SQLite");
           66  +      DbProviderFactory fact = DbProviderFactories.GetFactory(SQLiteOptions.GetProviderName());
    67     67   
    68     68         DbDataAdapter dataAdapter = fact.CreateDataAdapter();
    69     69         IContainer container = host.Container;
    70     70         
    71     71         using (DbCommand adapterCommand = fact.CreateCommand())
    72     72         {
    73     73           ICloneable adapter = (ICloneable)adapterCommand;

Changes to SQLite.Designer/SQLiteDataConnectionSupport.cs.

    19     19     internal sealed class SQLiteDataConnectionSupport : AdoDotNetConnectionSupport
    20     20     {
    21     21       private SQLiteDataViewSupport _dataViewSupport;
    22     22       private SQLiteDataObjectSupport _dataObjectSupport;
    23     23       private SQLiteDataObjectIdentifierResolver _dataObjectIdentifierResolver;
    24     24   
    25     25       public SQLiteDataConnectionSupport()
    26         -      : base("System.Data.SQLite")
           26  +      : base(SQLiteOptions.GetProviderName())
    27     27       {
    28     28       }
    29     29   
    30     30       protected override DataSourceInformation CreateDataSourceInformation()
    31     31       {
    32     32         return new SQLiteDataSourceInformation(Site as DataConnection);
    33     33       }

Added SQLite.Designer/SQLiteOptions.cs.

            1  +/********************************************************
            2  + * ADO.NET 2.0 Data Provider for SQLite Version 3.X
            3  + * Written by Joe Mistachkin (joe@mistachkin.com)
            4  + *
            5  + * Released to the public domain, use at your own risk!
            6  + ********************************************************/
            7  +
            8  +using System;
            9  +using System.Collections.Generic;
           10  +using System.Data.Common;
           11  +using System.IO;
           12  +using System.Runtime.InteropServices;
           13  +using System.Windows.Forms;
           14  +using Microsoft.VisualStudio.Shell;
           15  +
           16  +namespace SQLite.Designer
           17  +{
           18  +    /// <summary>
           19  +    /// This class keeps track of the options configured on a per-solution file
           20  +    /// basis pertaining to the System.Data.SQLite design-time components.
           21  +    /// </summary>
           22  +    [Guid("5cf5656c-ccbe-4162-8780-0cbee936b90c")]
           23  +    internal static class SQLiteOptions
           24  +    {
           25  +        #region Private Constants
           26  +        /// <summary>
           27  +        /// This is the name of the setting containing the configured ADO.NET
           28  +        /// provider name.
           29  +        /// </summary>
           30  +        private static readonly string ProviderNameKey = "ProviderName";
           31  +
           32  +        ///////////////////////////////////////////////////////////////////////
           33  +
           34  +        /// <summary>
           35  +        /// This is the name of the environment variable that will be checked
           36  +        /// prior to setting the initial default value for the configured
           37  +        /// ADO.NET provider name, thus allowing the default value to be
           38  +        /// overridden via the environment.
           39  +        /// </summary>
           40  +        private static readonly string ProviderNameEnvVarName =
           41  +            "ProviderName_SQLiteDesigner";
           42  +
           43  +        ///////////////////////////////////////////////////////////////////////
           44  +
           45  +        /// <summary>
           46  +        /// This is the legacy provider name used by the System.Data.SQLite
           47  +        /// design-time components.  It is also the default value for the
           48  +        /// associated option key.
           49  +        /// </summary>
           50  +        private static readonly string DefaultProviderName = "System.Data.SQLite";
           51  +
           52  +        ///////////////////////////////////////////////////////////////////////
           53  +
           54  +#if NET_40 || NET_45 || NET_451
           55  +        /// <summary>
           56  +        /// This is the provider name used when Entity Framework 6.x support is
           57  +        /// required for use with the System.Data.SQLite design-time components.
           58  +        /// This provider name is only available when this class is compiled for
           59  +        /// the .NET Framework 4.0 or later.
           60  +        /// </summary>
           61  +        private static readonly string Ef6ProviderName = "System.Data.SQLite.EF6";
           62  +#endif
           63  +        #endregion
           64  +
           65  +        ///////////////////////////////////////////////////////////////////////
           66  +
           67  +        #region Private Static Data
           68  +        /// <summary>
           69  +        /// This is used to synchronize access to the static dictionary of
           70  +        /// options (just below).
           71  +        /// </summary>
           72  +        private static readonly object syncRoot = new object();
           73  +
           74  +        /// <summary>
           75  +        /// This dictionary contains the key/value pairs representing the
           76  +        /// per-solution options configured for the current solution.  When
           77  +        /// a new solution is loaded by Visual Studio, this dictionary must
           78  +        /// be reset.
           79  +        /// </summary>
           80  +        private static Dictionary<string, string> options;
           81  +        #endregion
           82  +
           83  +        ///////////////////////////////////////////////////////////////////////
           84  +
           85  +        #region Private Static Methods
           86  +        /// <summary>
           87  +        /// This method initializes (or resets) the per-solution configuration
           88  +        /// options.
           89  +        /// </summary>
           90  +        /// <param name="reset">
           91  +        /// Non-zero to reset the options if they are already initialized.
           92  +        /// When this method is called from the <see cref="SQLitePackage" />
           93  +        /// constructor, this value should always be true.
           94  +        /// </param>
           95  +        private static void Initialize(
           96  +            bool reset
           97  +            )
           98  +        {
           99  +            lock (syncRoot)
          100  +            {
          101  +                if (options != null)
          102  +                    options.Clear();
          103  +                else
          104  +                    options = new Dictionary<string, string>();
          105  +
          106  +                string key = ProviderNameKey;
          107  +                string value = Environment.GetEnvironmentVariable(
          108  +                    ProviderNameEnvVarName);
          109  +
          110  +                if (IsValidValue(key, value))
          111  +                    options[key] = value;
          112  +                else
          113  +                    options[key] = DefaultProviderName;
          114  +            }
          115  +        }
          116  +        #endregion
          117  +
          118  +        ///////////////////////////////////////////////////////////////////////
          119  +
          120  +        #region Public Static Methods
          121  +        #region Provider Name Handling
          122  +        /// <summary>
          123  +        /// This method determines the name of the ADO.NET provider for the
          124  +        /// System.Data.SQLite design-time components to use.
          125  +        /// </summary>
          126  +        /// <returns>
          127  +        /// The configured ADO.NET provider name for System.Data.SQLite -OR-
          128  +        /// the default ADO.NET provider name for System.Data.SQLite in the
          129  +        /// event of any failure.  This method cannot return null.
          130  +        /// </returns>
          131  +        public static string GetProviderName()
          132  +        {
          133  +            return GetProviderName(DefaultProviderName);
          134  +        }
          135  +
          136  +        ///////////////////////////////////////////////////////////////////////
          137  +
          138  +        /// <summary>
          139  +        /// This method determines the name of the ADO.NET provider for the
          140  +        /// System.Data.SQLite design-time components to use.
          141  +        /// </summary>
          142  +        /// <param name="default">
          143  +        /// The value to return from this method if the name of the ADO.NET
          144  +        /// provider is unavailable -OR- cannot be determined.
          145  +        /// </param>
          146  +        /// <returns>
          147  +        /// The configured ADO.NET provider name for System.Data.SQLite -OR-
          148  +        /// the default ADO.NET provider name for System.Data.SQLite in the
          149  +        /// event of any failure.
          150  +        /// </returns>
          151  +        private static string GetProviderName(
          152  +            string @default
          153  +            )
          154  +        {
          155  +            string key = ProviderNameKey;
          156  +            string value;
          157  +
          158  +            if (GetValue(key, out value) && IsValidValue(key, value))
          159  +                return value;
          160  +
          161  +            return @default;
          162  +        }
          163  +
          164  +        ///////////////////////////////////////////////////////////////////////
          165  +
          166  +        /// <summary>
          167  +        /// This method attempts to set the name of the ADO.NET provider for
          168  +        /// the System.Data.SQLite design-time components to use.
          169  +        /// </summary>
          170  +        /// <param name="value">
          171  +        /// The ADO.NET provider name to use.
          172  +        /// </param>
          173  +        /// <returns>
          174  +        /// Non-zero upon success; otherwise, zero.  All ADO.NET provider names
          175  +        /// unknown to this class are rejected.
          176  +        /// </returns>
          177  +        public static bool SetProviderName(
          178  +            string value
          179  +            )
          180  +        {
          181  +            string key = ProviderNameKey;
          182  +
          183  +            if (IsValidValue(key, value))
          184  +                return SetValue(key, value);
          185  +
          186  +            return false;
          187  +        }
          188  +
          189  +        ///////////////////////////////////////////////////////////////////////
          190  +
          191  +        #region User-Interface Handling
          192  +        /// <summary>
          193  +        /// This method attempts to select the configured ADO.NET provider name
          194  +        /// in the specified <see cref="ComboBox" />.  This method will only
          195  +        /// work correctly when called from the user-interface thread.
          196  +        /// </summary>
          197  +        /// <param name="comboBox">
          198  +        /// The <see cref="ComboBox" /> object where the selection is to be
          199  +        /// modified.
          200  +        /// </param>
          201  +        /// <returns>
          202  +        /// Non-zero upon success; otherwise, zero.
          203  +        /// </returns>
          204  +        public static bool SelectProviderName(
          205  +            ComboBox comboBox
          206  +            )
          207  +        {
          208  +            if (comboBox == null)
          209  +                return false;
          210  +
          211  +            string value = GetProviderName(null);
          212  +
          213  +            for (int index = 0; index < comboBox.Items.Count; index++)
          214  +            {
          215  +                object item = comboBox.Items[index];
          216  +
          217  +                if (item == null)
          218  +                    continue;
          219  +
          220  +                if ((value == null) || String.Equals(
          221  +                        item.ToString(), value, StringComparison.Ordinal))
          222  +                {
          223  +                    comboBox.SelectedIndex = index;
          224  +                    return true;
          225  +                }
          226  +            }
          227  +
          228  +            return false;
          229  +        }
          230  +
          231  +        ///////////////////////////////////////////////////////////////////////
          232  +
          233  +        private static bool CheckProviderName(
          234  +            string name
          235  +            )
          236  +        {
          237  +            DbProviderFactory dbProviderFactory = null;
          238  +
          239  +            try
          240  +            {
          241  +                dbProviderFactory = DbProviderFactories.GetFactory(
          242  +                    name); /* throw */
          243  +
          244  +                return (dbProviderFactory != null);
          245  +            }
          246  +            catch
          247  +            {
          248  +                // do nothing.
          249  +            }
          250  +            finally
          251  +            {
          252  +                if (dbProviderFactory != null)
          253  +                {
          254  +                    IDisposable disposable = dbProviderFactory as IDisposable;
          255  +
          256  +                    if (disposable != null)
          257  +                    {
          258  +                        disposable.Dispose();
          259  +                        disposable = null;
          260  +                    }
          261  +
          262  +                    dbProviderFactory = null;
          263  +                }
          264  +            }
          265  +
          266  +            return false;
          267  +        }
          268  +
          269  +        ///////////////////////////////////////////////////////////////////////
          270  +
          271  +        /// <summary>
          272  +        /// This method populates the specified <see cref="ComboBox" /> item
          273  +        /// list with the recognized ADO.NET provider names.  This method will
          274  +        /// only work correctly when called from the user-interface thread.
          275  +        /// </summary>
          276  +        /// <param name="items">
          277  +        /// The <see cref="ComboBox.Items" /> property value containing the
          278  +        /// list of items to be modified.  This value cannot be null.
          279  +        /// </param>
          280  +        /// <returns>
          281  +        /// The number of items actually added to the list, which may be zero.
          282  +        /// </returns>
          283  +        public static int AddProviderNames(
          284  +            ComboBox.ObjectCollection items
          285  +            )
          286  +        {
          287  +            int result = 0;
          288  +
          289  +            if (items == null)
          290  +                return result;
          291  +
          292  +            IList<string> names = new List<string>();
          293  +
          294  +#if NET_40 || NET_45 || NET_451
          295  +            names.Add(Ef6ProviderName);
          296  +#endif
          297  +
          298  +            names.Add(DefaultProviderName);
          299  +
          300  +            foreach (string name in names)
          301  +            {
          302  +                if (CheckProviderName(name))
          303  +                {
          304  +                    items.Add(name);
          305  +                    result++;
          306  +                }
          307  +            }
          308  +
          309  +            return result;
          310  +        }
          311  +        #endregion
          312  +        #endregion
          313  +
          314  +        ///////////////////////////////////////////////////////////////////////
          315  +
          316  +        #region Hard-Coded Default Value Handling
          317  +        /// <summary>
          318  +        /// This method determines if the specified key/value pair represents
          319  +        /// the default value for that option.
          320  +        /// </summary>
          321  +        /// <param name="key">
          322  +        /// The name ("key") of the configuration option.
          323  +        /// </param>
          324  +        /// <param name="value">
          325  +        /// The value of the configuration option.
          326  +        /// </param>
          327  +        /// <returns>
          328  +        /// Non-zero if the key/value pair represents its default value.
          329  +        /// </returns>
          330  +        public static bool IsDefaultValue(
          331  +            string key,
          332  +            string value
          333  +            )
          334  +        {
          335  +            if (String.Equals(
          336  +                    key, ProviderNameKey, StringComparison.Ordinal) &&
          337  +                String.Equals(
          338  +                    value, DefaultProviderName, StringComparison.Ordinal))
          339  +            {
          340  +                return true;
          341  +            }
          342  +
          343  +            return false;
          344  +        }
          345  +
          346  +        ///////////////////////////////////////////////////////////////////////
          347  +
          348  +        /// <summary>
          349  +        /// This method determines if the specified key/value pair is valid
          350  +        /// and supported by this class.
          351  +        /// </summary>
          352  +        /// <param name="key">
          353  +        /// The name ("key") of the configuration option.
          354  +        /// </param>
          355  +        /// <param name="value">
          356  +        /// The value of the configuration option.
          357  +        /// </param>
          358  +        /// <returns>
          359  +        /// Non-zero if the key/value pair represents a valid option key and
          360  +        /// value supported by this class.
          361  +        /// </returns>
          362  +        public static bool IsValidValue(
          363  +            string key,
          364  +            string value
          365  +            )
          366  +        {
          367  +            if (String.Equals(
          368  +                    key, ProviderNameKey, StringComparison.Ordinal) &&
          369  +                (String.Equals(
          370  +                    value, DefaultProviderName, StringComparison.Ordinal)
          371  +#if NET_40 || NET_45 || NET_451
          372  +                || String.Equals(
          373  +                    value, Ef6ProviderName, StringComparison.Ordinal)
          374  +#endif
          375  +                ))
          376  +            {
          377  +                return true;
          378  +            }
          379  +
          380  +            return false;
          381  +        }
          382  +        #endregion
          383  +
          384  +        ///////////////////////////////////////////////////////////////////////
          385  +
          386  +        #region Core Option Handling
          387  +        /// <summary>
          388  +        /// This method returns the current list of option keys supported by
          389  +        /// the System.Data.SQLite design-time components.
          390  +        /// </summary>
          391  +        /// <returns>
          392  +        /// An <see cref="IEnumerable{T}" /> of strings containing the list of
          393  +        /// option keys supported by the System.Data.SQLite design-time
          394  +        /// components -OR- null in the event of any failure.
          395  +        /// </returns>
          396  +        public static IEnumerable<string> GetKeys(
          397  +            bool reset
          398  +            )
          399  +        {
          400  +            lock (syncRoot) /* TRANSACTIONAL */
          401  +            {
          402  +                Initialize(reset);
          403  +
          404  +                return (options != null) ?
          405  +                    new List<string>(options.Keys) : null;
          406  +            }
          407  +        }
          408  +
          409  +        ///////////////////////////////////////////////////////////////////////
          410  +
          411  +        /// <summary>
          412  +        /// This method determines if the specified option key is supported by
          413  +        /// this class.
          414  +        /// </summary>
          415  +        /// <param name="key">
          416  +        /// The name ("key") of the configuration option.
          417  +        /// </param>
          418  +        /// <returns>
          419  +        /// Non-zero if the specified option key is supported by this class.
          420  +        /// </returns>
          421  +        public static bool HaveKey(
          422  +            string key
          423  +            )
          424  +        {
          425  +            lock (syncRoot)
          426  +            {
          427  +                if ((key == null) || (options == null))
          428  +                    return false;
          429  +
          430  +                return options.ContainsKey(key);
          431  +            }
          432  +        }
          433  +
          434  +        ///////////////////////////////////////////////////////////////////////
          435  +
          436  +        /// <summary>
          437  +        /// This method attempts to query and return the current value of the
          438  +        /// specified option key.
          439  +        /// </summary>
          440  +        /// <param name="key">
          441  +        /// The name ("key") of the configuration option.
          442  +        /// </param>
          443  +        /// <param name="value">
          444  +        /// Upon success, the current value for the configuration option;
          445  +        /// otherwise, null.
          446  +        /// </param>
          447  +        /// <returns>
          448  +        /// Non-zero for success; otherwise, zero.
          449  +        /// </returns>
          450  +        public static bool GetValue(
          451  +            string key,
          452  +            out string value
          453  +            )
          454  +        {
          455  +            lock (syncRoot)
          456  +            {
          457  +                value = null;
          458  +
          459  +                if ((key == null) || (options == null))
          460  +                    return false;
          461  +
          462  +                if (options.TryGetValue(key, out value))
          463  +                    return true;
          464  +
          465  +                return false;
          466  +            }
          467  +        }
          468  +
          469  +        ///////////////////////////////////////////////////////////////////////
          470  +
          471  +        /// <summary>
          472  +        /// This method attempts to set the value of the specified option key.
          473  +        /// </summary>
          474  +        /// <param name="key">
          475  +        /// The name ("key") of the configuration option.
          476  +        /// </param>
          477  +        /// <param name="value">
          478  +        /// The new value for the configuration option.
          479  +        /// </param>
          480  +        /// <returns>
          481  +        /// Non-zero for success; otherwise, zero.
          482  +        /// </returns>
          483  +        public static bool SetValue(
          484  +            string key,
          485  +            string value
          486  +            )
          487  +        {
          488  +            lock (syncRoot)
          489  +            {
          490  +                if ((key == null) || (options == null))
          491  +                    return false;
          492  +
          493  +                options[key] = value;
          494  +                return true;
          495  +            }
          496  +        }
          497  +        #endregion
          498  +
          499  +        ///////////////////////////////////////////////////////////////////////
          500  +
          501  +        #region Stream Handling
          502  +        /// <summary>
          503  +        /// This method attempts to read an option value from the specified
          504  +        /// stream.  The stream must be readable.  After this method returns,
          505  +        /// the stream may no longer be usable.
          506  +        /// </summary>
          507  +        /// <param name="stream">
          508  +        /// The stream to read the option value from.
          509  +        /// </param>
          510  +        /// <param name="value">
          511  +        /// Upon success, the read value for the configuration option;
          512  +        /// otherwise, null.
          513  +        /// </param>
          514  +        /// <returns>
          515  +        /// Non-zero for success; otherwise, zero.
          516  +        /// </returns>
          517  +        public static bool ReadValue(
          518  +            Stream stream,
          519  +            out string value
          520  +            )
          521  +        {
          522  +            value = null;
          523  +
          524  +            if ((stream == null) || !stream.CanRead)
          525  +                return false;
          526  +
          527  +            try
          528  +            {
          529  +                using (StreamReader streamReader = new StreamReader(stream))
          530  +                {
          531  +                    value = streamReader.ReadToEnd();
          532  +                    return true;
          533  +                }
          534  +            }
          535  +            catch (Exception)
          536  +            {
          537  +                // do nothing.
          538  +            }
          539  +
          540  +            return false;
          541  +        }
          542  +
          543  +        ///////////////////////////////////////////////////////////////////////
          544  +
          545  +        /// <summary>
          546  +        /// This method attempts to write an option value to the specified
          547  +        /// stream.  The stream must be writable.  After this method returns,
          548  +        /// the stream may no longer be usable.
          549  +        /// </summary>
          550  +        /// <param name="stream">
          551  +        /// The stream to write the option value to.
          552  +        /// </param>
          553  +        /// <param name="value">
          554  +        /// The option value to be written.  This value may be null.
          555  +        /// </param>
          556  +        /// <returns>
          557  +        /// Non-zero for success; otherwise, zero.
          558  +        /// </returns>
          559  +        public static bool WriteValue(
          560  +            Stream stream,
          561  +            string value
          562  +            )
          563  +        {
          564  +            if ((stream == null) || !stream.CanWrite)
          565  +                return false;
          566  +
          567  +            try
          568  +            {
          569  +                using (StreamWriter streamWriter = new StreamWriter(stream))
          570  +                {
          571  +                    streamWriter.Write(value);
          572  +                    return true;
          573  +                }
          574  +            }
          575  +            catch (Exception)
          576  +            {
          577  +                // do nothing.
          578  +            }
          579  +
          580  +            return false;
          581  +        }
          582  +        #endregion
          583  +        #endregion
          584  +    }
          585  +}

Changes to SQLite.Designer/SQLitePackage.cs.

     1      1   /********************************************************
     2      2    * ADO.NET 2.0 Data Provider for SQLite Version 3.X
     3      3    * Written by Robert Simpson (robert@blackcastlesoft.com)
     4         - * 
            4  + *
     5      5    * Released to the public domain, use at your own risk!
     6      6    ********************************************************/
     7      7   
     8      8   namespace SQLite.Designer
     9      9   {
    10     10     using System;
           11  +  using System.Collections.Generic;
           12  +  using System.IO;
    11     13     using Microsoft.VisualStudio.Shell;
    12     14     using System.Runtime.InteropServices;
    13     15     using System.ComponentModel.Design;
    14     16     using Microsoft.VisualStudio.Shell.Interop;
    15     17   
    16     18     /// <summary>
    17     19     /// Ideally we'd be a package provider, but the VS Express Editions don't support us, so this class
................................................................................
    18     20     /// exists so that in the future we can perhaps work with the Express Editions.
    19     21     /// </summary>
    20     22     [Guid("DCBE6C8D-0E57-4099-A183-98FF74C64D9C")]
    21     23     internal sealed class SQLitePackage : Package
    22     24     {
    23     25       public SQLitePackage()
    24     26       {
           27  +        IEnumerable<string> keys = SQLiteOptions.GetKeys(true);
           28  +
           29  +        if (keys != null)
           30  +        {
           31  +            foreach (string key in keys)
           32  +            {
           33  +                if (key == null)
           34  +                    continue;
           35  +
           36  +                AddOptionKey(key);
           37  +            }
           38  +        }
    25     39       }
    26     40   
    27     41       protected override void Initialize()
    28     42       {
    29     43         IServiceContainer sc = (IServiceContainer)this;
    30     44         sc.AddService(typeof(SQLiteProviderObjectFactory), new ServiceCreatorCallback(CreateService), true);
    31     45   
    32     46         ToolboxInitialized += new EventHandler(SQLitePackage_ToolboxInitialized);
    33     47         ToolboxUpgraded += new EventHandler(SQLitePackage_ToolboxUpgraded);
    34     48         base.Initialize();
    35     49       }
           50  +
           51  +    protected override void OnLoadOptions(string key, Stream stream)
           52  +    {
           53  +        if (SQLiteOptions.HaveKey(key))
           54  +        {
           55  +            string value;
           56  +
           57  +            if (SQLiteOptions.ReadValue(stream, out value) &&
           58  +                SQLiteOptions.IsValidValue(key, value))
           59  +            {
           60  +                SQLiteOptions.SetValue(key, value);
           61  +            }
           62  +
           63  +            return;
           64  +        }
           65  +
           66  +        base.OnLoadOptions(key, stream);
           67  +    }
           68  +
           69  +    protected override void OnSaveOptions(string key, Stream stream)
           70  +    {
           71  +        if (SQLiteOptions.HaveKey(key))
           72  +        {
           73  +            string value;
           74  +
           75  +            if (SQLiteOptions.GetValue(key, out value) &&
           76  +                SQLiteOptions.IsValidValue(key, value) &&
           77  +                !SQLiteOptions.IsDefaultValue(key, value))
           78  +            {
           79  +                SQLiteOptions.WriteValue(stream, value);
           80  +            }
           81  +
           82  +            return;
           83  +        }
           84  +
           85  +        base.OnSaveOptions(key, stream);
           86  +    }
    36     87   
    37     88       void SQLitePackage_ToolboxUpgraded(object sender, EventArgs e)
    38     89       {
    39     90         IVsToolbox vstbx = GetService(typeof(SVsToolbox)) as IVsToolbox;
    40     91   
    41     92         vstbx.RemoveTab("SQLite");
    42     93   

Changes to Setup/data/SQLite.iss.

   208    208   
   209    209   #if Year != "2005" && Year != "2008"
   210    210   #if Year == "2010"
   211    211   Components: Application\EF6; Source: ..\..\Externals\EntityFramework\lib\net40\EntityFramework.dll; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete
   212    212   #elif Year == "2012" || Year == "2013"
   213    213   Components: Application\EF6; Source: ..\..\Externals\EntityFramework\lib\net45\EntityFramework.dll; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete
   214    214   #endif
          215  +
          216  +#if Pos("NativeOnly", AppConfiguration) == 0
          217  +Components: Application\EF6; Tasks: gac; Source: ..\..\bin\{#Year}\{#BaseConfiguration}\bin\System.Data.SQLite.EF6.dll; DestDir: {app}\GAC; StrongAssemblyName: "System.Data.SQLite.EF6, Version={#AppVersion}, Culture=neutral, PublicKeyToken={#AppPublicKey}, ProcessorArchitecture=MSIL"; Flags: restartreplace uninsrestartdelete uninsnosharedfileprompt sharedfile gacinstall
          218  +#endif
   215    219   
   216    220   Components: Application\EF6; Source: ..\..\bin\{#Year}\{#BaseConfiguration}\bin\System.Data.SQLite.EF6.dll; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete
   217    221   Components: Application\EF6 and Application\Symbols; Source: ..\..\bin\{#Year}\{#BaseConfiguration}\bin\System.Data.SQLite.EF6.pdb; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete
   218    222   #endif
   219    223   
   220    224   #if Pos("NativeOnly", AppConfiguration) != 0
   221    225   Components: Application\Core\{#AppProcessor}; Source: ..\..\bin\{#Year}\{#AppPlatform}\{#AppConfiguration}\SQLite.Interop.dll; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete

Changes to Tests/data/Installer_Test_Vs2005.log.

    58     58   Installer.exe: #58: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionProperties"
    59     59   Installer.exe: #59: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionSupport"
    60     60   Installer.exe: #60: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    61     61   Installer.exe: #61: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    62     62   Installer.exe: #62: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\8.0", writable = False
    63     63   Installer.exe: #63: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0", name = "InstallDir", defaultValue = <null>
    64     64   Installer.exe: #64: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 8} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 8} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    65         -Installer.exe: #65: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesSet = 23, keyValuesDeleted = 0
           65  +Installer.exe: #65: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesRead = 5, keyValuesWritten = 23, keyValuesDeleted = 0
    66     66   Installer.exe: #66: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
    67     67   Installer.exe: #67: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2008.log.

    68     68   Installer.exe: #68: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionProperties"
    69     69   Installer.exe: #69: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionSupport"
    70     70   Installer.exe: #70: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    71     71   Installer.exe: #71: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    72     72   Installer.exe: #72: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\9.0", writable = False
    73     73   Installer.exe: #73: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0", name = "InstallDir", defaultValue = <null>
    74     74   Installer.exe: #74: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 9.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 9.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    75         -Installer.exe: #75: Installer.Main: subKeysCreated = 13, subKeysDeleted = 2, keyValuesSet = 24, keyValuesDeleted = 0
           75  +Installer.exe: #75: Installer.Main: subKeysCreated = 13, subKeysDeleted = 2, keyValuesRead = 6, keyValuesWritten = 24, keyValuesDeleted = 0
    76     76   Installer.exe: #76: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
    77     77   Installer.exe: #77: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2010.log.

    61     61   Installer.exe: #61: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionProperties"
    62     62   Installer.exe: #62: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionSupport"
    63     63   Installer.exe: #63: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    64     64   Installer.exe: #64: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    65     65   Installer.exe: #65: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\10.0", writable = False
    66     66   Installer.exe: #66: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0", name = "InstallDir", defaultValue = <null>
    67     67   Installer.exe: #67: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 10.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 10.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    68         -Installer.exe: #68: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesSet = 23, keyValuesDeleted = 0
           68  +Installer.exe: #68: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesRead = 5, keyValuesWritten = 23, keyValuesDeleted = 0
    69     69   Installer.exe: #69: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
    70     70   Installer.exe: #70: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2012.log.

    61     61   Installer.exe: #61: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionProperties"
    62     62   Installer.exe: #62: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionSupport"
    63     63   Installer.exe: #63: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    64     64   Installer.exe: #64: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    65     65   Installer.exe: #65: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\11.0", writable = False
    66     66   Installer.exe: #66: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0", name = "InstallDir", defaultValue = <null>
    67     67   Installer.exe: #67: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 11.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 11.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    68         -Installer.exe: #68: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesSet = 23, keyValuesDeleted = 0
           68  +Installer.exe: #68: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesRead = 5, keyValuesWritten = 23, keyValuesDeleted = 0
    69     69   Installer.exe: #69: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
    70     70   Installer.exe: #70: Installer.Main: Success.

Changes to Tests/data/Installer_Test_Vs2013.log.

    61     61   Installer.exe: #61: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionProperties"
    62     62   Installer.exe: #62: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataConnectionSupport"
    63     63   Installer.exe: #63: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataObjectSupport"
    64     64   Installer.exe: #64: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\DataProviders\{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}", subKeyName = "SupportedObjects\DataViewSupport"
    65     65   Installer.exe: #65: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\12.0", writable = False
    66     66   Installer.exe: #66: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0", name = "InstallDir", defaultValue = <null>
    67     67   Installer.exe: #67: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 12.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 12.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    68         -Installer.exe: #68: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesSet = 23, keyValuesDeleted = 0
           68  +Installer.exe: #68: Installer.Main: subKeysCreated = 12, subKeysDeleted = 1, keyValuesRead = 5, keyValuesWritten = 23, keyValuesDeleted = 0
    69     69   Installer.exe: #69: Installer.Main: filesCreated = 1, filesModified = 2, filesDeleted = 0
    70     70   Installer.exe: #70: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2005.log.

    27     27   Installer.exe: #27: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\8.0", writable = False
    28     28   Installer.exe: #28: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0", subKeyName = "DataProviders", writable = True
    29     29   Installer.exe: #29: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    30     30   Installer.exe: #30: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\8.0", writable = False
    31     31   Installer.exe: #31: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\8.0", name = "InstallDir", defaultValue = <null>
    32     32   Installer.exe: #32: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v8.0 'setup' mode to refresh its configuration.
    33     33   Installer.exe: #33: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 8} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 8} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    34         -Installer.exe: #34: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesSet = 0, keyValuesDeleted = 1
           34  +Installer.exe: #34: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    35     35   Installer.exe: #35: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
    36     36   Installer.exe: #36: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2008.log.

    34     34   Installer.exe: #34: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\9.0", writable = False
    35     35   Installer.exe: #35: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0", subKeyName = "DataProviders", writable = True
    36     36   Installer.exe: #36: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    37     37   Installer.exe: #37: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\9.0", writable = False
    38     38   Installer.exe: #38: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\9.0", name = "InstallDir", defaultValue = <null>
    39     39   Installer.exe: #39: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v9.0 'setup' mode to refresh its configuration.
    40     40   Installer.exe: #40: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 9.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 9.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    41         -Installer.exe: #41: Installer.Main: subKeysCreated = 0, subKeysDeleted = 6, keyValuesSet = 0, keyValuesDeleted = 1
           41  +Installer.exe: #41: Installer.Main: subKeysCreated = 0, subKeysDeleted = 6, keyValuesRead = 6, keyValuesWritten = 0, keyValuesDeleted = 1
    42     42   Installer.exe: #42: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
    43     43   Installer.exe: #43: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2010.log.

    30     30   Installer.exe: #30: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\10.0", writable = False
    31     31   Installer.exe: #31: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0", subKeyName = "DataProviders", writable = True
    32     32   Installer.exe: #32: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    33     33   Installer.exe: #33: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\10.0", writable = False
    34     34   Installer.exe: #34: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\10.0", name = "InstallDir", defaultValue = <null>
    35     35   Installer.exe: #35: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v10.0 'setup' mode to refresh its configuration.
    36     36   Installer.exe: #36: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 10.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 10.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    37         -Installer.exe: #37: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesSet = 0, keyValuesDeleted = 1
           37  +Installer.exe: #37: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    38     38   Installer.exe: #38: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
    39     39   Installer.exe: #39: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2012.log.

    30     30   Installer.exe: #30: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\11.0", writable = False
    31     31   Installer.exe: #31: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0", subKeyName = "DataProviders", writable = True
    32     32   Installer.exe: #32: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    33     33   Installer.exe: #33: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\11.0", writable = False
    34     34   Installer.exe: #34: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\11.0", name = "InstallDir", defaultValue = <null>
    35     35   Installer.exe: #35: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v11.0 'setup' mode to refresh its configuration.
    36     36   Installer.exe: #36: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 11.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 11.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    37         -Installer.exe: #37: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesSet = 0, keyValuesDeleted = 1
           37  +Installer.exe: #37: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    38     38   Installer.exe: #38: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
    39     39   Installer.exe: #39: Installer.Main: Success.

Changes to Tests/data/Uninstaller_Test_Vs2013.log.

    30     30   Installer.exe: #30: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\12.0", writable = False
    31     31   Installer.exe: #31: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0", subKeyName = "DataProviders", writable = True
    32     32   Installer.exe: #32: RegistryHelper.DeleteSubKeyTree: rootKey = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0\DataProviders", subKeyName = "{0ebaab6e-ca80-4b4a-8ddf-cbe6bf058c70}"
    33     33   Installer.exe: #33: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software${wow64}\Microsoft\VisualStudio\12.0", writable = False
    34     34   Installer.exe: #34: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software${wow64}\Microsoft\VisualStudio\12.0", name = "InstallDir", defaultValue = <null>
    35     35   Installer.exe: #35: Installer.RemoveVsDevEnvSetup: Preparing to run Visual Studio v12.0 'setup' mode to refresh its configuration.
    36     36   Installer.exe: #36: Installer.AddVsDevEnvSetup: fileName = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 12.0} Common7 IDE devenv.exe]]", arguments = "/setup", workingDirectory = "[file nativename [file join [expr {$is64 ? ${::env(ProgramFiles(x86))} : $::env(ProgramFiles)}] {Microsoft Visual Studio 12.0} Common7 IDE]]\", useShellExecute = False, redirectStandardOutput = True, redirectStandardError = True
    37         -Installer.exe: #37: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesSet = 0, keyValuesDeleted = 1
           37  +Installer.exe: #37: Installer.Main: subKeysCreated = 0, subKeysDeleted = 5, keyValuesRead = 5, keyValuesWritten = 0, keyValuesDeleted = 1
    38     38   Installer.exe: #38: Installer.Main: filesCreated = 1, filesModified = 1, filesDeleted = 0
    39     39   Installer.exe: #39: Installer.Main: Success.

Changes to readme.htm.

   141    141   the DbProviderFactories methods, you must add the following segment into your application's
   142    142   app.config file:<br />
   143    143   <pre>
   144    144   &lt;configuration&gt;
   145    145       &lt;system.data&gt;
   146    146           &lt;DbProviderFactories&gt;
   147    147               &lt;remove invariant="System.Data.SQLite" /&gt;
   148         -            &lt;add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite"
          148  +            &lt;add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite"
   149    149                    type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /&gt;
   150    150           &lt;/DbProviderFactories&gt;
   151    151       &lt;/system.data&gt;
   152    152   &lt;/configuration&gt;
   153    153   </pre>
   154    154   <p>
   155    155   See the help documentation for further details on implementing both version-specific

Changes to test/app.config.

     1      1   <configuration>
     2      2     <system.data>
     3      3       <DbProviderFactories>
     4      4         <remove invariant="System.Data.SQLite" />
     5         -      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
            5  +      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
     6      6       </DbProviderFactories>
     7      7     </system.data>
     8      8   </configuration>

Changes to testlinq/2008/LINQ/App.config.

     1      1   <?xml version="1.0"?>
     2      2   <configuration>
     3      3     <system.data>
     4      4       <DbProviderFactories>
     5      5         <remove invariant="System.Data.SQLite" />
     6      6         <remove invariant="System.Data.SQLite.Linq" />
     7         -      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".Net Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
            7  +      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
     8      8       </DbProviderFactories>
     9      9     </system.data>
    10     10     <connectionStrings>
    11     11       <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2008.csdl|res://*/NorthwindModel.Linq.2008.ssdl|res://*/NorthwindModel.Linq.2008.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
    12     12     </connectionStrings>
    13     13   </configuration>

Changes to testlinq/2010/EF6/App.config.

     3      3     <configSections>
     4      4       <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
     5      5     </configSections>
     6      6     <system.data>
     7      7       <DbProviderFactories>
     8      8         <remove invariant="System.Data.SQLite" />
     9      9         <remove invariant="System.Data.SQLite.EF6" />
    10         -      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".Net Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
           10  +      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    11     11       </DbProviderFactories>
    12     12     </system.data>
    13     13     <connectionStrings>
    14     14       <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2010.csdl|res://*/NorthwindModel.EF6.2010.ssdl|res://*/NorthwindModel.EF6.2010.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
    15     15     </connectionStrings>
    16     16     <entityFramework>
    17     17       <providers>
    18     18         <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    19     19       </providers>
    20     20     </entityFramework>
    21     21   </configuration>

Changes to testlinq/2010/LINQ/App.config.

     1      1   <?xml version="1.0"?>
     2      2   <configuration>
     3      3     <system.data>
     4      4       <DbProviderFactories>
     5      5         <remove invariant="System.Data.SQLite" />
     6      6         <remove invariant="System.Data.SQLite.Linq" />
     7         -      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".Net Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
            7  +      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
     8      8       </DbProviderFactories>
     9      9     </system.data>
    10     10     <connectionStrings>
    11     11       <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2010.csdl|res://*/NorthwindModel.Linq.2010.ssdl|res://*/NorthwindModel.Linq.2010.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
    12     12     </connectionStrings>
    13     13   </configuration>

Changes to testlinq/2012/EF6/App.config.

     3      3     <configSections>
     4      4       <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
     5      5     </configSections>
     6      6     <system.data>
     7      7       <DbProviderFactories>
     8      8         <remove invariant="System.Data.SQLite" />
     9      9         <remove invariant="System.Data.SQLite.EF6" />
    10         -      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".Net Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
           10  +      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    11     11       </DbProviderFactories>
    12     12     </system.data>
    13     13     <connectionStrings>
    14     14       <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2012.csdl|res://*/NorthwindModel.EF6.2012.ssdl|res://*/NorthwindModel.EF6.2012.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
    15     15     </connectionStrings>
    16     16     <entityFramework>
    17     17       <providers>
    18     18         <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    19     19       </providers>
    20     20     </entityFramework>
    21     21   </configuration>

Changes to testlinq/2012/LINQ/App.config.

     1      1   <?xml version="1.0"?>
     2      2   <configuration>
     3      3     <system.data>
     4      4       <DbProviderFactories>
     5      5         <remove invariant="System.Data.SQLite" />
     6      6         <remove invariant="System.Data.SQLite.Linq" />
     7         -      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".Net Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
            7  +      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
     8      8       </DbProviderFactories>
     9      9     </system.data>
    10     10     <connectionStrings>
    11     11       <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2012.csdl|res://*/NorthwindModel.Linq.2012.ssdl|res://*/NorthwindModel.Linq.2012.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
    12     12     </connectionStrings>
    13     13   </configuration>

Changes to testlinq/2013/EF6/App.config.

     3      3     <configSections>
     4      4       <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
     5      5     </configSections>
     6      6     <system.data>
     7      7       <DbProviderFactories>
     8      8         <remove invariant="System.Data.SQLite" />
     9      9         <remove invariant="System.Data.SQLite.EF6" />
    10         -      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".Net Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
           10  +      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    11     11       </DbProviderFactories>
    12     12     </system.data>
    13     13     <connectionStrings>
    14     14       <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.EF6.2013.csdl|res://*/NorthwindModel.EF6.2013.ssdl|res://*/NorthwindModel.EF6.2013.msl;provider=System.Data.SQLite.EF6;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
    15     15     </connectionStrings>
    16     16     <entityFramework>
    17     17       <providers>
    18     18         <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    19     19       </providers>
    20     20     </entityFramework>
    21     21   </configuration>

Changes to testlinq/2013/LINQ/App.config.

     1      1   <?xml version="1.0"?>
     2      2   <configuration>
     3      3     <system.data>
     4      4       <DbProviderFactories>
     5      5         <remove invariant="System.Data.SQLite" />
     6      6         <remove invariant="System.Data.SQLite.Linq" />
     7         -      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".Net Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
            7  +      <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
     8      8       </DbProviderFactories>
     9      9     </system.data>
    10     10     <connectionStrings>
    11     11       <add name="northwindEFEntities" connectionString="metadata=res://*/NorthwindModel.Linq.2013.csdl|res://*/NorthwindModel.Linq.2013.ssdl|res://*/NorthwindModel.Linq.2013.msl;provider=System.Data.SQLite.Linq;provider connection string=&quot;data source=.\northwindEF.db&quot;" providerName="System.Data.EntityClient" />
    12     12     </connectionStrings>
    13     13   </configuration>

Changes to tools/install/Installer.cs.

    93     93   
    94     94       ///////////////////////////////////////////////////////////////////////////
    95     95   
    96     96       #region Public Enumerations
    97     97       [Flags()]
    98     98       public enum InstallFlags
    99     99       {
   100         -        #region Normal Flags
          100  +        #region Normal Values
   101    101           None = 0x0,
   102         -        GlobalAssemblyCache = 0x1,
   103         -        AssemblyFolders = 0x2,
   104         -        DbProviderFactory = 0x4,
   105         -        VsPackage = 0x8,
   106         -        VsPackageGlobalAssemblyCache = 0x10,
   107         -        VsDataSource = 0x20,
   108         -        VsDataProvider = 0x40,
   109         -        VsDevEnvSetup = 0x80,
          102  +        CoreGlobalAssemblyCache = 0x1,
          103  +        LinqGlobalAssemblyCache = 0x2,
          104  +        Ef6GlobalAssemblyCache = 0x4,
          105  +        AssemblyFolders = 0x8,
          106  +        DbProviderFactory = 0x10,
          107  +        VsPackage = 0x20,
          108  +        VsPackageGlobalAssemblyCache = 0x40,
          109  +        VsDataSource = 0x80,
          110  +        VsDataProvider = 0x100,
          111  +        VsDevEnvSetup = 0x200,
   110    112           #endregion
   111    113   
   112    114           ///////////////////////////////////////////////////////////////////////
   113    115   
   114         -        #region Composite Flags
   115         -        Framework = GlobalAssemblyCache | AssemblyFolders |
          116  +        #region Composite Values
          117  +        FrameworkGlobalAssemblyCache = CoreGlobalAssemblyCache |
          118  +                                       LinqGlobalAssemblyCache |
          119  +                                       Ef6GlobalAssemblyCache,
          120  +
          121  +        ///////////////////////////////////////////////////////////////////////
          122  +
          123  +        Framework = FrameworkGlobalAssemblyCache | AssemblyFolders |
   116    124                       DbProviderFactory,
   117    125   
   118    126           ///////////////////////////////////////////////////////////////////////
   119    127   
   120    128           Vs = VsPackage | VsPackageGlobalAssemblyCache | VsDataSource |
   121    129                VsDataProvider | VsDevEnvSetup,
   122    130   
   123    131           ///////////////////////////////////////////////////////////////////////
   124    132   
          133  +        AllGlobalAssemblyCache = FrameworkGlobalAssemblyCache |
          134  +                                 VsPackageGlobalAssemblyCache,
          135  +
          136  +        ///////////////////////////////////////////////////////////////////////
          137  +
   125    138           All = Framework | Vs,
   126    139   
   127    140           ///////////////////////////////////////////////////////////////////////
   128    141   
   129         -        AllExceptGlobalAssemblyCache = All & ~(GlobalAssemblyCache |
   130         -                                       VsPackageGlobalAssemblyCache),
          142  +        AllExceptGlobalAssemblyCache = All & ~AllGlobalAssemblyCache,
   131    143           #endregion
   132    144   
   133    145           ///////////////////////////////////////////////////////////////////////
   134    146   
          147  +        #region Suggested Default Values
   135    148           Default = All
          149  +        #endregion
          150  +    }
          151  +
          152  +    ///////////////////////////////////////////////////////////////////////////
          153  +
          154  +    [Flags()]
          155  +    public enum ProviderFlags
          156  +    {
          157  +        #region Normal Values
          158  +        None = 0x0,
          159  +        SystemEf6MustBeGlobal = 0x1,
          160  +        DidLinqForceTrace = 0x2,
          161  +        DidEf6ForceTrace = 0x4,
          162  +        DidEf6ResolveTrace = 0x8,
          163  +        ForceLinqEnabled = 0x10,
          164  +        ForceLinqDisabled = 0x20,
          165  +        ForceEf6Enabled = 0x40,
          166  +        ForceEf6Disabled = 0x80,
          167  +        #endregion
          168  +
          169  +        ///////////////////////////////////////////////////////////////////////
          170  +
          171  +        #region Suggested Default Values
          172  +        Default = None
          173  +        #endregion
   136    174       }
   137    175   
   138    176       ///////////////////////////////////////////////////////////////////////////
   139    177   
   140    178       [Flags()]
   141    179       public enum TracePriority
   142    180       {
          181  +        #region Normal Values
   143    182           None = 0x0,
   144    183           Lowest = 0x1,
   145    184           Lower = 0x2,
   146    185           Low = 0x4,
   147    186           MediumLow = 0x8,
   148    187           Medium = 0x10,
   149    188           MediumHigh = 0x20,
   150    189           High = 0x40,
   151    190           Higher = 0x80,
   152    191           Highest = 0x100,
          192  +        #endregion
          193  +
          194  +        ///////////////////////////////////////////////////////////////////////
          195  +
          196  +        #region Suggested Default Flags
   153    197           Default = Medium
          198  +        #endregion
   154    199       }
   155    200       #endregion
   156    201   
   157    202       ///////////////////////////////////////////////////////////////////////////
   158    203   
   159    204       #region Installer Class
   160    205   #if NET_40 || NET_45 || NET_451
................................................................................
   835    880                   }
   836    881               }
   837    882               #endregion
   838    883   
   839    884               ///////////////////////////////////////////////////////////////////
   840    885   
   841    886               #region Public "Registry" Methods
          887  +#if false
   842    888               public object GetValue(
   843    889                   string keyName,
   844    890                   string valueName,
   845    891                   object defaultValue
   846    892                   )
   847    893               {
   848    894                   CheckDisposed();
................................................................................
   876    922               {
   877    923                   CheckDisposed();
   878    924                   CheckReadOnly();
   879    925   
   880    926                   if (!whatIf)
   881    927                       Registry.SetValue(keyName, valueName, value, valueKind);
   882    928               }
          929  +#endif
   883    930               #endregion
   884    931   
   885    932               ///////////////////////////////////////////////////////////////////
   886    933   
   887    934               #region Private Methods
   888    935               private void CheckReadOnly()
   889    936               {
................................................................................
  1486   1533               public static int SubKeysDeleted
  1487   1534               {
  1488   1535                   get { return subKeysDeleted; }
  1489   1536               }
  1490   1537   
  1491   1538               ///////////////////////////////////////////////////////////////////
  1492   1539   
  1493         -            private static int keyValuesSet;
  1494         -            public static int KeyValuesSet
         1540  +            private static int keyValuesRead;
         1541  +            public static int KeyValuesRead
  1495   1542               {
  1496         -                get { return keyValuesSet; }
         1543  +                get { return keyValuesRead; }
         1544  +            }
         1545  +
         1546  +            ///////////////////////////////////////////////////////////////////
         1547  +
         1548  +            private static int keyValuesWritten;
         1549  +            public static int KeyValuesWritten
         1550  +            {
         1551  +                get { return keyValuesWritten; }
  1497   1552               }
  1498   1553   
  1499   1554               ///////////////////////////////////////////////////////////////////
  1500   1555   
  1501   1556               private static int keyValuesDeleted;
  1502   1557               public static int KeyValuesDeleted
  1503   1558               {
................................................................................
  1682   1737                   if (verbose)
  1683   1738                       TraceOps.DebugAndTrace(TracePriority.High,
  1684   1739                           debugCallback, traceCallback, String.Format(
  1685   1740                           "key = {0}, name = {1}, defaultValue = {2}",
  1686   1741                           ForDisplay(key), ForDisplay(name),
  1687   1742                           ForDisplay(defaultValue)), traceCategory);
  1688   1743   
  1689         -                return key.GetValue(name, defaultValue);
         1744  +                object value = key.GetValue(name, defaultValue);
         1745  +
         1746  +                keyValuesRead++;
         1747  +
         1748  +                return value;
  1690   1749               }
  1691   1750   
  1692   1751               ///////////////////////////////////////////////////////////////////
  1693   1752   
  1694   1753               [MethodImpl(MethodImplOptions.NoInlining)]
  1695   1754               public static void SetValue(
  1696   1755                   MockRegistryKey key,
................................................................................
  1709   1768                           "key = {0}, name = {1}, value = {2}",
  1710   1769                           ForDisplay(key), ForDisplay(name), ForDisplay(value)),
  1711   1770                           traceCategory);
  1712   1771   
  1713   1772                   if (!whatIf)
  1714   1773                       key.SetValue(name, value);
  1715   1774   
  1716         -                keyValuesSet++;
         1775  +                keyValuesWritten++;
  1717   1776               }
  1718   1777   
  1719   1778               ///////////////////////////////////////////////////////////////////
  1720   1779   
  1721   1780               [MethodImpl(MethodImplOptions.NoInlining)]
  1722   1781               public static void DeleteValue(
  1723   1782                   MockRegistryKey key,
................................................................................
  1822   1881                   // do nothing.
  1823   1882               }
  1824   1883               #endregion
  1825   1884   
  1826   1885               ///////////////////////////////////////////////////////////////////
  1827   1886   
  1828   1887               #region Public Properties
  1829         -            private string configInvariantName;
  1830         -            public string ConfigInvariantName
  1831         -            {
  1832         -                get { return configInvariantName; }
  1833         -                set { configInvariantName = value; }
  1834         -            }
  1835         -
  1836         -            ///////////////////////////////////////////////////////////////////
  1837         -
  1838   1888               private string providerInvariantName;
  1839   1889               public string ProviderInvariantName
  1840   1890               {
  1841   1891                   get { return providerInvariantName; }
  1842   1892                   set { providerInvariantName = value; }
  1843   1893               }
  1844   1894   
................................................................................
  1983   2033                   string designerFileName,
  1984   2034                   string registryVersion,
  1985   2035                   string configVersion,
  1986   2036                   string vsVersionSuffix,
  1987   2037                   string debugFormat,
  1988   2038                   string traceFormat,
  1989   2039                   InstallFlags installFlags,
         2040  +                ProviderFlags providerFlags,
  1990   2041                   TracePriority debugPriority,
  1991   2042                   TracePriority tracePriority,
  1992   2043                   bool perUser,
  1993   2044                   bool install,
  1994   2045                   bool wow64,
  1995   2046                   bool noRuntimeVersion,
  1996   2047                   bool noDesktop,
................................................................................
  2024   2075                   this.designerFileName = designerFileName;
  2025   2076                   this.registryVersion = registryVersion;
  2026   2077                   this.configVersion = configVersion;
  2027   2078                   this.vsVersionSuffix = vsVersionSuffix;
  2028   2079                   this.debugFormat = debugFormat;
  2029   2080                   this.traceFormat = traceFormat;
  2030   2081                   this.installFlags = installFlags;
         2082  +                this.providerFlags = providerFlags;
  2031   2083                   this.debugPriority = debugPriority;
  2032   2084                   this.tracePriority = tracePriority;
  2033   2085                   this.perUser = perUser;
  2034   2086                   this.install = install;
  2035   2087                   this.wow64 = wow64;
  2036   2088                   this.noRuntimeVersion = noRuntimeVersion;
  2037   2089                   this.noDesktop = noDesktop;
................................................................................
  2185   2237                   }
  2186   2238   
  2187   2239                   return null;
  2188   2240               }
  2189   2241   
  2190   2242               ///////////////////////////////////////////////////////////////////
  2191   2243   
  2192         -            private static bool IsSystemEf6AssemblyAvailable()
         2244  +            private static bool IsSystemEf6AssemblyAvailable(
         2245  +                bool trace
         2246  +                )
  2193   2247               {
  2194   2248                   if (systemEf6Assembly != null)
  2195   2249                       return true;
  2196   2250   
  2197   2251                   try
  2198   2252                   {
  2199   2253                       systemEf6Assembly = Assembly.ReflectionOnlyLoad(
  2200   2254                           SystemEf6AssemblyName);
  2201   2255   
  2202   2256                       if (systemEf6Assembly != null)
  2203   2257                       {
  2204         -                        TraceOps.DebugAndTrace(TracePriority.Highest,
  2205         -                            debugCallback, traceCallback, String.Format(
  2206         -                            "Entity Framework 6 assembly was resolved to {0}.",
  2207         -                            ForDisplay(systemEf6Assembly.Location)),
  2208         -                            traceCategory);
         2258  +                        if (trace)
         2259  +                        {
         2260  +                            TraceOps.DebugAndTrace(TracePriority.Highest,
         2261  +                                debugCallback, traceCallback, String.Format(
         2262  +                                "Entity Framework 6 assembly was " +
         2263  +                                "resolved to {0}.", ForDisplay(
         2264  +                                systemEf6Assembly.Location)),
         2265  +                                traceCategory);
         2266  +                        }
  2209   2267   
  2210   2268                           return true;
  2211   2269                       }
  2212   2270                   }
  2213   2271                   catch
  2214   2272                   {
  2215   2273                       // do nothing.
  2216   2274                   }
  2217   2275   
  2218         -                TraceOps.DebugAndTrace(TracePriority.Highest,
  2219         -                    debugCallback, traceCallback,
  2220         -                    "Entity Framework 6 assembly was not resolved.",
  2221         -                    traceCategory);
         2276  +                if (trace)
         2277  +                {
         2278  +                    TraceOps.DebugAndTrace(TracePriority.Highest,
         2279  +                        debugCallback, traceCallback,
         2280  +                        "Entity Framework 6 assembly was not resolved.",
         2281  +                        traceCategory);
         2282  +                }
  2222   2283   
  2223   2284                   return false;
  2224   2285               }
         2286  +
         2287  +            ///////////////////////////////////////////////////////////////////
         2288  +
         2289  +            private static bool IsSystemEf6AssemblyGlobal()
         2290  +            {
         2291  +                if (systemEf6Assembly == null)
         2292  +                    return false;
         2293  +
         2294  +                return systemEf6Assembly.GlobalAssemblyCache;
         2295  +            }
  2225   2296               #endregion
  2226   2297   
  2227   2298               ///////////////////////////////////////////////////////////////////
  2228   2299   
  2229   2300               #region Public Static Methods
  2230   2301               public static void BreakIntoDebugger()
  2231   2302               {
  2232   2303                   Console.WriteLine(
  2233         -                    "Attach a debugger to process {0} and press any key to " +
  2234         -                    "continue.", (thisProcess != null) ?
         2304  +                    "Attach a debugger to process {0} and press " +
         2305  +                    "any key to continue.", (thisProcess != null) ?
  2235   2306                       thisProcess.Id.ToString() : "<unknown>");
  2236   2307   
  2237   2308                   try
  2238   2309                   {
  2239   2310                       Console.ReadKey(true); /* throw */
  2240   2311                   }
  2241   2312                   catch (InvalidOperationException) // Console.ReadKey
................................................................................
  2260   2331                       ref directory, ref coreFileName, ref linqFileName,
  2261   2332                       ref ef6FileName, ref designerFileName);
  2262   2333   
  2263   2334                   return new Configuration(
  2264   2335                       thisAssembly, null, directory, coreFileName, linqFileName,
  2265   2336                       ef6FileName, designerFileName, null, null, null,
  2266   2337                       TraceOps.DebugFormat, TraceOps.TraceFormat,
  2267         -                    InstallFlags.Default, TracePriority.Default,
  2268         -                    TracePriority.Default, false, true, false, false, false,
         2338  +                    InstallFlags.Default, ProviderFlags.Default,
         2339  +                    TracePriority.Default, TracePriority.Default, false, true,
         2340  +                    false, false, false, false, false, false, false, false,
  2269   2341                       false, false, false, false, false, false, false, false,
  2270         -                    false, false, false, false, false, false, true, true,
  2271         -                    false, false, false);
         2342  +                    false, true, true, false, false, false);
  2272   2343               }
  2273   2344   
  2274   2345               ///////////////////////////////////////////////////////////////////
  2275   2346   
  2276   2347               [MethodImpl(MethodImplOptions.NoInlining)]
  2277   2348               public static bool FromArgs(
  2278   2349                   string[] args,
................................................................................
  2929   3000                                       return false;
  2930   3001   
  2931   3002                                   continue;
  2932   3003                               }
  2933   3004   
  2934   3005                               configuration.perUser = (bool)value;
  2935   3006                           }
         3007  +                        else if (MatchOption(newArg, "providerFlags"))
         3008  +                        {
         3009  +                            object value = ParseEnum(
         3010  +                                typeof(ProviderFlags), text, true);
         3011  +
         3012  +                            if (value == null)
         3013  +                            {
         3014  +                                error = TraceOps.DebugAndTrace(
         3015  +                                    TracePriority.Lowest, debugCallback,
         3016  +                                    traceCallback, String.Format(
         3017  +                                    "Invalid provider flags value: {0}",
         3018  +                                    ForDisplay(text)), traceCategory);
         3019  +
         3020  +                                if (strict)
         3021  +                                    return false;
         3022  +
         3023  +                                continue;
         3024  +                            }
         3025  +
         3026  +                            configuration.providerFlags = (ProviderFlags)value;
         3027  +                        }
  2936   3028                           else if (MatchOption(newArg, "registryVersion"))
  2937   3029                           {
  2938   3030                               configuration.registryVersion = text;
  2939   3031                           }
  2940   3032                           else if (MatchOption(newArg, "strict"))
  2941   3033                           {
  2942   3034                               bool? value = ParseBoolean(text);
................................................................................
  3401   3493   
  3402   3494                   return false;
  3403   3495               }
  3404   3496               #endregion
  3405   3497   
  3406   3498               ///////////////////////////////////////////////////////////////////
  3407   3499   
         3500  +            #region Private Methods
         3501  +            private string GetInvariantName()
         3502  +            {
         3503  +                return UseEf6Provider() ? Ef6InvariantName : InvariantName;
         3504  +            }
         3505  +            #endregion
         3506  +
         3507  +            ///////////////////////////////////////////////////////////////////
         3508  +
  3408   3509               #region Public Methods
  3409   3510               public bool HasFlags(
  3410   3511                   InstallFlags hasFlags,
  3411   3512                   bool all
  3412   3513                   )
  3413   3514               {
  3414   3515                   if (all)
................................................................................
  3415   3516                       return ((installFlags & hasFlags) == hasFlags);
  3416   3517                   else
  3417   3518                       return ((installFlags & hasFlags) != InstallFlags.None);
  3418   3519               }
  3419   3520   
  3420   3521               ///////////////////////////////////////////////////////////////////
  3421   3522   
         3523  +            public bool HasFlags(
         3524  +                ProviderFlags hasFlags,
         3525  +                bool all
         3526  +                )
         3527  +            {
         3528  +                if (all)
         3529  +                    return ((providerFlags & hasFlags) == hasFlags);
         3530  +                else
         3531  +                    return ((providerFlags & hasFlags) != ProviderFlags.None);
         3532  +            }
         3533  +
         3534  +            ///////////////////////////////////////////////////////////////////
         3535  +
  3422   3536               public bool IsLinqSupported()
  3423   3537               {
         3538  +                //
         3539  +                // NOTE: Check to see if the caller has forced LINQ support to
         3540  +                //       be enabled -OR- disabled, thereby bypassing the need
         3541  +                //       for "automatic detection" by this method.
         3542  +                //
         3543  +                if (HasFlags(ProviderFlags.ForceLinqEnabled, true))
         3544  +                {
         3545  +                    if (!HasFlags(ProviderFlags.DidLinqForceTrace, true))
         3546  +                    {
         3547  +                        TraceOps.DebugAndTrace(TracePriority.MediumHigh,
         3548  +                            debugCallback, traceCallback,
         3549  +                            "Forced to enable support for \"Linq\".",
         3550  +                            traceCategory);
         3551  +
         3552  +                        providerFlags |= ProviderFlags.DidLinqForceTrace;
         3553  +                    }
         3554  +
         3555  +                    return true;
         3556  +                }
         3557  +                else if (HasFlags(ProviderFlags.ForceLinqDisabled, true))
         3558  +                {
         3559  +                    if (!HasFlags(ProviderFlags.DidLinqForceTrace, true))
         3560  +                    {
         3561  +                        TraceOps.DebugAndTrace(TracePriority.MediumHigh,
         3562  +                            debugCallback, traceCallback,
         3563  +                            "Forced to disable support for \"Linq\".",
         3564  +                            traceCategory);
         3565  +
         3566  +                        providerFlags |= ProviderFlags.DidLinqForceTrace;
         3567  +                    }
         3568  +
         3569  +                    return false;
         3570  +                }
         3571  +
  3424   3572                   //
  3425   3573                   // NOTE: Return non-zero if the System.Data.SQLite.Linq
  3426   3574                   //       assembly should be processed during the install.
  3427   3575                   //       If the target is Visual Studio 2005, this must
  3428   3576                   //       return zero.
  3429   3577                   //
  3430   3578                   return !noNetFx35 || !noNetFx40 || !noNetFx45 || !noNetFx451;
  3431   3579               }
  3432   3580   
  3433   3581               ///////////////////////////////////////////////////////////////////
  3434   3582   
  3435   3583               public bool IsEf6Supported()
  3436   3584               {
         3585  +                //
         3586  +                // NOTE: Check to see if the caller has forced EF6 support to
         3587  +                //       be enabled -OR- disabled, thereby bypassing the need
         3588  +                //       for "automatic detection" by this method.
         3589  +                //
         3590  +                if (HasFlags(ProviderFlags.ForceEf6Enabled, true))
         3591  +                {
         3592  +                    if (!HasFlags(ProviderFlags.DidEf6ForceTrace, true))
         3593  +                    {
         3594  +                        TraceOps.DebugAndTrace(TracePriority.MediumHigh,
         3595  +                            debugCallback, traceCallback,
         3596  +                            "Forced to enable support for \"Ef6\".",
         3597  +                            traceCategory);
         3598  +
         3599  +                        providerFlags |= ProviderFlags.DidEf6ForceTrace;
         3600  +                    }
         3601  +
         3602  +                    return true;
         3603  +                }
         3604  +                else if (HasFlags(ProviderFlags.ForceEf6Disabled, true))
         3605  +                {
         3606  +                    if (!HasFlags(ProviderFlags.DidEf6ForceTrace, true))
         3607  +                    {
         3608  +                        TraceOps.DebugAndTrace(TracePriority.MediumHigh,
         3609  +                            debugCallback, traceCallback,
         3610  +                            "Forced to disable support for \"Ef6\".",
         3611  +                            traceCategory);
         3612  +
         3613  +                        providerFlags |= ProviderFlags.DidEf6ForceTrace;
         3614  +                    }
         3615  +
         3616  +                    return false;
         3617  +                }
         3618  +
  3437   3619                   //
  3438   3620                   // NOTE: Return non-zero if the System.Data.SQLite.EF6
  3439   3621                   //       assembly should be processed during the install.
  3440   3622                   //       If the target is Visual Studio 2005 or Visual
  3441         -                //       Studio 2008, this must return zero.  Also, if
  3442         -                //       the EF6 core assembly is unavailable, this must
  3443         -                //       return zero.
         3623  +                //       Studio 2008, this must return zero.
  3444   3624                   //
  3445   3625                   if (noNetFx40 && noNetFx45 && noNetFx451)
  3446   3626                       return false;
  3447   3627   
  3448         -                return IsSystemEf6AssemblyAvailable();
         3628  +                //
         3629  +                // NOTE: Also, if the EF6 core assembly is unavailable, this
         3630  +                //       must return zero.
         3631  +                //
         3632  +                if (!IsSystemEf6AssemblyAvailable(!HasFlags(
         3633  +                        ProviderFlags.DidEf6ResolveTrace, true)))
         3634  +                {
         3635  +                    providerFlags |= ProviderFlags.DidEf6ResolveTrace;
         3636  +                    return false;
         3637  +                }
         3638  +
         3639  +                //
         3640  +                // NOTE: Finally, if the EF6 core assembly is not available
         3641  +                //       globally [and this is a requirement for the current
         3642  +                //       install], return zero.
         3643  +                //
         3644  +                return HasFlags(ProviderFlags.SystemEf6MustBeGlobal, true) ?
         3645  +                    IsSystemEf6AssemblyGlobal() : true;
  3449   3646               }
  3450   3647   
  3451   3648               ///////////////////////////////////////////////////////////////////
  3452   3649   
  3453         -            public AssemblyName GetCoreAssemblyName() /* REQUIRED */
         3650  +            private bool IsEf6AssemblyGlobal()
         3651  +            {
         3652  +                if (ef6AssemblyName == null)
         3653  +                    return false;
         3654  +
         3655  +                Assembly assembly = Assembly.ReflectionOnlyLoad(
         3656  +                    ef6AssemblyName.ToString());
         3657  +
         3658  +                return (assembly != null) && assembly.GlobalAssemblyCache;
         3659  +            }
         3660  +
         3661  +            ///////////////////////////////////////////////////////////////////
         3662  +
         3663  +            public bool UseEf6Provider()
         3664  +            {
         3665  +                //
         3666  +                // NOTE: We cannot use the EF6 assembly as the provider if it
         3667  +                //       is not supported by this installation.
         3668  +                //
         3669  +                if (!IsEf6Supported())
         3670  +                    return false;
         3671  +
         3672  +                //
         3673  +                // NOTE: For the EF6 assembly to be usable as a provider in
         3674  +                //       the machine configuration file, it must be in the
         3675  +                //       global assembly cache.
         3676  +                //
         3677  +                return IsEf6AssemblyGlobal();
         3678  +            }
         3679  +
         3680  +            ///////////////////////////////////////////////////////////////////
         3681  +
         3682  +            /* REQUIRED */
         3683  +            public AssemblyName GetCoreAssemblyName() /* throw */
  3454   3684               {
  3455   3685                   if (coreAssemblyName == null)
  3456   3686                   {
  3457   3687                       coreAssemblyName = AssemblyName.GetAssemblyName(
  3458   3688                           CoreFileName); /* throw */
  3459   3689                   }
  3460   3690   
  3461   3691                   return coreAssemblyName;
  3462   3692               }
  3463   3693   
  3464   3694               ///////////////////////////////////////////////////////////////////
  3465   3695   
  3466         -            public AssemblyName GetLinqAssemblyName() /* OPTIONAL */
         3696  +            /* OPTIONAL */
         3697  +            public AssemblyName GetLinqAssemblyName() /* throw */
  3467   3698               {
  3468   3699                   if (IsLinqSupported() && (linqAssemblyName == null))
  3469   3700                   {
  3470   3701                       linqAssemblyName = AssemblyName.GetAssemblyName(
  3471   3702                           LinqFileName); /* throw */
  3472   3703                   }
  3473   3704   
  3474   3705                   return linqAssemblyName;
  3475   3706               }
  3476   3707   
  3477   3708               ///////////////////////////////////////////////////////////////////
  3478   3709   
  3479         -            public AssemblyName GetEf6AssemblyName() /* OPTIONAL */
         3710  +            /* OPTIONAL */
         3711  +            public AssemblyName GetEf6AssemblyName() /* throw */
  3480   3712               {
  3481   3713                   if (IsEf6Supported() && (ef6AssemblyName == null))
  3482   3714                   {
  3483   3715                       ef6AssemblyName = AssemblyName.GetAssemblyName(
  3484   3716                           Ef6FileName); /* throw */
  3485   3717                   }
  3486   3718   
  3487   3719                   return ef6AssemblyName;
  3488   3720               }
  3489   3721   
  3490   3722               ///////////////////////////////////////////////////////////////////
  3491   3723   
  3492         -            public AssemblyName GetDesignerAssemblyName() /* REQUIRED */
         3724  +            /* REQUIRED */
         3725  +            public AssemblyName GetDesignerAssemblyName() /* throw */
  3493   3726               {
  3494   3727                   if (designerAssemblyName == null)
  3495   3728                   {
  3496   3729                       designerAssemblyName = AssemblyName.GetAssemblyName(
  3497   3730                           DesignerFileName); /* throw */
  3498   3731                   }
  3499   3732   
  3500   3733                   return designerAssemblyName;
  3501   3734               }
  3502   3735   
  3503   3736               ///////////////////////////////////////////////////////////////////
  3504   3737   
         3738  +            /* REQUIRED */
         3739  +            public AssemblyName GetProviderAssemblyName() /* throw */
         3740  +            {
         3741  +                return UseEf6Provider() ?
         3742  +                    GetEf6AssemblyName() : GetCoreAssemblyName();
         3743  +            }
         3744  +
         3745  +            ///////////////////////////////////////////////////////////////////
         3746  +
  3505   3747               public string GetConfigInvariantName()
  3506   3748               {
  3507         -                return InvariantName;
         3749  +                return GetInvariantName();
  3508   3750               }
  3509   3751   
  3510   3752               ///////////////////////////////////////////////////////////////////
  3511   3753   
  3512   3754               public string GetProviderInvariantName()
  3513   3755               {
  3514         -                return IsEf6Supported() ? Ef6InvariantName : InvariantName;
         3756  +                return GetInvariantName();
  3515   3757               }
  3516   3758   
  3517   3759               ///////////////////////////////////////////////////////////////////
  3518   3760   
  3519   3761               public string GetFactoryTypeName()
  3520   3762               {
  3521         -                return IsEf6Supported() ? Ef6FactoryTypeName : FactoryTypeName;
  3522         -            }
  3523         -
  3524         -            ///////////////////////////////////////////////////////////////////
  3525         -
  3526         -            public AssemblyName GetProviderAssemblyName()
  3527         -            {
  3528         -                return IsEf6Supported() ?
  3529         -                    GetEf6AssemblyName() : GetCoreAssemblyName(); /* throw */
         3763  +                return UseEf6Provider() ? Ef6FactoryTypeName : FactoryTypeName;
  3530   3764               }
  3531   3765   
  3532   3766               ///////////////////////////////////////////////////////////////////
  3533   3767   
  3534   3768               public void Dump(
  3535   3769                   TraceCallback traceCallback
  3536   3770                   )
................................................................................
  3584   3818                       traceCallback(String.Format(NameAndValueFormat,
  3585   3819                           "TraceFormat", ForDisplay(traceFormat)),
  3586   3820                           traceCategory);
  3587   3821   
  3588   3822                       traceCallback(String.Format(NameAndValueFormat,
  3589   3823                           "InstallFlags", ForDisplay(installFlags)),
  3590   3824                           traceCategory);
         3825  +
         3826  +                    traceCallback(String.Format(NameAndValueFormat,
         3827  +                        "ProviderFlags", ForDisplay(providerFlags)),
         3828  +                        traceCategory);
  3591   3829   
  3592   3830                       traceCallback(String.Format(NameAndValueFormat,
  3593   3831                           "DebugPriority", ForDisplay(debugPriority)),
  3594   3832                           traceCategory);
  3595   3833   
  3596   3834                       traceCallback(String.Format(NameAndValueFormat,
  3597   3835                           "TracePriority", ForDisplay(tracePriority)),
................................................................................
  3706   3944                               "AssemblyConfiguration",
  3707   3945                               ForDisplay(GetAssemblyConfiguration(assembly))),
  3708   3946                               traceCategory);
  3709   3947                       }
  3710   3948   
  3711   3949                       ///////////////////////////////////////////////////////////
  3712   3950   
         3951  +                    traceCallback(String.Format(NameAndValueFormat,
         3952  +                        "IsSystemEf6AssemblyAvailable", ForDisplay(
         3953  +                        IsSystemEf6AssemblyAvailable(false))),
         3954  +                        traceCategory);
         3955  +
         3956  +                    traceCallback(String.Format(NameAndValueFormat,
         3957  +                        "IsSystemEf6AssemblyGlobal", ForDisplay(
         3958  +                        IsSystemEf6AssemblyGlobal())),
         3959  +                        traceCategory);
         3960  +
         3961  +                    ///////////////////////////////////////////////////////////
         3962  +
  3713   3963                       traceCallback(String.Format(NameAndValueFormat,
  3714   3964                           "IsLinqSupported", ForDisplay(IsLinqSupported())),
  3715   3965                           traceCategory);
  3716   3966   
  3717   3967                       traceCallback(String.Format(NameAndValueFormat,
  3718   3968                           "IsEf6Supported", ForDisplay(IsEf6Supported())),
  3719   3969                           traceCategory);
         3970  +
         3971  +                    traceCallback(String.Format(NameAndValueFormat,
         3972  +                        "IsEf6AssemblyGlobal", ForDisplay(
         3973  +                        IsEf6AssemblyGlobal())),
         3974  +                        traceCategory);
         3975  +
         3976  +                    traceCallback(String.Format(NameAndValueFormat,
         3977  +                        "UseEf6Provider", ForDisplay(UseEf6Provider())),
         3978  +                        traceCategory);
         3979  +
         3980  +                    ///////////////////////////////////////////////////////////
         3981  +
         3982  +                    try
         3983  +                    {
         3984  +                        traceCallback(String.Format(NameAndValueFormat,
         3985  +                            "GetCoreAssemblyName", ForDisplay(
         3986  +                            GetCoreAssemblyName())), traceCategory);
         3987  +                    }
         3988  +                    catch (Exception e)
         3989  +                    {
         3990  +                        traceCallback(String.Format(NameAndValueFormat,
         3991  +                            "GetCoreAssemblyName", ForDisplay(e)),
         3992  +                            traceCategory);
         3993  +                    }
         3994  +
         3995  +                    ///////////////////////////////////////////////////////////
         3996  +
         3997  +                    try
         3998  +                    {
         3999  +                        traceCallback(String.Format(NameAndValueFormat,
         4000  +                            "GetLinqAssemblyName", ForDisplay(
         4001  +                            GetLinqAssemblyName())), traceCategory);
         4002  +                    }
         4003  +                    catch (Exception e)
         4004  +                    {
         4005  +                        traceCallback(String.Format(NameAndValueFormat,
         4006  +                            "GetLinqAssemblyName", ForDisplay(e)),
         4007  +                            traceCategory);
         4008  +                    }
         4009  +
         4010  +                    ///////////////////////////////////////////////////////////
         4011  +
         4012  +                    try
         4013  +                    {
         4014  +                        traceCallback(String.Format(NameAndValueFormat,
         4015  +                            "GetEf6AssemblyName", ForDisplay(
         4016  +                            GetEf6AssemblyName())), traceCategory);
         4017  +                    }
         4018  +                    catch (Exception e)
         4019  +                    {
         4020  +                        traceCallback(String.Format(NameAndValueFormat,
         4021  +                            "GetEf6AssemblyName", ForDisplay(e)),
         4022  +                            traceCategory);
         4023  +                    }
         4024  +
         4025  +                    ///////////////////////////////////////////////////////////
         4026  +
         4027  +                    try
         4028  +                    {
         4029  +                        traceCallback(String.Format(NameAndValueFormat,
         4030  +                            "GetDesignerAssemblyName", ForDisplay(
         4031  +                            GetDesignerAssemblyName())), traceCategory);
         4032  +                    }
         4033  +                    catch (Exception e)
         4034  +                    {
         4035  +                        traceCallback(String.Format(NameAndValueFormat,
         4036  +                            "GetDesignerAssemblyName", ForDisplay(e)),
         4037  +                            traceCategory);
         4038  +                    }
  3720   4039   
  3721   4040                       ///////////////////////////////////////////////////////////
  3722   4041   
  3723   4042                       traceCallback(String.Format(NameAndValueFormat,
  3724         -                        "GetCoreAssemblyName", ForDisplay(
  3725         -                        GetCoreAssemblyName())), traceCategory);
  3726         -
  3727         -                    traceCallback(String.Format(NameAndValueFormat,
  3728         -                        "GetLinqAssemblyName", ForDisplay(
  3729         -                        GetLinqAssemblyName())), traceCategory);
  3730         -
  3731         -                    traceCallback(String.Format(NameAndValueFormat,
  3732         -                        "GetEf6AssemblyName", ForDisplay(
  3733         -                        GetEf6AssemblyName())), traceCategory);
  3734         -
  3735         -                    traceCallback(String.Format(NameAndValueFormat,
  3736         -                        "GetDesignerAssemblyName", ForDisplay(
  3737         -                        GetDesignerAssemblyName())), traceCategory);
  3738         -
  3739         -                    ///////////////////////////////////////////////////////////
         4043  +                        "GetInvariantName", ForDisplay(GetInvariantName())),
         4044  +                        traceCategory);
  3740   4045   
  3741   4046                       traceCallback(String.Format(NameAndValueFormat,
  3742   4047                           "GetConfigInvariantName", ForDisplay(
  3743   4048                           GetConfigInvariantName())), traceCategory);
  3744   4049   
  3745   4050                       traceCallback(String.Format(NameAndValueFormat,
  3746   4051                           "GetProviderInvariantName", ForDisplay(
  3747   4052                           GetProviderInvariantName())), traceCategory);
  3748   4053   
  3749   4054                       traceCallback(String.Format(NameAndValueFormat,
  3750   4055                           "GetFactoryTypeName", ForDisplay(
  3751   4056                           GetFactoryTypeName())), traceCategory);
  3752   4057   
  3753         -                    traceCallback(String.Format(NameAndValueFormat,
  3754         -                        "GetProviderAssemblyName", ForDisplay(
  3755         -                        GetProviderAssemblyName())), traceCategory);
         4058  +                    ///////////////////////////////////////////////////////////
         4059  +
         4060  +                    try
         4061  +                    {
         4062  +                        traceCallback(String.Format(NameAndValueFormat,
         4063  +                            "GetProviderAssemblyName", ForDisplay(
         4064  +                            GetProviderAssemblyName())), traceCategory);
         4065  +                    }
         4066  +                    catch (Exception e)
         4067  +                    {
         4068  +                        traceCallback(String.Format(NameAndValueFormat,
         4069  +                            "GetProviderAssemblyName", ForDisplay(e)),
         4070  +                            traceCategory);
         4071  +                    }
  3756   4072                   }
  3757   4073               }
  3758   4074               #endregion
  3759   4075   
  3760   4076               ///////////////////////////////////////////////////////////////////
  3761   4077   
  3762   4078               #region Public Properties
................................................................................
  3870   4186   
  3871   4187               private InstallFlags installFlags;
  3872   4188               public InstallFlags InstallFlags
  3873   4189               {
  3874   4190                   get { return installFlags; }
  3875   4191                   set { installFlags = value; }
  3876   4192               }
         4193  +
         4194  +            ///////////////////////////////////////////////////////////////////
         4195  +
         4196  +            private ProviderFlags providerFlags;
         4197  +            public ProviderFlags ProviderFlags
         4198  +            {
         4199  +                get { return providerFlags; }
         4200  +                set { providerFlags = value; }
         4201  +            }
  3877   4202   
  3878   4203               ///////////////////////////////////////////////////////////////////
  3879   4204   
  3880   4205               private TracePriority debugPriority;
  3881   4206               public TracePriority DebugPriority
  3882   4207               {
  3883   4208                   get { return debugPriority; }
................................................................................
  4489   4814               else
  4490   4815               {
  4491   4816                   result = value.ToString();
  4492   4817   
  4493   4818                   if (result.Length == 0)
  4494   4819                       return "<empty>";
  4495   4820   
  4496         -                result = String.Format(
  4497         -                    type.IsSubclassOf(typeof(ValueType)) ? "{0}" : "\"{0}\"",
  4498         -                    result);
         4821  +                if (type.IsSubclassOf(typeof(Exception)))
         4822  +                {
         4823  +                    result = String.Format(
         4824  +                        "{0}{1}{0}", Environment.NewLine, result);
         4825  +                }
         4826  +                else if (!type.IsSubclassOf(typeof(ValueType)))
         4827  +                {
         4828  +                    result = String.Format("\"{0}\"", result);
         4829  +                }
  4499   4830               }
  4500   4831   
  4501   4832               return result;
  4502   4833           }
  4503   4834           #endregion
  4504   4835   
  4505   4836           ///////////////////////////////////////////////////////////////////////
................................................................................
  6194   6525           }
  6195   6526           #endregion
  6196   6527   
  6197   6528           ///////////////////////////////////////////////////////////////////////
  6198   6529   
  6199   6530           #region Visual Studio Package Handling
  6200   6531           private static void InitializeVsPackage(
  6201         -            string configInvariantName,
  6202   6532               string providerInvariantName,
  6203   6533               string factoryTypeName,
  6204   6534               AssemblyName providerAssemblyName,
  6205   6535               AssemblyName designerAssemblyName,
  6206   6536               bool globalAssemblyCache,
  6207   6537               ref Package package
  6208   6538               )
  6209   6539           {
  6210   6540               if (package == null)
  6211   6541               {
  6212   6542                   package = new Package();
  6213   6543   
  6214         -                package.ConfigInvariantName = configInvariantName;
  6215   6544                   package.ProviderInvariantName = providerInvariantName;
  6216   6545                   package.FactoryTypeName = factoryTypeName;
  6217   6546                   package.ProviderAssemblyName = providerAssemblyName;
  6218   6547                   package.DesignerAssemblyName = designerAssemblyName;
  6219   6548                   package.GlobalAssemblyCache = globalAssemblyCache;
  6220   6549   
  6221   6550                   package.AdoNetTechnologyId = new Guid(
................................................................................
  6755   7084               }
  6756   7085           }
  6757   7086           #endregion
  6758   7087           #endregion
  6759   7088   
  6760   7089           ///////////////////////////////////////////////////////////////////////
  6761   7090   
  6762         -        #region Application Entry Point
         7091  +        #region Installer Entry Point
  6763   7092           [MethodImpl(MethodImplOptions.NoInlining)]
  6764   7093           private static int Main(
  6765   7094               string[] args
  6766   7095               )
  6767   7096           {
  6768   7097               #region Debugger Hook
  6769   7098               if (Environment.GetEnvironmentVariable("Break") != null)
................................................................................
  6798   7127   
  6799   7128                       return 1; /* FAILURE */
  6800   7129                   }
  6801   7130                   #endregion
  6802   7131   
  6803   7132                   ///////////////////////////////////////////////////////////////
  6804   7133   
         7134  +                //
         7135  +                // NOTE: Setup the "mock" registry per the "what-if" mode.
         7136  +                //       Since all registry access performed by this installer
         7137  +                //       uses this "mock" registry, it is impossible for any
         7138  +                //       actual system changes to occur unless "what-if" mode
         7139  +                //       is disabled.  Furthermore, protections are in place
         7140  +                //       to prevent direct access to the wrapped registry keys
         7141  +                //       when "safe" mode is enabled.
         7142  +                //
  6805   7143                   using (MockRegistry registry = new MockRegistry(
  6806   7144                           configuration.WhatIf, false, false))
  6807   7145                   {
  6808         -                    #region Core Assembly Name Check
         7146  +                    #region Assembly Name Checks
  6809   7147                       //
  6810   7148                       // NOTE: Query all the assembly names first, before making
  6811         -                    //       any changes to the system, because this will throw
  6812         -                    //       an exception if any of the file names do not point
  6813         -                    //       to a valid managed assembly.  The values of these
  6814         -                    //       local variables are never used after this point;
  6815         -                    //       however, do not remove them.
         7149  +                    //       any changes to the system, because these calls
         7150  +                    //       will throw exceptions if any of the file names do
         7151  +                    //       not point to a valid managed assembly.  The values
         7152  +                    //       of these local variables are never used after this
         7153  +                    //       point; however, do not remove them.
  6816   7154                       //
  6817   7155                       AssemblyName coreAssemblyName =
  6818   7156                           configuration.GetCoreAssemblyName(); /* NOT USED */
  6819   7157   
  6820   7158                       AssemblyName linqAssemblyName =
  6821   7159                           configuration.GetLinqAssemblyName(); /* NOT USED */
  6822   7160   
................................................................................
  6858   7196                       Package package = null;
  6859   7197                       FrameworkList frameworkList = null;
  6860   7198                       VsList vsList = null;
  6861   7199   
  6862   7200                       ///////////////////////////////////////////////////////////
  6863   7201   
  6864   7202                       InitializeVsPackage(
  6865         -                        configuration.GetConfigInvariantName(),
  6866   7203                           configuration.GetProviderInvariantName(),
  6867   7204                           configuration.GetFactoryTypeName(),
  6868   7205                           configuration.GetProviderAssemblyName(),
  6869   7206                           configuration.GetDesignerAssemblyName(),
  6870   7207                           configuration.HasFlags(
  6871         -                            InstallFlags.GlobalAssemblyCache, true) &&
         7208  +                            InstallFlags.AllGlobalAssemblyCache, true) &&
  6872   7209                           configuration.HasFlags(
  6873   7210                               InstallFlags.VsPackageGlobalAssemblyCache, true),
  6874   7211                           ref package);
  6875   7212   
  6876   7213                       ///////////////////////////////////////////////////////////
  6877   7214   
  6878   7215                       InitializeFrameworkList(configuration.PerUser ?
................................................................................
  6894   7231                           configuration.DesignerFileName, configuration.Install);
  6895   7232                       #endregion
  6896   7233   
  6897   7234                       ///////////////////////////////////////////////////////////
  6898   7235   
  6899   7236                       #region .NET GAC Install/Remove
  6900   7237                       if (configuration.HasFlags(
  6901         -                            InstallFlags.GlobalAssemblyCache, true))
         7238  +                            InstallFlags.AllGlobalAssemblyCache, false))
  6902   7239                       {
  6903   7240                           Publish publish = null;
  6904   7241   
  6905   7242                           if (!configuration.WhatIf)
  6906   7243                               publish = new Publish();
  6907   7244   
  6908   7245                           if (configuration.Install)
  6909   7246                           {
  6910         -                            if (!configuration.WhatIf)
  6911         -                                /* throw */
  6912         -                                publish.GacInstall(configuration.CoreFileName);
         7247  +                            if (configuration.HasFlags(
         7248  +                                    InstallFlags.CoreGlobalAssemblyCache,
         7249  +                                    true))
         7250  +                            {
         7251  +                                if (!configuration.WhatIf)
         7252  +                                {
         7253  +                                    /* throw */
         7254  +                                    publish.GacInstall(
         7255  +                                        configuration.CoreFileName);
         7256  +                                }
  6913   7257   
  6914         -                            TraceOps.DebugAndTrace(TracePriority.Highest,
  6915         -                                debugCallback, traceCallback, String.Format(
  6916         -                                "GacInstall: assemblyPath = {0}",
  6917         -                                ForDisplay(configuration.CoreFileName)),
  6918         -                                traceCategory);
         7258  +                                TraceOps.DebugAndTrace(TracePriority.Highest,
         7259  +                                    debugCallback, traceCallback, String.Format(
         7260  +                                    "GacInstall: assemblyPath = {0}",
         7261  +                                    ForDisplay(configuration.CoreFileName)),
         7262  +                                    traceCategory);
         7263  +                            }
  6919   7264   
  6920         -                            if (configuration.IsLinqSupported())
         7265  +                            ///////////////////////////////////////////////////
         7266  +
         7267  +                            if (configuration.HasFlags(
         7268  +                                    InstallFlags.LinqGlobalAssemblyCache,
         7269  +                                    true) &&
         7270  +                                configuration.IsLinqSupported())
  6921   7271                               {
  6922   7272                                   if (!configuration.WhatIf)
         7273  +                                {
  6923   7274                                       /* throw */
  6924         -                                    publish.GacInstall(configuration.LinqFileName);
         7275  +                                    publish.GacInstall(
         7276  +                                        configuration.LinqFileName);
         7277  +                                }
  6925   7278   
  6926   7279                                   TraceOps.DebugAndTrace(TracePriority.Highest,
  6927   7280                                       debugCallback, traceCallback, String.Format(
  6928   7281                                       "GacInstall: assemblyPath = {0}",
  6929   7282                                       ForDisplay(configuration.LinqFileName)),
  6930   7283                                       traceCategory);
  6931   7284                               }
  6932   7285   
  6933         -                            if (configuration.IsEf6Supported())
         7286  +                            ///////////////////////////////////////////////////
         7287  +
         7288  +                            if (configuration.HasFlags(
         7289  +                                    InstallFlags.Ef6GlobalAssemblyCache,
         7290  +                                    true) &&
         7291  +                                configuration.IsEf6Supported())
  6934   7292                               {
  6935   7293                                   if (!configuration.WhatIf)
         7294  +                                {
  6936   7295                                       /* throw */
  6937         -                                    publish.GacInstall(configuration.Ef6FileName);
         7296  +                                    publish.GacInstall(
         7297  +                                        configuration.Ef6FileName);
         7298  +                                }
  6938   7299   
  6939   7300                                   TraceOps.DebugAndTrace(TracePriority.Highest,
  6940   7301                                       debugCallback, traceCallback, String.Format(
  6941   7302                                       "GacInstall: assemblyPath = {0}",
  6942   7303                                       ForDisplay(configuration.Ef6FileName)),
  6943   7304                                       traceCategory);
  6944   7305                               }
  6945   7306   
         7307  +                            ///////////////////////////////////////////////////
         7308  +
  6946   7309                               if (configuration.HasFlags(
  6947         -                                    InstallFlags.VsPackageGlobalAssemblyCache, true))
         7310  +                                    InstallFlags.VsPackageGlobalAssemblyCache,
         7311  +                                    true))
  6948   7312                               {
  6949   7313                                   if (!configuration.WhatIf)
         7314  +                                {
  6950   7315                                       /* throw */
  6951         -                                    publish.GacInstall(configuration.DesignerFileName);
         7316  +                                    publish.GacInstall(
         7317  +                                        configuration.DesignerFileName);
         7318  +                                }
  6952   7319   
  6953   7320                                   TraceOps.DebugAndTrace(TracePriority.Highest,
  6954   7321                                       debugCallback, traceCallback, String.Format(
  6955   7322                                       "GacInstall: assemblyPath = {0}",
  6956   7323                                       ForDisplay(configuration.DesignerFileName)),
  6957   7324                                       traceCategory);
  6958   7325                               }
  6959   7326                           }
  6960   7327                           else
  6961   7328                           {
  6962   7329                               if (configuration.HasFlags(
  6963         -                                    InstallFlags.VsPackageGlobalAssemblyCache, true))
         7330  +                                    InstallFlags.VsPackageGlobalAssemblyCache,
         7331  +                                    true))
  6964   7332                               {
  6965   7333                                   if (!configuration.WhatIf)
         7334  +                                {
  6966   7335                                       /* throw */
  6967         -                                    publish.GacRemove(configuration.DesignerFileName);
         7336  +                                    publish.GacRemove(
         7337  +                                        configuration.DesignerFileName);
         7338  +                                }
  6968   7339   
  6969   7340                                   TraceOps.DebugAndTrace(TracePriority.Highest,
  6970   7341                                       debugCallback, traceCallback, String.Format(
  6971   7342                                       "GacRemove: assemblyPath = {0}",
  6972   7343                                       ForDisplay(configuration.DesignerFileName)),
  6973   7344                                       traceCategory);
  6974   7345                               }
  6975   7346   
  6976         -                            if (configuration.IsEf6Supported())
         7347  +                            ///////////////////////////////////////////////////
         7348  +
         7349  +                            if (configuration.HasFlags(
         7350  +                                    InstallFlags.Ef6GlobalAssemblyCache,
         7351  +                                    true) &&
         7352  +                                configuration.IsEf6Supported())
  6977   7353                               {
  6978   7354                                   if (!configuration.WhatIf)
         7355  +                                {
  6979   7356                                       /* throw */
  6980         -                                    publish.GacRemove(configuration.Ef6FileName);
         7357  +                                    publish.GacRemove(
         7358  +                                        configuration.Ef6FileName);
         7359  +                                }
  6981   7360   
  6982   7361                                   TraceOps.DebugAndTrace(TracePriority.Highest,
  6983   7362                                       debugCallback, traceCallback, String.Format(
  6984   7363                                       "GacRemove: assemblyPath = {0}",
  6985   7364                                       ForDisplay(configuration.Ef6FileName)),
  6986   7365                                       traceCategory);
  6987   7366                               }
  6988   7367   
  6989         -                            if (configuration.IsLinqSupported())
         7368  +                            ///////////////////////////////////////////////////
         7369  +
         7370  +                            if (configuration.HasFlags(
         7371  +                                    InstallFlags.LinqGlobalAssemblyCache,
         7372  +                                    true) &&
         7373  +                                configuration.IsLinqSupported())
  6990   7374                               {
  6991   7375                                   if (!configuration.WhatIf)
         7376  +                                {
  6992   7377                                       /* throw */
  6993         -                                    publish.GacRemove(configuration.LinqFileName);
         7378  +                                    publish.GacRemove(
         7379  +                                        configuration.LinqFileName);
         7380  +                                }
  6994   7381   
  6995   7382                                   TraceOps.DebugAndTrace(TracePriority.Highest,
  6996   7383                                       debugCallback, traceCallback, String.Format(
  6997   7384                                       "GacRemove: assemblyPath = {0}",
  6998   7385                                       ForDisplay(configuration.LinqFileName)),
  6999   7386                                       traceCategory);
  7000   7387                               }
  7001   7388   
  7002         -                            if (!configuration.WhatIf)
  7003         -                                /* throw */
  7004         -                                publish.GacRemove(configuration.CoreFileName);
         7389  +                            ///////////////////////////////////////////////////
  7005   7390   
  7006         -                            TraceOps.DebugAndTrace(TracePriority.Highest,
  7007         -                                debugCallback, traceCallback, String.Format(
  7008         -                                "GacRemove: assemblyPath = {0}",
  7009         -                                ForDisplay(configuration.CoreFileName)),
  7010         -                                traceCategory);
         7391  +                            if (configuration.HasFlags(
         7392  +                                    InstallFlags.CoreGlobalAssemblyCache,
         7393  +                                    true))
         7394  +                            {
         7395  +                                if (!configuration.WhatIf)
         7396  +                                {
         7397  +                                    /* throw */
         7398  +                                    publish.GacRemove(
         7399  +                                        configuration.CoreFileName);
         7400  +                                }
         7401  +
         7402  +                                TraceOps.DebugAndTrace(TracePriority.Highest,
         7403  +                                    debugCallback, traceCallback, String.Format(
         7404  +                                    "GacRemove: assemblyPath = {0}",
         7405  +                                    ForDisplay(configuration.CoreFileName)),
         7406  +                                    traceCategory);
         7407  +                            }
  7011   7408                           }
  7012   7409                       }
  7013   7410                       #endregion
  7014   7411   
  7015   7412                       ///////////////////////////////////////////////////////////
  7016   7413   
  7017   7414                       #region .NET AssemblyFolders
................................................................................
  7048   7445                               InstallFlags.DbProviderFactory, true))
  7049   7446                       {
  7050   7447                           bool saved = false;
  7051   7448   
  7052   7449                           if (!ForEachFrameworkConfig(registry,
  7053   7450                                   frameworkList, ProcessDbProviderFactory,
  7054   7451                                   configuration.ConfigVersion,
  7055         -                                package.ConfigInvariantName, ProviderName,
  7056         -                                Description, package.FactoryTypeName,
         7452  +                                configuration.GetConfigInvariantName(),
         7453  +                                ProviderName, Description,
         7454  +                                package.FactoryTypeName,
  7057   7455                                   package.ProviderAssemblyName, directoryData,
  7058   7456                                   configuration.PerUser,
  7059   7457                                   NetFxIs32BitOnly || configuration.Wow64,
  7060   7458                                   configuration.ThrowOnMissing,
  7061   7459                                   configuration.WhatIf, configuration.Verbose,
  7062   7460                                   ref saved, ref error))
  7063   7461                           {
................................................................................
  7193   7591   
  7194   7592                       ///////////////////////////////////////////////////////////
  7195   7593   
  7196   7594                       #region Log Summary
  7197   7595                       TraceOps.DebugAndTrace(TracePriority.MediumHigh,
  7198   7596                           debugCallback, traceCallback, String.Format(
  7199   7597                           "subKeysCreated = {0}, subKeysDeleted = {1}, " +
  7200         -                        "keyValuesSet = {2}, keyValuesDeleted = {3}",
         7598  +                        "keyValuesRead = {2}, keyValuesWritten = {3}, " +
         7599  +                        "keyValuesDeleted = {4}",
  7201   7600                           ForDisplay(RegistryHelper.SubKeysCreated),
  7202   7601                           ForDisplay(RegistryHelper.SubKeysDeleted),
  7203         -                        ForDisplay(RegistryHelper.KeyValuesSet),
         7602  +                        ForDisplay(RegistryHelper.KeyValuesRead),
         7603  +                        ForDisplay(RegistryHelper.KeyValuesWritten),
  7204   7604                           ForDisplay(RegistryHelper.KeyValuesDeleted)),
  7205   7605                           traceCategory);
  7206   7606   
  7207   7607                       TraceOps.DebugAndTrace(TracePriority.MediumHigh,
  7208   7608                           debugCallback, traceCallback, String.Format(
  7209   7609                           "filesCreated = {0}, filesModified = {1}, " +
  7210   7610                           "filesDeleted = {2}", ForDisplay(filesCreated),