/[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 45 by william, Thu Jul 12 13:01:44 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                    public static string InstanceName
31            {
32                get
33                {
34                    bool start = false;
35                    bool end = false;
36                    List<char> pChars = new List<char>();
37                    foreach (char c in Properties.Settings.Default.atsConnectionString.ToCharArray())
38                    {
39                        if (c == '\\') { start = true; continue; }
40                        if (c == ';') { end = true; }
41                        if (end) break;
42                        if (start) { pChars.Add(c); }
43                    }
44                    return new string(pChars.ToArray());
45                }
46            }
47          public bool SetupDatabase()          public bool SetupDatabase()
48          {          {
49              bool bContinue = false;              bool bContinue = false;
   
50              // Create a connection to SQL Server              // Create a connection to SQL Server
51                
52                Logging.ATSAdminLog.Debug("SetupDatabase() called ");
53              try              try
54              {              {                
55                  sqlCon.ConnectionString = Properties.Settings.Default.atsConnectionString;                  sqlCon.ConnectionString = Properties.Settings.Default.atsConnectionString;                
56                  sqlCon.Open();                  using (log4net.NDC.Push(string.Format("ConnectionString={0}", Properties.Settings.Default.atsConnectionString)))
57                    {
58                        Logging.ATSAdminLog.Debug("Opening connection to AnywhereTS Database");
59                    }
60                    if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
61              }              }
62              catch (SqlException sql_ex)              catch
63              {              {
64                  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());
65                  return bContinue;                  //return bContinue;
66                    //bCreateDB = true;
67                    try
68                    {
69                        using (log4net.NDC.Push(string.Format("SQL Statment={0}", Resource1.CreateDatabase.ToString())))
70                        {
71                            Logging.ATSAdminLog.Debug("Creating Database AnywhereTS");
72                            sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
73                            if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
74                            RunScript(Resource1.CreateDatabase.ToString());
75                            sqlCon.Close();
76                        }
77                        Logging.ATSAdminLog.Debug("Created Database AnywhereTS");
78    
79                        using (log4net.NDC.Push(string.Format("SQL Statment={0}", Resource1.CreateTables.ToString())))
80                        {
81                            Logging.ATSAdminLog.Debug("Creating Tables in AnywhereTS Database");
82                            sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
83                            if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
84                            RunScript(Resource1.CreateTables.ToString());
85                            //sqlCon.Close();
86                        }
87                        Logging.ATSAdminLog.Debug("Created Tables in AnywhereTS Database");
88                    }
89                    catch (SqlException sql_ex1)
90                    {
91                        SqlException sql_ex = (sql_ex1.GetBaseException() as SqlException);
92                        MessageBox.Show(string.Format("Failed to connect to SQL Server Instance: {0}\n", InstanceName) + sql_ex.Number.ToString() + " " + sql_ex.Message.ToString());
93    
94                        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())))
95                        {
96                            Logging.ATSAdminLog.Error("Failed to open connection to AnywhereTS Database");
97                        }
98                        return bContinue;
99                    }
100              }              }
101                    
102              // Now that you are connected to Express, check the database versions              // Now that you are connected to Express, check the database versions
   
