PageRenderTime 1667ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/MSSQL/Modules/MSSQLDataManager.cs

https://bitbucket.org/VirtualReality/optional-modules
C# | 1075 lines | 10 code | 2 blank | 1063 comment | 0 complexity | 6fcddb2833db972f3850db965dc034ae MD5 | raw file
  1. /*
  2. * Copyright (c) Contributors, http://aurora-sim.org/
  3. * See CONTRIBUTORS.TXT for a full list of copyright holders.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * * Neither the name of the Aurora-Sim Project nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
  17. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. using System;
  28. using System.Collections.Generic;
  29. using System.Data;
  30. using System.Data.SqlClient;
  31. using System.Linq;
  32. using Aurora.DataManager.Migration;
  33. using Aurora.Framework;
  34. namespace Aurora.DataManager.MSSQL
  35. {
  36. /*public class MSSQLDataLoader : DataManagerBase
  37. {
  38. private string connectionString = "";
  39. private SqlConnection m_connection;
  40. public override string Identifier
  41. {
  42. get { return "MSSQLData"; }
  43. }
  44. public SqlConnection GetLockedConnection()
  45. {
  46. if (m_connection == null)
  47. {
  48. m_connection = new SqlConnection(connectionString);
  49. m_connection.Open();
  50. return m_connection;
  51. }
  52. else
  53. {
  54. SqlConnection clone = (SqlConnection) ((ICloneable) m_connection).Clone();
  55. clone.Open();
  56. return clone;
  57. }
  58. }
  59. public IDbCommand Query(string sql, Dictionary<string, object> parameters, SqlConnection dbcon)
  60. {
  61. SqlCommand dbcommand;
  62. try
  63. {
  64. dbcommand = dbcon.CreateCommand();
  65. dbcommand.CommandText = sql;
  66. foreach (KeyValuePair<string, object> param in parameters)
  67. {
  68. dbcommand.Parameters.AddWithValue(param.Key, param.Value);
  69. }
  70. return dbcommand;
  71. }
  72. catch (Exception)
  73. {
  74. // Return null if it fails.
  75. return null;
  76. }
  77. }
  78. public override void ConnectToDatabase(string connectionstring, string migratorName, bool validateTables)
  79. {
  80. connectionString = connectionstring;
  81. SqlConnection dbcon = GetLockedConnection();
  82. dbcon.Close();
  83. dbcon.Dispose();
  84. var migrationManager = new MigrationManager(this, migratorName, validateTables);
  85. migrationManager.DetermineOperation();
  86. migrationManager.ExecuteOperation();
  87. }
  88. public bool ExecuteCommand(string query)
  89. {
  90. SqlConnection dbcon = GetLockedConnection();
  91. IDbCommand result;
  92. IDataReader reader;
  93. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  94. {
  95. using (reader = result.ExecuteReader())
  96. {
  97. reader.Close();
  98. reader.Dispose();
  99. result.Cancel();
  100. result.Dispose();
  101. }
  102. }
  103. CloseDatabase(dbcon);
  104. return true;
  105. }
  106. public override List<string> QueryFullData(string whereClause, string table, string wantedValue)
  107. {
  108. SqlConnection dbcon = GetLockedConnection();
  109. IDbCommand result;
  110. IDataReader reader;
  111. List<string> RetVal = new List<string>();
  112. string query = String.Format("select {0} from {1} {2}",
  113. wantedValue, table, whereClause);
  114. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  115. {
  116. using (reader = result.ExecuteReader())
  117. {
  118. try
  119. {
  120. while (reader.Read())
  121. {
  122. for (int i = 0; i < reader.FieldCount; i++)
  123. {
  124. RetVal.Add(reader.GetString(i));
  125. }
  126. }
  127. return RetVal;
  128. }
  129. finally
  130. {
  131. reader.Close();
  132. reader.Dispose();
  133. result.Cancel();
  134. result.Dispose();
  135. CloseDatabase(dbcon);
  136. }
  137. }
  138. }
  139. }
  140. public override IDataReader QueryData(string whereClause, string table, string wantedValue)
  141. {
  142. SqlConnection dbcon = GetLockedConnection();
  143. string query = String.Format("select {0} from {1} {2}",
  144. wantedValue, table, whereClause);
  145. return Query(query, new Dictionary<string, object>(), dbcon).ExecuteReader();
  146. }
  147. private static string QueryFilter2Query(QueryFilter filter)
  148. {
  149. string query = "";
  150. List<string> parts;
  151. bool had = false;
  152. if (filter.Count > 0)
  153. {
  154. query += "(";
  155. #region equality
  156. parts = new List<string>();
  157. foreach (KeyValuePair<string, object> where in filter.andFilters)
  158. {
  159. parts.Add(string.Format("{0} = '{1}'", where.Key, where.Value));
  160. }
  161. if (parts.Count > 0)
  162. {
  163. query += " (" + string.Join(" AND ", parts.ToArray()) + ")";
  164. had = true;
  165. }
  166. parts = new List<string>();
  167. foreach (KeyValuePair<string, object> where in filter.orFilters)
  168. {
  169. parts.Add(string.Format("{0} = '{1}'", where.Key, where.Value));
  170. }
  171. if (parts.Count > 0)
  172. {
  173. query += (had ? " AND" : string.Empty) + " (" + string.Join(" OR ", parts.ToArray()) + ")";
  174. had = true;
  175. }
  176. parts = new List<string>();
  177. foreach (KeyValuePair<string, List<object>> where in filter.orMultiFilters)
  178. {
  179. foreach (object value in where.Value)
  180. {
  181. parts.Add(string.Format("{0} = '{1}'", where.Key, value));
  182. }
  183. }
  184. if (parts.Count > 0)
  185. {
  186. query += (had ? " AND" : string.Empty) + " (" + string.Join(" OR ", parts.ToArray()) + ")";
  187. had = true;
  188. }
  189. #endregion
  190. #region LIKE
  191. parts = new List<string>();
  192. foreach (KeyValuePair<string, string> where in filter.andLikeFilters)
  193. {
  194. parts.Add(string.Format("{0} LIKE '{1}'", where.Key, where.Value));
  195. }
  196. if (parts.Count > 0)
  197. {
  198. query += (had ? " AND" : string.Empty) + " (" + string.Join(" AND ", parts.ToArray()) + ")";
  199. had = true;
  200. }
  201. parts = new List<string>();
  202. foreach (KeyValuePair<string, string> where in filter.orLikeFilters)
  203. {
  204. parts.Add(string.Format("{0} LIKE '{1}'", where.Key, where.Value));
  205. }
  206. if (parts.Count > 0)
  207. {
  208. query += (had ? " AND" : string.Empty) + " (" + string.Join(" OR ", parts.ToArray()) + ")";
  209. had = true;
  210. }
  211. parts = new List<string>();
  212. foreach (KeyValuePair<string, List<string>> where in filter.orLikeMultiFilters)
  213. {
  214. foreach (string value in where.Value)
  215. {
  216. parts.Add(string.Format("{0} LIKE '{1}'", where.Key, value));
  217. }
  218. }
  219. if (parts.Count > 0)
  220. {
  221. query += (had ? " AND" : string.Empty) + " (" + string.Join(" OR ", parts.ToArray()) + ")";
  222. had = true;
  223. }
  224. #endregion
  225. #region bitfield &
  226. parts = new List<string>();
  227. foreach (KeyValuePair<string, uint> where in filter.andBitfieldAndFilters)
  228. {
  229. parts.Add(string.Format("{0} & {1}", where.Key, where.Value));
  230. }
  231. if (parts.Count > 0)
  232. {
  233. query += (had ? " AND" : string.Empty) + " (" + string.Join(" AND ", parts.ToArray()) + ")";
  234. had = true;
  235. }
  236. parts = new List<string>();
  237. foreach (KeyValuePair<string, uint> where in filter.orBitfieldAndFilters)
  238. {
  239. parts.Add(string.Format("{0} & {1}", where.Key, where.Value));
  240. }
  241. if (parts.Count > 0)
  242. {
  243. query += (had ? " AND" : string.Empty) + " (" + string.Join(" OR ", parts.ToArray()) + ")";
  244. had = true;
  245. }
  246. #endregion
  247. #region greater than
  248. parts = new List<string>();
  249. foreach (KeyValuePair<string, int> where in filter.andGreaterThanFilters)
  250. {
  251. parts.Add(string.Format("{0} > {1}", where.Key, where.Value));
  252. }
  253. if (parts.Count > 0)
  254. {
  255. query += (had ? " AND" : string.Empty) + " (" + string.Join(" AND ", parts.ToArray()) + ")";
  256. had = true;
  257. }
  258. parts = new List<string>();
  259. foreach (KeyValuePair<string, int> where in filter.orGreaterThanFilters)
  260. {
  261. parts.Add(string.Format("{0} > {1}", where.Key, where.Value));
  262. }
  263. if (parts.Count > 0)
  264. {
  265. query += (had ? " AND" : string.Empty) + " (" + string.Join(" OR ", parts.ToArray()) + ")";
  266. had = true;
  267. }
  268. parts = new List<string>();
  269. foreach (KeyValuePair<string, int> where in filter.andGreaterThanEqFilters)
  270. {
  271. parts.Add(string.Format("{0} >= {1}", where.Key, where.Value));
  272. }
  273. if (parts.Count > 0)
  274. {
  275. query += (had ? " AND" : string.Empty) + " (" + string.Join(" AND ", parts.ToArray()) + ")";
  276. had = true;
  277. }
  278. #endregion
  279. #region less than
  280. parts = new List<string>();
  281. foreach (KeyValuePair<string, int> where in filter.andLessThanFilters)
  282. {
  283. parts.Add(string.Format("{0} > {1}", where.Key, where.Value));
  284. }
  285. if (parts.Count > 0)
  286. {
  287. query += (had ? " AND" : string.Empty) + " (" + string.Join(" AND ", parts.ToArray()) + ")";
  288. had = true;
  289. }
  290. parts = new List<string>();
  291. foreach (KeyValuePair<string, int> where in filter.orLessThanFilters)
  292. {
  293. parts.Add(string.Format("{0} > {1}", where.Key, where.Value));
  294. }
  295. if (parts.Count > 0)
  296. {
  297. query += (had ? " AND" : string.Empty) + " (" + string.Join(" OR ", parts.ToArray()) + ")";
  298. had = true;
  299. }
  300. parts = new List<string>();
  301. foreach (KeyValuePair<string, int> where in filter.andLessThanEqFilters)
  302. {
  303. parts.Add(string.Format("{0} <= {1}", where.Key, where.Value));
  304. }
  305. if (parts.Count > 0)
  306. {
  307. query += (had ? " AND" : string.Empty) + " (" + string.Join(" AND ", parts.ToArray()) + ")";
  308. had = true;
  309. }
  310. #endregion
  311. foreach (QueryFilter subFilter in filter.subFilters)
  312. {
  313. query += (had ? " AND" : string.Empty) + QueryFilter2Query(subFilter);
  314. if (subFilter.Count > 0)
  315. {
  316. had = true;
  317. }
  318. }
  319. query += ")";
  320. }
  321. return query;
  322. }
  323. public override List<string> Query(string[] wantedValue, string table, QueryFilter queryFilter, Dictionary<string, bool> sort, uint? start, uint? count)
  324. {
  325. string query = string.Format("SELECT {0} FROM {1}", string.Join(", ", wantedValue), table);
  326. Dictionary<string, object> ps = new Dictionary<string, object>();
  327. List<string> retVal = new List<string>();
  328. List<string> parts = new List<string>();
  329. IDbCommand result;
  330. IDataReader reader;
  331. SqlConnection dbcon = GetLockedConnection();
  332. if (queryFilter != null && queryFilter.Count > 0)
  333. {
  334. query += " WHERE " + QueryFilter2Query(queryFilter);
  335. }
  336. if (sort != null && sort.Count > 0)
  337. {
  338. parts = new List<string>();
  339. foreach (KeyValuePair<string, bool> sortOrder in sort)
  340. {
  341. parts.Add(string.Format("`{0}` {1}", sortOrder.Key, sortOrder.Value ? "ASC" : "DESC"));
  342. }
  343. query += " ORDER BY " + string.Join(", ", parts.ToArray());
  344. }
  345. if (start.HasValue)
  346. {
  347. query += " LIMIT " + start.Value.ToString();
  348. if (count.HasValue)
  349. {
  350. query += ", " + count.Value.ToString();
  351. }
  352. }
  353. int i = 0;
  354. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  355. {
  356. using (reader = result.ExecuteReader())
  357. {
  358. try
  359. {
  360. while (reader.Read())
  361. {
  362. for (i = 0; i < reader.FieldCount; i++)
  363. {
  364. Type r = reader[i].GetType();
  365. retVal.Add(r == typeof(DBNull) ? null : reader.GetString(i));
  366. }
  367. }
  368. return retVal;
  369. }
  370. finally
  371. {
  372. reader.Close();
  373. reader.Dispose();
  374. result.Cancel();
  375. result.Dispose();
  376. CloseDatabase(dbcon);
  377. }
  378. }
  379. }
  380. }
  381. public override Dictionary<string, List<string>> QueryNames(string[] keyRow, object[] keyValue, string table, string wantedValue)
  382. {
  383. SqlConnection dbcon = GetLockedConnection();
  384. IDbCommand result;
  385. IDataReader reader;
  386. Dictionary<string, List<string>> RetVal = new Dictionary<string, List<string>>();
  387. string query = String.Format("select {0} from {1} where ",
  388. wantedValue, table);
  389. int i = 0;
  390. foreach (object value in keyValue)
  391. {
  392. query += String.Format("{0} = '{1}' and ", keyRow[i], value);
  393. i++;
  394. }
  395. query = query.Remove(query.Length - 5);
  396. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  397. {
  398. using (reader = result.ExecuteReader())
  399. {
  400. try
  401. {
  402. while (reader.Read())
  403. {
  404. for (i = 0; i < reader.FieldCount; i++)
  405. {
  406. Type r = reader[i].GetType();
  407. if (r == typeof (DBNull))
  408. AddValueToList(ref RetVal, reader.GetName(i), null);
  409. else
  410. AddValueToList(ref RetVal, reader.GetName(i), reader[i].ToString());
  411. }
  412. }
  413. return RetVal;
  414. }
  415. finally
  416. {
  417. reader.Close();
  418. reader.Dispose();
  419. result.Cancel();
  420. result.Dispose();
  421. CloseDatabase(dbcon);
  422. }
  423. }
  424. }
  425. }
  426. private void AddValueToList(ref Dictionary<string, List<string>> dic, string key, string value)
  427. {
  428. if (!dic.ContainsKey(key))
  429. dic.Add(key, new List<string>());
  430. dic[key].Add(value);
  431. }
  432. public override bool DirectUpdate(string table, object[] setValues, string[] setRows, string[] keyRows,
  433. object[] keyValues)
  434. {
  435. return Update(table, setValues, setRows, keyRows, keyValues);
  436. }
  437. public override bool Update(string table, object[] setValues, string[] setRows, string[] keyRows,
  438. object[] keyValues)
  439. {
  440. SqlConnection dbcon = GetLockedConnection();
  441. IDbCommand result;
  442. IDataReader reader;
  443. string query = String.Format("update {0} set ", table);
  444. int i = 0;
  445. Dictionary<string, object> parameters = new Dictionary<string, object>();
  446. foreach (object value in setValues)
  447. {
  448. query += string.Format("{0} = ?{1},", setRows[i], setRows[i]);
  449. string valueSTR = value.ToString();
  450. if (valueSTR == "")
  451. valueSTR = " ";
  452. parameters["?" + setRows[i]] = valueSTR;
  453. i++;
  454. }
  455. i = 0;
  456. query = query.Remove(query.Length - 1);
  457. query += " where ";
  458. foreach (object value in keyValues)
  459. {
  460. query += String.Format("{0} = '{1}' and ", keyRows[i], value);
  461. i++;
  462. }
  463. query = query.Remove(query.Length - 5);
  464. using (result = Query(query, parameters, dbcon))
  465. {
  466. using (reader = result.ExecuteReader())
  467. {
  468. reader.Close();
  469. reader.Dispose();
  470. result.Cancel();
  471. result.Dispose();
  472. CloseDatabase(dbcon);
  473. }
  474. }
  475. return true;
  476. }
  477. public override bool InsertMultiple(string table, List<object[]> values)
  478. {
  479. return false;
  480. }
  481. public override bool Insert(string table, object[] values)
  482. {
  483. SqlConnection dbcon = GetLockedConnection();
  484. IDbCommand result;
  485. IDataReader reader;
  486. string query = String.Format("insert into {0} values (", table);
  487. #if (!ISWIN)
  488. foreach (object value in values)
  489. query = query + String.Format("'{0}',", (object[]) value);
  490. #else
  491. query = values.Aggregate(query, (current, value) => current + String.Format("'{0}',", (object[]) value));
  492. #endif
  493. query = query.Remove(query.Length - 1);
  494. query += ")";
  495. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  496. {
  497. try
  498. {
  499. using (reader = result.ExecuteReader())
  500. {
  501. reader.Close();
  502. reader.Dispose();
  503. result.Cancel();
  504. result.Dispose();
  505. CloseDatabase(dbcon);
  506. }
  507. }
  508. catch
  509. {
  510. }
  511. }
  512. return true;
  513. }
  514. public override bool Insert(string table, string[] keys, object[] values)
  515. {
  516. SqlConnection dbcon = GetLockedConnection();
  517. IDbCommand result;
  518. IDataReader reader;
  519. string query = String.Format("insert into {0} values (", table);
  520. #if (!ISWIN)
  521. foreach (object value in values)
  522. query = query + String.Format("'{0}',", (object[]) value);
  523. #else
  524. query = values.Aggregate(query, (current, value) => current + String.Format("'{0}',", (object[]) value));
  525. #endif
  526. query = query.Remove(query.Length - 1);
  527. query += ")";
  528. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  529. {
  530. try
  531. {
  532. using (reader = result.ExecuteReader())
  533. {
  534. reader.Close();
  535. reader.Dispose();
  536. result.Cancel();
  537. result.Dispose();
  538. CloseDatabase(dbcon);
  539. }
  540. }
  541. catch
  542. {
  543. }
  544. }
  545. return true;
  546. }
  547. public override bool DirectReplace(string table, string[] keys, object[] values)
  548. {
  549. return Replace(table, keys, values);
  550. }
  551. public override bool Replace(string table, string[] keys, object[] values)
  552. {
  553. SqlConnection dbcon = GetLockedConnection();
  554. IDbCommand result;
  555. IDataReader reader;
  556. string query = String.Format("replace into {0} (", table);
  557. #if (!ISWIN)
  558. foreach (object o in keys)
  559. query = query + String.Format("{0},", (object[]) o);
  560. #else
  561. query = keys.Cast<object>().Aggregate(query, (current, key) => current + String.Format("{0},", (object[]) key));
  562. #endif
  563. query = query.Remove(query.Length - 1);
  564. query += ") values (";
  565. #if (!ISWIN)
  566. foreach (object value in values)
  567. query = query + String.Format("'{0}',", (object[]) value);
  568. #else
  569. query = values.Aggregate(query, (current, value) => current + String.Format("'{0}',", (object[]) value));
  570. #endif
  571. query = query.Remove(query.Length - 1);
  572. query += ")";
  573. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  574. {
  575. try
  576. {
  577. using (reader = result.ExecuteReader())
  578. {
  579. reader.Close();
  580. reader.Dispose();
  581. result.Cancel();
  582. result.Dispose();
  583. CloseDatabase(dbcon);
  584. }
  585. }
  586. catch
  587. {
  588. }
  589. }
  590. return true;
  591. }
  592. public override bool Insert(string table, object[] values, string updateKey, object updateValue)
  593. {
  594. SqlConnection dbcon = GetLockedConnection();
  595. IDbCommand result;
  596. IDataReader reader;
  597. string query = String.Format("insert into {0} VALUES('", table);
  598. #if (!ISWIN)
  599. foreach (object value in values)
  600. query = query + (value + "','");
  601. #else
  602. query = values.Aggregate(query, (current, value) => current + (value + "','"));
  603. #endif
  604. query = query.Remove(query.Length - 2);
  605. query += String.Format(") ON DUPLICATE KEY UPDATE {0} = '{1}'", updateKey, updateValue);
  606. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  607. {
  608. using (reader = result.ExecuteReader())
  609. {
  610. reader.Close();
  611. reader.Dispose();
  612. result.Cancel();
  613. result.Dispose();
  614. CloseDatabase(dbcon);
  615. }
  616. }
  617. return true;
  618. }
  619. public override bool Delete(string table, string[] keys, object[] values)
  620. {
  621. SqlConnection dbcon = GetLockedConnection();
  622. IDbCommand result;
  623. IDataReader reader;
  624. string query = "delete from " + table + (keys.Length > 0 ? " WHERE " : "");
  625. int i = 0;
  626. foreach (object value in values)
  627. {
  628. query += keys[i] + " = '" + value + "' AND ";
  629. i++;
  630. }
  631. if (keys.Length > 0)
  632. query = query.Remove(query.Length - 5);
  633. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  634. {
  635. using (reader = result.ExecuteReader())
  636. {
  637. reader.Close();
  638. reader.Dispose();
  639. result.Cancel();
  640. result.Dispose();
  641. }
  642. }
  643. CloseDatabase(dbcon);
  644. return true;
  645. }
  646. public override string FormatDateTimeString(int time)
  647. {
  648. return "";
  649. }
  650. public override string IsNull(string Field, string defaultValue)
  651. {
  652. return "ISNULL(" + Field + "," + defaultValue + ")";
  653. }
  654. public override string ConCat(string[] toConcat)
  655. {
  656. #if (!ISWIN)
  657. string returnValue = "";
  658. foreach (string s in toConcat)
  659. returnValue = returnValue + (s + " + ");
  660. #else
  661. string returnValue = toConcat.Aggregate("", (current, s) => current + (s + " + "));
  662. #endif
  663. return returnValue.Substring(0, returnValue.Length - 3);
  664. }
  665. public override bool DeleteByTime(string table, string key)
  666. {
  667. SqlConnection dbcon = GetLockedConnection();
  668. IDbCommand result;
  669. IDataReader reader;
  670. string query = "delete from " + table + " WHERE 'key' < now()";
  671. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  672. {
  673. using (reader = result.ExecuteReader())
  674. {
  675. reader.Close();
  676. reader.Dispose();
  677. result.Cancel();
  678. result.Dispose();
  679. }
  680. }
  681. CloseDatabase(dbcon);
  682. return true;
  683. }
  684. public override bool Delete(string table, string whereclause)
  685. {
  686. SqlConnection dbcon = GetLockedConnection();
  687. IDbCommand result;
  688. IDataReader reader;
  689. string query = "delete from " + table + " WHERE " + whereclause;
  690. using (result = Query(query, new Dictionary<string, object>(), dbcon))
  691. {
  692. using (reader = result.ExecuteReader())
  693. {
  694. reader.Close();
  695. reader.Dispose();
  696. result.Cancel();
  697. result.Dispose();
  698. }
  699. }
  700. CloseDatabase(dbcon);
  701. return true;
  702. }
  703. public void CloseDatabase(SqlConnection connection)
  704. {
  705. connection.Close();
  706. connection.Dispose();
  707. }
  708. public override void CloseDatabase()
  709. {
  710. m_connection.Close();
  711. m_connection.Dispose();
  712. }
  713. public override void CreateTable(string table, ColumnDefinition[] columns, IndexDefinition[] indices)
  714. {
  715. if (TableExists(table))
  716. {
  717. throw new DataManagerException("Trying to create a table with name of one that already exists.");
  718. }
  719. string columnDefinition = string.Empty;
  720. foreach (ColumnDefinition column in columns)
  721. {
  722. if (columnDefinition != string.Empty)
  723. {
  724. columnDefinition += ", ";
  725. }
  726. columnDefinition += column.Name + " " + GetColumnTypeStringSymbol(column.Type);
  727. }
  728. string query = string.Format("create table " + table + " ( {0} {1}) ", columnDefinition, string.Empty);
  729. SqlConnection dbcon = GetLockedConnection();
  730. SqlCommand dbcommand = dbcon.CreateCommand();
  731. dbcommand.CommandText = query;
  732. dbcommand.ExecuteNonQuery();
  733. CloseDatabase(dbcon);
  734. }
  735. public override void UpdateTable(string table, ColumnDefinition[] columns, IndexDefinition[] indices, Dictionary<string, string> renameColumns)
  736. {
  737. if (TableExists(table))
  738. {
  739. throw new DataManagerException("Trying to create a table with name of one that already exists.");
  740. }
  741. string columnDefinition = string.Empty;
  742. foreach (ColumnDefinition column in columns)
  743. {
  744. if (columnDefinition != string.Empty)
  745. {
  746. columnDefinition += ", ";
  747. }
  748. columnDefinition += column.Name + " " + GetColumnTypeStringSymbol(column.Type);
  749. }
  750. string query = string.Format("create table " + table + " ( {0} {1}) ", columnDefinition, string.Empty);
  751. SqlConnection dbcon = GetLockedConnection();
  752. SqlCommand dbcommand = dbcon.CreateCommand();
  753. dbcommand.CommandText = query;
  754. dbcommand.ExecuteNonQuery();
  755. CloseDatabase(dbcon);
  756. }
  757. public override string GetColumnTypeStringSymbol(ColumnTypes type)
  758. {
  759. switch (type)
  760. {
  761. case ColumnTypes.Double:
  762. return "DOUBLE";
  763. case ColumnTypes.Integer11:
  764. return "INT(11)";
  765. case ColumnTypes.Integer30:
  766. return "INT(30)";
  767. case ColumnTypes.UInteger11:
  768. return "INT(11) UNSIGNED";
  769. case ColumnTypes.UInteger30:
  770. return "INT(30) UNSIGNED";
  771. case ColumnTypes.Char36:
  772. return "CHAR(36)";
  773. case ColumnTypes.Char32:
  774. return "CHAR(32)";
  775. case ColumnTypes.String:
  776. return "TEXT";
  777. case ColumnTypes.String1:
  778. return "VARCHAR(1)";
  779. case ColumnTypes.String2:
  780. return "VARCHAR(2)";
  781. case ColumnTypes.String16:
  782. return "VARCHAR(16)";
  783. case ColumnTypes.String30:
  784. return "VARCHAR(30)";
  785. case ColumnTypes.String32:
  786. return "VARCHAR(32)";
  787. case ColumnTypes.String36:
  788. return "VARCHAR(36)";
  789. case ColumnTypes.String45:
  790. return "VARCHAR(45)";
  791. case ColumnTypes.String64:
  792. return "VARCHAR(64)";
  793. case ColumnTypes.String128:
  794. return "VARCHAR(128)";
  795. case ColumnTypes.String50:
  796. return "VARCHAR(50)";
  797. case ColumnTypes.String100:
  798. return "VARCHAR(100)";
  799. case ColumnTypes.String10:
  800. return "VARCHAR(10)";
  801. case ColumnTypes.String255:
  802. return "VARCHAR(255)";
  803. case ColumnTypes.String512:
  804. return "VARCHAR(512)";
  805. case ColumnTypes.String1024:
  806. return "VARCHAR(1024)";
  807. case ColumnTypes.String8196:
  808. return "VARCHAR(8196)";
  809. case ColumnTypes.Blob:
  810. return "image";
  811. case ColumnTypes.LongBlob:
  812. return "image";
  813. case ColumnTypes.Date:
  814. return "DATE";
  815. case ColumnTypes.DateTime:
  816. return "DATETIME";
  817. case ColumnTypes.Text:
  818. return "TEXT";
  819. case ColumnTypes.MediumText:
  820. return "MEDIUMTEXT";
  821. case ColumnTypes.LongText:
  822. return "LONGTEXT";
  823. case ColumnTypes.Float:
  824. return "float";
  825. case ColumnTypes.TinyInt1:
  826. return "TINYINT(1)";
  827. case ColumnTypes.TinyInt4:
  828. return "TINYINT(4)";
  829. default:
  830. throw new DataManagerException("Unknown column type.");
  831. }
  832. }
  833. public override void DropTable(string tableName)
  834. {
  835. SqlConnection dbcon = GetLockedConnection();
  836. SqlCommand dbcommand = dbcon.CreateCommand();
  837. dbcommand.CommandText = string.Format("drop table {0}", tableName);
  838. ;
  839. dbcommand.ExecuteNonQuery();
  840. CloseDatabase(dbcon);
  841. }
  842. public override void ForceRenameTable(string oldTableName, string newTableName)
  843. {
  844. SqlConnection dbcon = GetLockedConnection();
  845. SqlCommand dbcommand = dbcon.CreateCommand();
  846. dbcommand.CommandText = string.Format("RENAME TABLE {0} TO {1}", oldTableName, newTableName);
  847. dbcommand.ExecuteNonQuery();
  848. CloseDatabase(dbcon);
  849. }
  850. protected override void CopyAllDataBetweenMatchingTables(string sourceTableName, string destinationTableName, ColumnDefinition[] columnDefinitions, IndexDefinition[] indexDefinitions)
  851. {
  852. SqlConnection dbcon = GetLockedConnection();
  853. SqlCommand dbcommand = dbcon.CreateCommand();
  854. dbcommand.CommandText = string.Format("insert into {0} select * from {1}", destinationTableName, sourceTableName);
  855. dbcommand.ExecuteNonQuery();
  856. CloseDatabase(dbcon);
  857. }
  858. public override bool TableExists(string table)
  859. {
  860. SqlConnection dbcon = GetLockedConnection();
  861. SqlCommand dbcommand = dbcon.CreateCommand();
  862. dbcommand.CommandText =
  863. string.Format(
  864. "select table_name from information_schema.tables where table_schema=database() and table_name='{0}'",
  865. table.ToLower());
  866. var rdr = dbcommand.ExecuteReader();
  867. var ret = false;
  868. if (rdr.Read())
  869. {
  870. ret = true;
  871. }
  872. rdr.Close();
  873. rdr.Dispose();
  874. dbcommand.Dispose();
  875. CloseDatabase(dbcon);
  876. return ret;
  877. }
  878. protected override List<ColumnDefinition> ExtractColumnsFromTable(string tableName)
  879. {
  880. var defs = new List<ColumnDefinition>();
  881. SqlConnection dbcon = GetLockedConnection();
  882. SqlCommand dbcommand = dbcon.CreateCommand();
  883. dbcommand.CommandText = string.Format("desc {0}", tableName);
  884. var rdr = dbcommand.ExecuteReader();
  885. while (rdr.Read())
  886. {
  887. var name = rdr["Field"];
  888. var pk = rdr["Key"];
  889. var type = rdr["Type"];
  890. defs.Add(new ColumnDefinition
  891. {
  892. Name = name.ToString(),
  893. Type = ConvertTypeToColumnType(type.ToString())
  894. });
  895. }
  896. rdr.Close();
  897. rdr.Dispose();
  898. dbcommand.Dispose();
  899. CloseDatabase(dbcon);
  900. return defs;
  901. }
  902. protected override Dictionary<string, IndexDefinition> ExtractIndicesFromTable(string tableName)
  903. {
  904. throw new NotImplementedException();
  905. }
  906. private ColumnTypes ConvertTypeToColumnType(string typeString)
  907. {
  908. string tStr = typeString.ToLower();
  909. //we'll base our names on lowercase
  910. switch (tStr)
  911. {
  912. case "double":
  913. return ColumnTypes.Double;
  914. case "int(11)":
  915. return ColumnTypes.Integer11;
  916. case "int(30)":
  917. return ColumnTypes.Integer30;
  918. case "integer":
  919. return ColumnTypes.Integer11;
  920. case "char(36)":
  921. return ColumnTypes.Char36;
  922. case "char(32)":
  923. return ColumnTypes.Char32;
  924. case "varchar(1)":
  925. return ColumnTypes.String1;
  926. case "varchar(2)":
  927. return ColumnTypes.String2;
  928. case "varchar(10)":
  929. return ColumnTypes.String10;
  930. case "varchar(16)":
  931. return ColumnTypes.String16;
  932. case "varchar(30)":
  933. return ColumnTypes.String30;
  934. case "varchar(32)":
  935. return ColumnTypes.String32;
  936. case "varchar(36)":
  937. return ColumnTypes.String36;
  938. case "varchar(45)":
  939. return ColumnTypes.String45;
  940. case "varchar(64)":
  941. return ColumnTypes.String64;
  942. case "varchar(128)":
  943. return ColumnTypes.String128;
  944. case "varchar(50)":
  945. return ColumnTypes.String50;
  946. case "varchar(100)":
  947. return ColumnTypes.String100;
  948. case "varchar(255)":
  949. return ColumnTypes.String255;
  950. case "varchar(512)":
  951. return ColumnTypes.String512;
  952. case "varchar(1024)":
  953. return ColumnTypes.String1024;
  954. case "varchar(8196)":
  955. return ColumnTypes.String8196;
  956. case "date":
  957. return ColumnTypes.Date;
  958. case "datetime":
  959. return ColumnTypes.DateTime;
  960. case "text":
  961. return ColumnTypes.Text;
  962. case "mediumtext":
  963. return ColumnTypes.MediumText;
  964. case "longtext":
  965. return ColumnTypes.LongText;
  966. case "float":
  967. return ColumnTypes.Float;
  968. case "image":
  969. return ColumnTypes.Blob;
  970. case "tinyint(1)":
  971. return ColumnTypes.TinyInt1;
  972. case "tinyint(4)":
  973. return ColumnTypes.TinyInt4;
  974. default:
  975. throw new Exception(
  976. "You've discovered some type in MySQL that's not reconized by Aurora, please place the correct conversion in ConvertTypeToColumnType.");
  977. }
  978. }
  979. public override IGenericData Copy()
  980. {
  981. return new MSSQLDataLoader();
  982. }
  983. }*/
  984. }