/[AnywhereTS-MSSQL]/trunk/TSAdminTool/Database.cs
ViewVC logotype

Diff of /trunk/TSAdminTool/Database.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 10 by william, Wed Jul 11 16:01:40 2012 UTC revision 40 by william, Thu Jul 12 12:25:58 2012 UTC
# Line 6  using System.Data.SqlClient; Line 6  using System.Data.SqlClient;
6  using System.Windows.Forms;  using System.Windows.Forms;
7  using System.Text.RegularExpressions;  using System.Text.RegularExpressions;
8  using System.Management;  using System.Management;
9    using log4net;
10    
11  namespace AnywhereTS  namespace AnywhereTS
12  {  {
13      class DatabaseSupport      class DatabaseSupport
14      {      {
15            
16          enum VersionCheck          enum VersionCheck
17          {          {
18              Failed = 0, Equal, DatabaseIsMoreNew,              Failed = 0,
19              DatabaseIsOlder, DatabaseNotFound              Equal,
20                DatabaseIsMoreNew,
21                DatabaseIsOlder,
22                //DatabaseNotFound,
23                DatabaseCreated,
24          };          };
25    
26          private SqlConnection sqlCon = new SqlConnection();          private SqlConnection sqlCon = new SqlConnection();
27          private SqlCommand sqlCmd = new SqlCommand();          private SqlCommand sqlCmd = new SqlCommand();
28    
29          const string SQL_BROWSER_SERVICE_NAME = "SQLBrowser";          const string SQL_BROWSER_SERVICE_NAME = "SQLBrowser";
30                    const Version CURRENT_DB_VERSION = new Version(1, 0, 0, 3);
31            public static string InstanceName
32            {
33                get
34                {
35                    bool start = false;
36                    bool end = false;
37                    List<char> pChars = new List<char>();
38                    foreach (char c in Properties.Settings.Default.atsConnectionString.ToCharArray())
39                    {
40                        if (c == '\\') { start = true; continue; }
41                        if (c == ';') { end = true; }
42                        if (end) break;
43                        if (start) { pChars.Add(c); }
44                    }
45                    return new string(pChars.ToArray());
46                }
47            }
48          public bool SetupDatabase()          public bool SetupDatabase()
49          {          {
50              bool bContinue = false;              bool bContinue = false;
   
51              // Create a connection to SQL Server              // Create a connection to SQL Server
52                
53                Logging.ATSAdminLog.Debug("SetupDatabase() called ");
54              try              try
55              {              {                
56                  sqlCon.ConnectionString = Properties.Settings.Default.atsConnectionString;                  sqlCon.ConnectionString = Properties.Settings.Default.atsConnectionString;                
57                    using (log4net.NDC.Push(string.Format("ConnectionString={0}", Properties.Settings.Default.atsConnectionString)))
58                    {
59                        Logging.ATSAdminLog.Debug("Opening connection to AnywhereTS Database");
60                    }
61                  sqlCon.Open();                  sqlCon.Open();
62              }              }
63              catch (SqlException sql_ex)              catch
64              {              {
65                  MessageBox.Show("Fail to connect to SQL Server Express\n" + sql_ex.Number.ToString() + " " + sql_ex.Message.ToString());                  //MessageBox.Show(string.Format("Fail to connect to SQL Server Instance: {0}\n", InstanceName) + sql_ex.Number.ToString() + " " + sql_ex.Message.ToString());
66                  return bContinue;                  //return bContinue;
67                    //bCreateDB = true;
68                    try
69                    {
70                        using (log4net.NDC.Push(string.Format("SQL Statment={0}", Resource1.CreateDatabase.ToString())))
71                        {
72                            Logging.ATSAdminLog.Debug("Creating Database AnywhereTS");
73                            sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
74                            sqlCon.Open();
75                            RunScript(Resource1.CreateDatabase.ToString());
76                            sqlCon.Close();
77                        }
78                        Logging.ATSAdminLog.Debug("Created Database AnywhereTS");
79    
80                        using (log4net.NDC.Push(string.Format("SQL Statment={0}", Resource1.CreateTables.ToString())))
81                        {
82                            Logging.ATSAdminLog.Debug("Creating Tables in AnywhereTS Database");
83                            sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
84                            sqlCon.Open();
85                            RunScript(Resource1.CreateTables.ToString());
86                            sqlCon.Close();
87                        }
88                        Logging.ATSAdminLog.Debug("Created Tables in AnywhereTS Database");
89                    }
90                    catch (SqlException sql_ex1)
91                    {
92                        SqlException sql_ex = (sql_ex1.GetBaseException() as SqlException);
93                        MessageBox.Show(string.Format("Failed to connect to SQL Server Instance: {0}\n", InstanceName) + sql_ex.Number.ToString() + " " + sql_ex.Message.ToString());
94    
95                        using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", sql_ex.Number.ToString(), sql_ex.Message, System.Environment.NewLine, sql_ex.ToString())))
96                        {
97                            Logging.ATSAdminLog.Error("Failed to open connection to AnywhereTS Database");
98                        }
99                        return bContinue;
100                    }
101              }              }
102                    
103              // Now that you are connected to Express, check the database versions              // Now that you are connected to Express, check the database versions
   
104              Version databaseVersion; // The current version of the database              Version databaseVersion; // The current version of the database
105                int chkVer = CheckVersion(out databaseVersion);
106              switch (CheckVersion(out databaseVersion))              VersionCheck verChk = (VersionCheck)chkVer;
107                //MessageBox.Show(string.Format("Version Check: {0} Version: {1}", verChk.ToString(), databaseVersion.ToString()));
108                Logging.ATSAdminLog.DebugFormat("Version Check: {0} Version: {1}", verChk.ToString(), databaseVersion.ToString());
109                switch (chkVer)
110              {              {
111                  case (int)VersionCheck.Equal:                  case (int)VersionCheck.Equal:
112                      {                      {
# Line 61  namespace AnywhereTS Line 125  namespace AnywhereTS
125                              // Run the apropriate upgdrade script(s)                              // Run the apropriate upgdrade script(s)
126                              case "1.0.0.0":                              case "1.0.0.0":
127                                  {   // Current database is version 1.0.0.0, update to 1.0.0.1                                  {   // Current database is version 1.0.0.0, update to 1.0.0.1
128                                        Logging.ATSAdminLog.DebugFormat("Upgrading Database from version: {0} to version: {1}", "1.0.0.0", "1.0.0.1");
129                                      bContinue = RunScript(Resource1.UpdateDatabase1.ToString());                                      bContinue = RunScript(Resource1.UpdateDatabase1.ToString());
130                                        Logging.ATSAdminLog.DebugFormat("Upgraded Database from version: {0} to version: {1}", "1.0.0.0", "1.0.0.1");
131                                      goto case "1.0.0.1"; // Continue and upgrade one more step                                      goto case "1.0.0.1"; // Continue and upgrade one more step
132                                  }                                  }
133                              case "1.0.0.1":                              case "1.0.0.1":
134                                  {   // Current database is version 1.0.0.1, update to 1.0.0.2                                  {   // Current database is version 1.0.0.1, update to 1.0.0.2
135                                        Logging.ATSAdminLog.DebugFormat("Upgrading Database from version: {0} to version: {1}", "1.0.0.1", "1.0.0.2");
136                                      bContinue = RunScript(Resource1.UpdateDatabase2.ToString());                                      bContinue = RunScript(Resource1.UpdateDatabase2.ToString());
137                                        Logging.ATSAdminLog.DebugFormat("Upgraded Database from version: {0} to version: {1}", "1.0.0.2", "1.0.0.2");
138                                      goto case "1.0.0.2"; // Continue and upgrade one more step                                      goto case "1.0.0.2"; // Continue and upgrade one more step
139                                  }                                  }
140                              case "1.0.0.2":                              case "1.0.0.2":
141                                  {   // Current database is version 1.0.0.2, update to 1.0.0.3                                  {   // Current database is version 1.0.0.2, update to 1.0.0.3
142                                        Logging.ATSAdminLog.DebugFormat("Upgrading Database from version: {0} to version: {1}", "1.0.0.2", "1.0.0.3");
143                                      bContinue = RunScript(Resource1.UpdateDatabase3.ToString());                                      bContinue = RunScript(Resource1.UpdateDatabase3.ToString());
144                                        Logging.ATSAdminLog.DebugFormat("Upgraded Database from version: {0} to version: {1}", "1.0.0.2", "1.0.0.3");
145                                      break;                                      break;
146                                  }                                  }                            
   
                               
147                              default:                              default:
148                                  {                                  {
149                                      MessageBox.Show("Error: Not able to upgrade database (51188)");                                      //MessageBox.Show("Error: Not able to upgrade database (51188)");
150                                        if (databaseVersion == new Version(0, 0, 0, 0))
151                                        {
152                                            string format = string.Format("Database version is {0}, this should have been auto upgraded to {1}", databaseVersion.ToString(), CURRENT_DB_VERSION.ToString());
153                                            Logging.ATSAdminLog.Fatal(format);
154                                            MessageBox.Show(format);
155                                        }
156                                        else
157                                        {
158                                            string format = string.Format("Failed to upgrade Database from version: {0} to version: {1}", databaseVersion.ToString(), CURRENT_DB_VERSION.ToString());
159                                            Logging.ATSAdminLog.Fatal(format);
160                                            MessageBox.Show(format);
161                                        }                                    
162                                      break;                                      break;
163                                  }                                  }
164                          }                          }
# Line 89  namespace AnywhereTS Line 169  namespace AnywhereTS
169                          bContinue = false;                          bContinue = false;
170                          break;                          break;
171                      }                      }
                 case (int)VersionCheck.DatabaseNotFound:  
                     {  
                         //Run the creation script  
                         bContinue = RunScript(Resource1.CreateDatabase.ToString());  
                         if (bContinue)  
                         {  
                             // Set up file access rights for remote desktop users  
                             SetDatabaseRights();  
                         }  
   
                         break;  
                     }  
172                  default:                  default:
173                      {                      {
174                          bContinue = false;                          bContinue = false;
# Line 160  namespace AnywhereTS Line 228  namespace AnywhereTS
228                  //Verify that the AnywhereTS database exists                  //Verify that the AnywhereTS database exists
229                  sqlCmd = new SqlCommand("select count(*) from master..sysdatabases where name='AnywhereTS'", sqlCon);                  sqlCmd = new SqlCommand("select count(*) from master..sysdatabases where name='AnywhereTS'", sqlCon);
230                  strResult = sqlCmd.ExecuteScalar().ToString();                  strResult = sqlCmd.ExecuteScalar().ToString();
231                    
232                  if (strResult == "0")                  if (strResult == "0")
233                  {                  {
234                        sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
235                      return (int)VersionCheck.DatabaseNotFound;                      sqlCon.Open();
236                        RunScript(Resource1.CreateDatabase.ToString());
237                        sqlCon.Close();
238                        sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
239                        sqlCon.Open();
240                        RunScript(Resource1.CreateTables.ToString());
241                        sqlCon.Close();
242                  }                  }
   
243                  try                  try
244                  {                  {
245                        sqlCon.Close();
246                        sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString);
247                        sqlCon.Open();
248                      sqlCmd = new SqlCommand("SELECT value from AnywhereTS..AppInfo where property='version'", sqlCon);                      sqlCmd = new SqlCommand("SELECT value from AnywhereTS..AppInfo where property='version'", sqlCon);
249                      strResult = (string)sqlCmd.ExecuteScalar();                      strResult = (string)sqlCmd.ExecuteScalar();
250                        sqlCon.Close();
251                  }                  }
252                  catch                  catch
253                  {   // Assume we could not open the physical file                  {
254                      //Drop the database                      // the database exists, but one or more tables are missing
255                      sqlCmd = new SqlCommand("IF EXISTS(SELECT * FROM sysdatabases WHERE name='AnywhereTS')DROP DATABASE AnywhereTS", sqlCon);                      try
256                      strResult = (string)sqlCmd.ExecuteScalar();                      {
257                      return (int)VersionCheck.DatabaseNotFound;                                                  sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
258                            sqlCon.Open();
259                            RunScript(Resource1.CreateTables.ToString());
260                            sqlCon.Close();
261                            sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString);
262                            sqlCon.Open();
263                            sqlCmd = new SqlCommand("SELECT value from AnywhereTS..AppInfo where property='version'", sqlCon);
264                            strResult = (string)sqlCmd.ExecuteScalar();
265                        }
266                        catch
267                        {
268                            return (int)VersionCheck.Failed;
269                        }
270                  }                  }
271                  vDb = new Version(strResult);                  vDb = new Version(strResult);
272                        
# Line 212  namespace AnywhereTS Line 301  namespace AnywhereTS
301              return commands;              return commands;
302          }          }
303    
304        
305            [Obsolete("SetDatabaseRights() has been deperecated - user rights are assigned via SQL Server")]
306          public static void SetDatabaseRights()          public static void SetDatabaseRights()
307          {          {
308              try              try
# Line 265  namespace AnywhereTS Line 355  namespace AnywhereTS
355              }              }
356              catch              catch
357              {              {
358                  MessageBox.Show("Error, could not configure SQL Browser service (24888). Please check that SQL Server Express is intalled and that you are logged in with sufficient rights to configure services. Then retry the operation.");                  MessageBox.Show("Error, could not configure SQL Browser service (24888). Please check that SQL Server is intalled and that you are logged in with sufficient rights to configure services. Then retry the operation.");
359              }              }
360          }          }
361    
# Line 284  namespace AnywhereTS Line 374  namespace AnywhereTS
374              {              {
375                  prot.Get();                  prot.Get();
376                  if ((string)prot.GetPropertyValue("ProtocolName") == "Np" &&  //Named pipes                  if ((string)prot.GetPropertyValue("ProtocolName") == "Np" &&  //Named pipes
377                      (string)prot.GetPropertyValue("InstanceName") == "SQLEXPRESS")                      (string)prot.GetPropertyValue("InstanceName") == InstanceName)
378                  {   // We found the named pipes protocol                  {   // We found the named pipes protocol
379                      if (!(bool)prot.GetPropertyValue("Enabled"))                      if (!(bool)prot.GetPropertyValue("Enabled"))
380                      {   // Named pipes not activated                      {   // Named pipes not activated
# Line 292  namespace AnywhereTS Line 382  namespace AnywhereTS
382                                
383                          // Check if user wants to restart SQL server                          // Check if user wants to restart SQL server
384                          DialogResult resultRights;                          DialogResult resultRights;
385                          resultRights = MessageBox.Show("In order for users to use the AnywhereTS control panel, the SQL Express service on this computer need to be restarted. This operation might take up to 60 seconds. Do you want restart the SQL Express service now?", "AnywhereTS - Restart SQL Express (This operation might take up to 60 seconds!)", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);                          resultRights = MessageBox.Show(string.Format("In order for users to use the AnywhereTS control panel, the {0} service on this computer need to be restarted. This operation might take up to 60 seconds. Do you want restart the {0} service now?", InstanceName), string.Format("AnywhereTS - Restart {0} (This operation might take up to 60 seconds!)", InstanceName), MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
386                          if (resultRights == DialogResult.Yes)                          if (resultRights == DialogResult.Yes)
387                          {                          {
388                              // Restart the SQL server                              // Restart the SQL server
# Line 301  namespace AnywhereTS Line 391  namespace AnywhereTS
391                              foreach (ManagementObject svc in sqlServicesMan.GetInstances())                              foreach (ManagementObject svc in sqlServicesMan.GetInstances())
392                              {                              {
393                                  if ((uint)svc.GetPropertyValue("SqlServiceType") == sqlServerService &&                                  if ((uint)svc.GetPropertyValue("SqlServiceType") == sqlServerService &&
394                                      (string)svc.GetPropertyValue("ServiceName") == "MSSQL$SQLEXPRESS")                                      (string)svc.GetPropertyValue("ServiceName") == string.Format("MSSQL${0}", InstanceName))
395                                  {                                  {
396                                      svc.Get();                                      svc.Get();
397                                      if ((uint)svc.GetPropertyValue("State") != sqlServiceStopped)                                      if ((uint)svc.GetPropertyValue("State") != sqlServiceStopped)

Legend:
Removed from v.10  
changed lines
  Added in v.40

  ViewVC Help
Powered by ViewVC 1.1.22