aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs
diff options
context:
space:
mode:
authorMelanie Thielker2017-03-23 23:00:48 +0000
committerMelanie Thielker2017-03-31 14:38:41 +0100
commit680231d7e79cae2636e9722ca12b79345fa2dbdd (patch)
tree183a1b0d9e3e39b645b4897047c8338dda7f0d3d /OpenSim/Data/MySQL/MySQLGenericTableHandler.cs
parentAllow short-circuiting region restart delays of there are no users left (diff)
downloadopensim-SC-680231d7e79cae2636e9722ca12b79345fa2dbdd.zip
opensim-SC-680231d7e79cae2636e9722ca12b79345fa2dbdd.tar.gz
opensim-SC-680231d7e79cae2636e9722ca12b79345fa2dbdd.tar.bz2
opensim-SC-680231d7e79cae2636e9722ca12b79345fa2dbdd.tar.xz
Make the MySqlGeneric layer transaction aware
Diffstat (limited to '')
-rw-r--r--OpenSim/Data/MySQL/MySQLGenericTableHandler.cs163
1 files changed, 105 insertions, 58 deletions
diff --git a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs
index 6aae9c6..bd8bbd5 100644
--- a/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs
+++ b/OpenSim/Data/MySQL/MySQLGenericTableHandler.cs
@@ -53,14 +53,27 @@ namespace OpenSim.Data.MySQL
53 get { return GetType().Assembly; } 53 get { return GetType().Assembly; }
54 } 54 }
55 55
56 public MySQLGenericTableHandler(MySqlTransaction trans,
57 string realm, string storeName) : base(trans)
58 {
59 m_Realm = realm;
60
61 CommonConstruct(storeName);
62 }
63
56 public MySQLGenericTableHandler(string connectionString, 64 public MySQLGenericTableHandler(string connectionString,
57 string realm, string storeName) : base(connectionString) 65 string realm, string storeName) : base(connectionString)
58 { 66 {
59 m_Realm = realm; 67 m_Realm = realm;
60 m_connectionString = connectionString;
61 68
69 CommonConstruct(storeName);
70 }
71
72 protected void CommonConstruct(string storeName)
73 {
62 if (storeName != String.Empty) 74 if (storeName != String.Empty)
63 { 75 {
76 // We always use a new connection for any Migrations
64 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 77 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
65 { 78 {
66 dbcon.Open(); 79 dbcon.Open();
@@ -111,6 +124,11 @@ namespace OpenSim.Data.MySQL
111 124
112 public virtual T[] Get(string[] fields, string[] keys) 125 public virtual T[] Get(string[] fields, string[] keys)
113 { 126 {
127 return Get(fields, keys, String.Empty);
128 }
129
130 public virtual T[] Get(string[] fields, string[] keys, string options)
131 {
114 if (fields.Length != keys.Length) 132 if (fields.Length != keys.Length)
115 return new T[0]; 133 return new T[0];
116 134
@@ -126,8 +144,8 @@ namespace OpenSim.Data.MySQL
126 144
127 string where = String.Join(" and ", terms.ToArray()); 145 string where = String.Join(" and ", terms.ToArray());
128 146
129 string query = String.Format("select * from {0} where {1}", 147 string query = String.Format("select * from {0} where {1} {2}",
130 m_Realm, where); 148 m_Realm, where, options);
131 149
132 cmd.CommandText = query; 150 cmd.CommandText = query;
133 151
@@ -137,72 +155,92 @@ namespace OpenSim.Data.MySQL
137 155
138 protected T[] DoQuery(MySqlCommand cmd) 156 protected T[] DoQuery(MySqlCommand cmd)
139 { 157 {
158 if (m_trans == null)
159 {
160 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
161 {
162 dbcon.Open();
163
164 return DoQueryWithConnection(cmd, dbcon);
165 }
166 }
167 else
168 {
169 return DoQueryWithTransaction(cmd, m_trans);
170 }
171 }
172
173 protected T[] DoQueryWithTransaction(MySqlCommand cmd, MySqlTransaction trans)
174 {
175 cmd.Transaction = trans;
176
177 return DoQueryWithConnection(cmd, trans.Connection);
178 }
179
180 protected T[] DoQueryWithConnection(MySqlCommand cmd, MySqlConnection dbcon)
181 {
140 List<T> result = new List<T>(); 182 List<T> result = new List<T>();
141 183
142 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 184 cmd.Connection = dbcon;
185
186 using (IDataReader reader = cmd.ExecuteReader())
143 { 187 {
144 dbcon.Open(); 188 if (reader == null)
145 cmd.Connection = dbcon; 189 return new T[0];
146 190
147 using (IDataReader reader = cmd.ExecuteReader()) 191 CheckColumnNames(reader);
148 {
149 if (reader == null)
150 return new T[0];
151 192
152 CheckColumnNames(reader); 193 while (reader.Read())
194 {
195 T row = new T();
153 196
154 while (reader.Read()) 197 foreach (string name in m_Fields.Keys)
155 { 198 {
156 T row = new T(); 199 if (reader[name] is DBNull)
157
158 foreach (string name in m_Fields.Keys)
159 { 200 {
160 if (reader[name] is DBNull) 201 continue;
161 {
162 continue;
163 }
164 if (m_Fields[name].FieldType == typeof(bool))
165 {
166 int v = Convert.ToInt32(reader[name]);
167 m_Fields[name].SetValue(row, v != 0 ? true : false);
168 }
169 else if (m_Fields[name].FieldType == typeof(UUID))
170 {
171 m_Fields[name].SetValue(row, DBGuid.FromDB(reader[name]));
172 }
173 else if (m_Fields[name].FieldType == typeof(int))
174 {
175 int v = Convert.ToInt32(reader[name]);
176 m_Fields[name].SetValue(row, v);
177 }
178 else if (m_Fields[name].FieldType == typeof(uint))
179 {
180 uint v = Convert.ToUInt32(reader[name]);
181 m_Fields[name].SetValue(row, v);
182 }
183 else
184 {
185 m_Fields[name].SetValue(row, reader[name]);
186 }
187 } 202 }
188 203 if (m_Fields[name].FieldType == typeof(bool))
189 if (m_DataField != null) 204 {
205 int v = Convert.ToInt32(reader[name]);
206 m_Fields[name].SetValue(row, v != 0 ? true : false);
207 }
208 else if (m_Fields[name].FieldType == typeof(UUID))
209 {
210 m_Fields[name].SetValue(row, DBGuid.FromDB(reader[name]));
211 }
212 else if (m_Fields[name].FieldType == typeof(int))
213 {
214 int v = Convert.ToInt32(reader[name]);
215 m_Fields[name].SetValue(row, v);
216 }
217 else if (m_Fields[name].FieldType == typeof(uint))
218 {
219 uint v = Convert.ToUInt32(reader[name]);
220 m_Fields[name].SetValue(row, v);
221 }
222 else
190 { 223 {
191 Dictionary<string, string> data = 224 m_Fields[name].SetValue(row, reader[name]);
192 new Dictionary<string, string>(); 225 }
226 }
193 227
194 foreach (string col in m_ColumnNames) 228 if (m_DataField != null)
195 { 229 {
196 data[col] = reader[col].ToString(); 230 Dictionary<string, string> data =
197 if (data[col] == null) 231 new Dictionary<string, string>();
198 data[col] = String.Empty;
199 }
200 232
201 m_DataField.SetValue(row, data); 233 foreach (string col in m_ColumnNames)
234 {
235 data[col] = reader[col].ToString();
236 if (data[col] == null)
237 data[col] = String.Empty;
202 } 238 }
203 239
204 result.Add(row); 240 m_DataField.SetValue(row, data);
205 } 241 }
242
243 result.Add(row);
206 } 244 }
207 } 245 }
208 246
@@ -357,14 +395,23 @@ namespace OpenSim.Data.MySQL
357 395
358 public object DoQueryScalar(MySqlCommand cmd) 396 public object DoQueryScalar(MySqlCommand cmd)
359 { 397 {
360 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) 398 if (m_trans == null)
361 { 399 {
362 dbcon.Open(); 400 using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
363 cmd.Connection = dbcon; 401 {
402 dbcon.Open();
403 cmd.Connection = dbcon;
404
405 return cmd.ExecuteScalar();
406 }
407 }
408 else
409 {
410 cmd.Connection = m_trans.Connection;
411 cmd.Transaction = m_trans;
364 412
365 return cmd.ExecuteScalar(); 413 return cmd.ExecuteScalar();
366 } 414 }
367 } 415 }
368
369 } 416 }
370} 417}