2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / ByteFX.Data / mysqlclient / ConnectionInternal.cs
1 using System;\r
2 using ByteFX.Data.Common;\r
3 \r
4 namespace ByteFX.Data.MySqlClient\r
5 {\r
6         /// <summary>\r
7         /// \r
8         /// </summary>\r
9         internal sealed class MySqlInternalConnection\r
10         {\r
11                 MySqlConnectionString   settings;\r
12                 Driver                                  driver;\r
13                 DateTime                                createTime;\r
14                 bool                                    serverVariablesSet;\r
15 \r
16                 public MySqlInternalConnection( MySqlConnectionString connectString )\r
17                 {\r
18                         settings = connectString;\r
19                         serverVariablesSet = false;\r
20                 }\r
21 \r
22                 #region Properties\r
23                 public MySqlConnectionString Settings \r
24                 {\r
25                         get { return settings; }\r
26                         set { settings = value; }\r
27                 }\r
28 \r
29                 internal Driver Driver \r
30                 {\r
31                         get { return driver; }\r
32                 }\r
33 \r
34                 #endregion\r
35 \r
36                 #region Methods\r
37 \r
38                 public bool IsAlive() \r
39                 {\r
40                         try \r
41                         {\r
42                                 CommandResult result = driver.Send( DBCmd.PING, (byte[])null );\r
43                                 // we don't care about the result.  The fact that it responded is enough\r
44                                 return true;\r
45                         }\r
46                         catch (Exception)\r
47                         {\r
48                                 return false;\r
49                         }\r
50                 }\r
51 \r
52                 public bool IsTooOld() \r
53                 {\r
54                         TimeSpan ts = DateTime.Now.Subtract( createTime );\r
55                         if (ts.Seconds > settings.ConnectionLifetime)\r
56                                 return true;\r
57                         return false;\r
58                 }\r
59 \r
60                 /// <summary>\r
61                 /// I don't like this setup but can't think of a better way of doing\r
62                 /// right now.\r
63                 /// </summary>\r
64                 /// <param name="connection"></param>\r
65                 public void SetServerVariables(MySqlConnection connection)\r
66                 {\r
67                         if (serverVariablesSet) return;\r
68 \r
69                         // retrieve the encoding that should be used for character data\r
70                         MySqlCommand cmd = new MySqlCommand("show variables like 'max_allowed_packet'", connection);\r
71                         try \r
72                         {\r
73                                 MySqlDataReader reader = cmd.ExecuteReader();\r
74                                 reader.Read();\r
75                                 driver.MaxPacketSize = reader.GetInt64( 1 );\r
76                                 reader.Close();\r
77                         }\r
78                         catch (Exception)\r
79                         {\r
80                                 driver.MaxPacketSize = 1047552;\r
81                         }\r
82 \r
83                         cmd.CommandText = "show variables like 'character_set'";\r
84                         driver.Encoding = System.Text.Encoding.Default;\r
85                 \r
86                         try \r
87                         {\r
88                                 MySqlDataReader reader = cmd.ExecuteReader();\r
89                                 if (reader.Read())\r
90                                         driver.Encoding = CharSetMap.GetEncoding( reader.GetString(1) );\r
91                                 reader.Close();\r
92                         }\r
93                         catch \r
94                         { \r
95                                 throw new MySqlException("Failure to initialize connection");\r
96                         }\r
97 \r
98                         serverVariablesSet = true;\r
99                 }\r
100 \r
101                 public void Open() \r
102                 {\r
103                         driver = new Driver();\r
104                         driver.Open( settings );\r
105 \r
106                         createTime = DateTime.Now;\r
107                 }\r
108 \r
109                 public void Close() \r
110                 {\r
111                         driver.Close();\r
112                 }\r
113 \r
114                 #endregion\r
115 \r
116         }\r
117 }\r