103              Version databaseVersion; // The current version of the database              Version databaseVersion; // The current version of the database
104                int chkVer = CheckVersion(out databaseVersion);
105              switch (CheckVersion(out databaseVersion))              VersionCheck verChk = (VersionCheck)chkVer;
106                //MessageBox.Show(string.Format("Version Check: {0} Version: {1}", verChk.ToString(), databaseVersion.ToString()));
107                Logging.ATSAdminLog.DebugFormat("Version Check: {0} Version: {1}", verChk.ToString(), databaseVersion.ToString());
108                switch (chkVer)
109              {              {
110                  case (int)VersionCheck.Equal:                  case (int)VersionCheck.Equal:
111                      {                      {
# Line 61  namespace AnywhereTS Line 124  namespace AnywhereTS
124                              // Run the apropriate upgdrade script(s)                              // Run the apropriate upgdrade script(s)
125                              case "1.0.0.0":                              case "1.0.0.0":
126                                  {   // 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
127                                        Logging.ATSAdminLog.DebugFormat("Upgrading Database from version: {0} to version: {1}", "1.0.0.0", "1.0.0.1");
128                                      bContinue = RunScript(Resource1.UpdateDatabase1.ToString());                                      bContinue = RunScript(Resource1.UpdateDatabase1.ToString());
129                                        Logging.ATSAdminLog.DebugFormat("Upgraded Database from version: {0} to version: {1}", "1.0.0.0", "1.0.0.1");
130                                      goto case "1.0.0.1"; // Continue and upgrade one more step                                      goto case "1.0.0.1"; // Continue and upgrade one more step
131                                  }                                  }
132                              case "1.0.0.1":                              case "1.0.0.1":
133                                  {   // 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
134                                        Logging.ATSAdminLog.DebugFormat("Upgrading Database from version: {0} to version: {1}", "1.0.0.1", "1.0.0.2");
135                                      bContinue = RunScript(Resource1.UpdateDatabase2.ToString());                                      bContinue = RunScript(Resource1.UpdateDatabase2.ToString());
136                                        Logging.ATSAdminLog.DebugFormat("Upgraded Database from version: {0} to version: {1}", "1.0.0.2", "1.0.0.2");
137                                      goto case "1.0.0.2"; // Continue and upgrade one more step                                      goto case "1.0.0.2"; // Continue and upgrade one more step
138                                  }                                  }
139                              case "1.0.0.2":                              case "1.0.0.2":
140                                  {   // 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
141                                        Logging.ATSAdminLog.DebugFormat("Upgrading Database from version: {0} to version: {1}", "1.0.0.2", "1.0.0.3");
142                                      bContinue = RunScript(Resource1.UpdateDatabase3.ToString());                                      bContinue = RunScript(Resource1.UpdateDatabase3.ToString());
143                                        Logging.ATSAdminLog.DebugFormat("Upgraded Database from version: {0} to version: {1}", "1.0.0.2", "1.0.0.3");
144                                      break;                                      break;
145                                  }                                  }                            
   
                               
146                              default:                              default:
147                                  {                                  {
148                                      MessageBox.Show("Error: Not able to upgrade database (51188)");                                      //MessageBox.Show("Error: Not able to upgrade database (51188)");
149                                        if (databaseVersion == new Version(0, 0, 0, 0))
150                                        {
151                                            string format = string.Format("Database version is {0}, this should have been auto upgraded to {1}", databaseVersion.ToString(), ATSGlobals.strDatabaseVersion);
152                                            Logging.ATSAdminLog.Fatal(format);
153                                            MessageBox.Show(format);
154                                        }
155                                        else
156                                        {
157                                            string format = string.Format("Failed to upgrade Database from version: {0} to version: {1}", databaseVersion.ToString(), ATSGlobals.strDatabaseVersion);
158                                            Logging.ATSAdminLog.Fatal(format);
159                                            MessageBox.Show(format);
160                                        }                                    
161                                      break;                                      break;
162                                  }                                  }
163                          }                          }
# Line 89  namespace AnywhereTS Line 168  namespace AnywhereTS
168                          bContinue = false;                          bContinue = false;
169                          break;                          break;
170                      }                      }
                 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;  
                     }  
171                  default:                  default:
172                      {                      {
173                          bContinue = false;                          bContinue = false;
# Line 158  namespace AnywhereTS Line 225  namespace AnywhereTS
225                  string strResult;                  string strResult;
226    
227                  //Verify that the AnywhereTS database exists                  //Verify that the AnywhereTS database exists
228                  sqlCmd = new SqlCommand("select count(*) from master..sysdatabases where name='AnywhereTS'", sqlCon);  
229                  strResult = sqlCmd.ExecuteScalar().ToString();                  using (log4net.NDC.Push(string.Format("SQL STATMENT={0}", "select count(*) from master..sysdatabases where name='AnywhereTS'")))
230                                    {
231                        Logging.ATSAdminLog.Debug("Getting Coount of AnywhereTS databases");
232                        if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
233                        sqlCmd = new SqlCommand("select count(*) from master..sysdatabases where name='AnywhereTS'", sqlCon);
234                        strResult = sqlCmd.ExecuteScalar().ToString();
235                    }
236                   Logging.ATSAdminLog.DebugFormat("AnywhereTS databases Count={0}", strResult);
237    
238                  if (strResult == "0")                  if (strResult == "0")
239                  {                  {
240    
                     return (int)VersionCheck.DatabaseNotFound;  
                 }  
241    
242                        using (log4net.NDC.Push(string.Format("SQL Statment={0}", Resource1.CreateDatabase.ToString())))
243                        {
244                            Logging.ATSAdminLog.Debug("Creating Database AnywhereTS in CheckVersion()");
245                            sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
246                            if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
247                            RunScript(Resource1.CreateDatabase.ToString());
248                            sqlCon.Close();
249                        }
250                        Logging.ATSAdminLog.Debug("Created Database AnywhereTS in CheckVersion()");
251    
252                        using (log4net.NDC.Push(string.Format("SQL Statment={0}", Resource1.CreateTables.ToString())))
253                        {
254                            Logging.ATSAdminLog.Debug("Creating Tables in AnywhereTS Database in CheckVersion()");
255                            sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
256                            if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
257                            RunScript(Resource1.CreateTables.ToString());
258                            sqlCon.Close();
259                        }
260                        Logging.ATSAdminLog.Debug("Created Tables in AnywhereTS Database in CheckVersion()");
261                    }
262                  try                  try
263                  {                  {
264                      sqlCmd = new SqlCommand("SELECT value from AnywhereTS..AppInfo where property='version'", sqlCon);                      using (log4net.NDC.Push(string.Format("SQL Statment={0}", "SELECT value from AnywhereTS..AppInfo where property='version'")))
265                      strResult = (string)sqlCmd.ExecuteScalar();                      {
266                            Logging.ATSAdminLog.Debug("Gettting AnywhereTS Database Version");
267                            sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString);
268                            if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
269                            sqlCmd = new SqlCommand("SELECT value from AnywhereTS..AppInfo where property='version'", sqlCon);
270                            strResult = (string)sqlCmd.ExecuteScalar();
271                            sqlCon.Close();
272                        }
273                        Logging.ATSAdminLog.DebugFormat("AnywhereTS database version={0}", strResult);
274                  }                  }
275                  catch                  catch(SqlException ex)
276                  {   // Assume we could not open the physical file                  {
277                      //Drop the database                      // the database exists, but one or more tables are missing
278                      sqlCmd = new SqlCommand("IF EXISTS(SELECT * FROM sysdatabases WHERE name='AnywhereTS')DROP DATABASE AnywhereTS", sqlCon);                      using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", ex.Number.ToString(), ex.Message, System.Environment.NewLine, ex.ToString())))
279                      strResult = (string)sqlCmd.ExecuteScalar();                      {
280                      return (int)VersionCheck.DatabaseNotFound;                                                  Logging.ATSAdminLog.Error("Failed to get database version");
281                        }
282                        try
283                        {
284    
285                            using (log4net.NDC.Push(string.Format("SQL Statment={0}", Resource1.CreateTables.ToString())))
286                            {
287                                Logging.ATSAdminLog.Debug("Creating Tables in AnywhereTS Database in CheckVersion()");
288                                sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString.Replace("AnywhereTS", "master"));
289                                if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
290                                RunScript(Resource1.CreateTables.ToString());
291                                sqlCon.Close();
292                            }
293                            Logging.ATSAdminLog.Debug("Created Tables in AnywhereTS Database in CheckVersion()");
294    
295                            using (log4net.NDC.Push(string.Format("SQL Statment={0}", "SELECT value from AnywhereTS..AppInfo where property='version'")))
296                            {
297                                Logging.ATSAdminLog.Debug("Gettting AnywhereTS Database Version");
298                                sqlCon = new SqlConnection(Properties.Settings.Default.atsConnectionString);
299                                if (sqlCon.State != ConnectionState.Open) sqlCon.Open();
300                                sqlCmd = new SqlCommand("SELECT value from AnywhereTS..AppInfo where property='version'", sqlCon);
301                                strResult = (string)sqlCmd.ExecuteScalar();
302                                sqlCon.Close();
303                            }
304                            Logging.ATSAdminLog.DebugFormat("AnywhereTS database version={0}", strResult);
305                        }
306                        catch(SqlException ex1)
307                        {
308                            using (log4net.NDC.Push(string.Format("SqlException: ID={0} MESSAGE={1}{2}Diagnostics:{2}{3}", ex1.Number.ToString(), ex1.Message, System.Environment.NewLine, ex1.ToString())))
309                            {
310                                Logging.ATSAdminLog.Error("Failed to get database version");
311                            }
312                            return (int)VersionCheck.Failed;
313                        }
314                  }                  }
315                  vDb = new Version(strResult);                  vDb = new Version(strResult);
316                        
# Line 196  namespace AnywhereTS Line 329  namespace AnywhereTS
329              catch (SqlException sql_ex)              catch (SqlException sql_ex)
330              {              {
331                  MessageBox.Show(sql_ex.Number.ToString() + " " + sql_ex.Message.ToString());                  MessageBox.Show(sql_ex.Number.ToString() + " " + sql_ex.Message.ToString());
332                    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())))
333                    {
334                        Logging.ATSAdminLog.Error("Failed to check database version");
335                    }
336                  return (int)VersionCheck.Failed;                  return (int)VersionCheck.Failed;
337              }              }
338              catch (Exception system_ex)              catch (Exception system_ex)
339              {              {
340                  MessageBox.Show(system_ex.Message.ToString());                  MessageBox.Show(system_ex.Message.ToString());
341                    using (log4net.NDC.Push(string.Format("SqlException: MESSAGE={0}{1}Diagnostics:{1}{2}", system_ex.Message, System.Environment.NewLine, system_ex.ToString())))
342                    {
343                        Logging.ATSAdminLog.Error("Failed to check database version");
344                    }
345                  return (int)VersionCheck.Failed;                  return (int)VersionCheck.Failed;
346              }              }
347          }          }
# Line 212  namespace AnywhereTS Line 353  namespace AnywhereTS
353              return commands;              return commands;
354          }          }
355    
356        
357            [Obsolete("SetDatabaseRights() has been deperecated - user rights are assigned via SQL Server")]
358          public static void SetDatabaseRights()          public static void SetDatabaseRights()
359          {          {
360              try              try
# Line 265  namespace AnywhereTS Line 407  namespace AnywhereTS
407              }              }
408              catch              catch
409              {              {
410                  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.");
411              }              }
412          }          }
413    
# Line 284  namespace AnywhereTS Line 426  namespace AnywhereTS
426              {              {
427                  prot.Get();                  prot.Get();
428                  if ((string)prot.GetPropertyValue("ProtocolName") == "Np" &&  //Named pipes                  if ((string)prot.GetPropertyValue("ProtocolName") == "Np" &&  //Named pipes
429                      (string)prot.GetPropertyValue("InstanceName") == "SQLEXPRESS")                      (string)prot.GetPropertyValue("InstanceName") == InstanceName)
430                  {   // We found the named pipes protocol                  {   // We found the named pipes protocol
431                      if (!(bool)prot.GetPropertyValue("Enabled"))                      if (!(bool)prot.GetPropertyValue("Enabled"))
432                      {   // Named pipes not activated                      {   // Named pipes not activated
# Line 292  namespace AnywhereTS Line 434  namespace AnywhereTS
434                                
435                          // Check if user wants to restart SQL server                          // Check if user wants to restart SQL server
436                          DialogResult resultRights;                          DialogResult resultRights;
437                          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);
438                          if (resultRights == DialogResult.Yes)                          if (resultRights == DialogResult.Yes)
439                          {                          {
440                              // Restart the SQL server                              // Restart the SQL server
# Line 301  namespace AnywhereTS Line 443  namespace AnywhereTS
443                              foreach (ManagementObject svc in sqlServicesMan.GetInstances())                              foreach (ManagementObject svc in sqlServicesMan.GetInstances())
444                              {                              {
445                                  if ((uint)svc.GetPropertyValue("SqlServiceType") == sqlServerService &&                                  if ((uint)svc.GetPropertyValue("SqlServiceType") == sqlServerService &&
446                                      (string)svc.GetPropertyValue("ServiceName") == "MSSQL$SQLEXPRESS")                                      (string)svc.GetPropertyValue("ServiceName") == string.Format("MSSQL${0}", InstanceName))
447                                  {                                  {
448                                      svc.Get();                                      svc.Get();
449                                      if ((uint)svc.GetPropertyValue("State") != sqlServiceStopped)                                      if ((uint)svc.GetPropertyValue("State") != sqlServiceStopped)

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

  ViewVC Help
Powered by ViewVC 1.1.22