diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Data/MySQL/MySQLDataStore.cs | 139 |
1 files changed, 128 insertions, 11 deletions
diff --git a/OpenSim/Data/MySQL/MySQLDataStore.cs b/OpenSim/Data/MySQL/MySQLDataStore.cs index 7714fdc..d438064 100644 --- a/OpenSim/Data/MySQL/MySQLDataStore.cs +++ b/OpenSim/Data/MySQL/MySQLDataStore.cs | |||
@@ -50,6 +50,12 @@ namespace OpenSim.Data.MySQL | |||
50 | private const string m_terrainSelect = "select * from terrain limit 1"; | 50 | private const string m_terrainSelect = "select * from terrain limit 1"; |
51 | private const string m_landSelect = "select * from land"; | 51 | private const string m_landSelect = "select * from land"; |
52 | private const string m_landAccessListSelect = "select * from landaccesslist"; | 52 | private const string m_landAccessListSelect = "select * from landaccesslist"; |
53 | |||
54 | |||
55 | /// <summary> | ||
56 | /// We're only using this to version the table! | ||
57 | /// </summary> | ||
58 | |||
53 | 59 | ||
54 | private DataSet m_dataSet; | 60 | private DataSet m_dataSet; |
55 | private MySqlDataAdapter m_primDataAdapter; | 61 | private MySqlDataAdapter m_primDataAdapter; |
@@ -85,6 +91,8 @@ namespace OpenSim.Data.MySQL | |||
85 | m_log.Info("[DATASTORE]: MySql - connecting: " + connectionstring); | 91 | m_log.Info("[DATASTORE]: MySql - connecting: " + connectionstring); |
86 | m_connection = new MySqlConnection(connectionstring); | 92 | m_connection = new MySqlConnection(connectionstring); |
87 | 93 | ||
94 | TestTablesVersionable(m_connection); | ||
95 | |||
88 | MySqlCommand primSelectCmd = new MySqlCommand(m_primSelect, m_connection); | 96 | MySqlCommand primSelectCmd = new MySqlCommand(m_primSelect, m_connection); |
89 | m_primDataAdapter = new MySqlDataAdapter(primSelectCmd); | 97 | m_primDataAdapter = new MySqlDataAdapter(primSelectCmd); |
90 | 98 | ||
@@ -103,6 +111,7 @@ namespace OpenSim.Data.MySQL | |||
103 | MySqlCommand landAccessListSelectCmd = new MySqlCommand(m_landAccessListSelect, m_connection); | 111 | MySqlCommand landAccessListSelectCmd = new MySqlCommand(m_landAccessListSelect, m_connection); |
104 | m_landAccessListDataAdapter = new MySqlDataAdapter(landAccessListSelectCmd); | 112 | m_landAccessListDataAdapter = new MySqlDataAdapter(landAccessListSelectCmd); |
105 | 113 | ||
114 | |||
106 | TestTables(m_connection); | 115 | TestTables(m_connection); |
107 | 116 | ||
108 | lock (m_dataSet) | 117 | lock (m_dataSet) |
@@ -141,7 +150,104 @@ namespace OpenSim.Data.MySQL | |||
141 | m_landAccessListDataAdapter.Fill(m_landAccessListTable); | 150 | m_landAccessListDataAdapter.Fill(m_landAccessListTable); |
142 | } | 151 | } |
143 | } | 152 | } |
153 | /// <summary> | ||
154 | /// Given a list of tables, return the version of the tables, as seen in the database | ||
155 | /// </summary> | ||
156 | /// <param name="tableList"></param> | ||
157 | public void GetTableVersion(Dictionary<string, string> tableList, MySqlConnection dbcon) | ||
158 | { | ||
159 | lock (dbcon) | ||
160 | { | ||
161 | MySqlCommand tablesCmd = | ||
162 | new MySqlCommand( | ||
163 | "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?dbname", | ||
164 | dbcon); | ||
165 | tablesCmd.Parameters.AddWithValue("?dbname", dbcon.Database); | ||
166 | using (MySqlDataReader tables = tablesCmd.ExecuteReader()) | ||
167 | { | ||
168 | while (tables.Read()) | ||
169 | { | ||
170 | try | ||
171 | { | ||
172 | string tableName = (string)tables["TABLE_NAME"]; | ||
173 | string comment = (string)tables["TABLE_COMMENT"]; | ||
174 | if (tableList.ContainsKey(tableName)) | ||
175 | { | ||
176 | tableList[tableName] = comment; | ||
177 | } | ||
178 | } | ||
179 | catch (Exception e) | ||
180 | { | ||
181 | m_log.Error(e.ToString()); | ||
182 | } | ||
183 | } | ||
184 | tables.Close(); | ||
185 | } | ||
186 | } | ||
187 | } | ||
188 | private void TestTablesVersionable(MySqlConnection dbconn) | ||
189 | { | ||
190 | Dictionary<string, string> tableList = new Dictionary<string, string>(); | ||
191 | |||
192 | tableList["land"] = null; | ||
193 | dbconn.Open(); | ||
194 | GetTableVersion(tableList,dbconn); | ||
195 | |||
196 | UpgradeLandTable(tableList["land"], dbconn); | ||
197 | //database.Close(); | ||
198 | |||
199 | } | ||
200 | |||
201 | /// <summary> | ||
202 | /// Execute a SQL statement stored in a resource, as a string | ||
203 | /// </summary> | ||
204 | /// <param name="name"></param> | ||
205 | public void ExecuteResourceSql(string name, MySqlConnection dbcon) | ||
206 | { | ||
207 | MySqlCommand cmd = new MySqlCommand(getResourceString(name), dbcon); | ||
208 | cmd.ExecuteNonQuery(); | ||
209 | } | ||
210 | |||
211 | /// <summary> | ||
212 | /// Extract a named string resource from the embedded resources | ||
213 | /// </summary> | ||
214 | /// <param name="name">name of embedded resource</param> | ||
215 | /// <returns>string contained within the embedded resource</returns> | ||
216 | private string getResourceString(string name) | ||
217 | { | ||
218 | Assembly assem = GetType().Assembly; | ||
219 | string[] names = assem.GetManifestResourceNames(); | ||
220 | |||
221 | foreach (string s in names) | ||
222 | { | ||
223 | if (s.EndsWith(name)) | ||
224 | { | ||
225 | using (Stream resource = assem.GetManifestResourceStream(s)) | ||
226 | { | ||
227 | using (StreamReader resourceReader = new StreamReader(resource)) | ||
228 | { | ||
229 | string resourceString = resourceReader.ReadToEnd(); | ||
230 | return resourceString; | ||
231 | } | ||
232 | } | ||
233 | } | ||
234 | } | ||
235 | throw new Exception(string.Format("Resource '{0}' was not found", name)); | ||
236 | } | ||
144 | 237 | ||
238 | private void UpgradeLandTable(string oldVersion, MySqlConnection dbconn) | ||
239 | { | ||
240 | // null as the version, indicates that the table didn't exist | ||
241 | if (oldVersion == null) | ||
242 | { | ||
243 | ExecuteResourceSql("CreateLandTable.sql",dbconn); | ||
244 | oldVersion = "Rev. 2; InnoDB free: 0 kB"; | ||
245 | } | ||
246 | if (!oldVersion.Contains("Rev.")) | ||
247 | { | ||
248 | ExecuteResourceSql("UpgradeLandTableToVersion2.sql", dbconn); | ||
249 | } | ||
250 | } | ||
145 | public void StoreObject(SceneObjectGroup obj, LLUUID regionUUID) | 251 | public void StoreObject(SceneObjectGroup obj, LLUUID regionUUID) |
146 | { | 252 | { |
147 | lock (m_dataSet) | 253 | lock (m_dataSet) |
@@ -673,6 +779,7 @@ namespace OpenSim.Data.MySQL | |||
673 | createCol(land, "UserLookAtX", typeof (Double)); | 779 | createCol(land, "UserLookAtX", typeof (Double)); |
674 | createCol(land, "UserLookAtY", typeof (Double)); | 780 | createCol(land, "UserLookAtY", typeof (Double)); |
675 | createCol(land, "UserLookAtZ", typeof (Double)); | 781 | createCol(land, "UserLookAtZ", typeof (Double)); |
782 | createCol(land, "AuthBuyerID", typeof (String)); | ||
676 | 783 | ||
677 | land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]}; | 784 | land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]}; |
678 | 785 | ||
@@ -925,7 +1032,14 @@ namespace OpenSim.Data.MySQL | |||
925 | newData.musicURL = (String) row["MusicURL"]; | 1032 | newData.musicURL = (String) row["MusicURL"]; |
926 | newData.passHours = Convert.ToSingle(row["PassHours"]); | 1033 | newData.passHours = Convert.ToSingle(row["PassHours"]); |
927 | newData.passPrice = Convert.ToInt32(row["PassPrice"]); | 1034 | newData.passPrice = Convert.ToInt32(row["PassPrice"]); |
928 | newData.snapshotID = (String) row["SnapshotUUID"]; | 1035 | LLUUID authedbuyer = LLUUID.Zero; |
1036 | LLUUID snapshotID = LLUUID.Zero; | ||
1037 | |||
1038 | Helpers.TryParse((string)row["AuthBuyerID"], out authedbuyer); | ||
1039 | Helpers.TryParse((string)row["SnapshotUUID"], out snapshotID); | ||
1040 | |||
1041 | newData.authBuyerID = authedbuyer; | ||
1042 | newData.snapshotID = snapshotID; | ||
929 | 1043 | ||
930 | newData.userLocation = | 1044 | newData.userLocation = |
931 | new LLVector3(Convert.ToSingle(row["UserLocationX"]), Convert.ToSingle(row["UserLocationY"]), | 1045 | new LLVector3(Convert.ToSingle(row["UserLocationX"]), Convert.ToSingle(row["UserLocationY"]), |
@@ -1096,6 +1210,7 @@ namespace OpenSim.Data.MySQL | |||
1096 | row["UserLookAtX"] = land.userLookAt.X; | 1210 | row["UserLookAtX"] = land.userLookAt.X; |
1097 | row["UserLookAtY"] = land.userLookAt.Y; | 1211 | row["UserLookAtY"] = land.userLookAt.Y; |
1098 | row["UserLookAtZ"] = land.userLookAt.Z; | 1212 | row["UserLookAtZ"] = land.userLookAt.Z; |
1213 | row["AuthBuyerID"] = land.authBuyerID; | ||
1099 | } | 1214 | } |
1100 | 1215 | ||
1101 | private void fillLandAccessRow(DataRow row, ParcelManager.ParcelAccessEntry entry, LLUUID parcelID) | 1216 | private void fillLandAccessRow(DataRow row, ParcelManager.ParcelAccessEntry entry, LLUUID parcelID) |
@@ -1479,14 +1594,16 @@ namespace OpenSim.Data.MySQL | |||
1479 | string createShapes = defineTable(createShapeTable()); | 1594 | string createShapes = defineTable(createShapeTable()); |
1480 | string createItems = defineTable(createItemsTable()); | 1595 | string createItems = defineTable(createItemsTable()); |
1481 | string createTerrain = defineTable(createTerrainTable()); | 1596 | string createTerrain = defineTable(createTerrainTable()); |
1482 | string createLand = defineTable(createLandTable()); | 1597 | |
1598 | // Land table is created from the Versionable Test Table routine now. | ||
1599 | //string createLand = defineTable(createLandTable()); | ||
1483 | string createLandAccessList = defineTable(createLandAccessListTable()); | 1600 | string createLandAccessList = defineTable(createLandAccessListTable()); |
1484 | 1601 | ||
1485 | MySqlCommand pcmd = new MySqlCommand(createPrims, conn); | 1602 | MySqlCommand pcmd = new MySqlCommand(createPrims, conn); |
1486 | MySqlCommand scmd = new MySqlCommand(createShapes, conn); | 1603 | MySqlCommand scmd = new MySqlCommand(createShapes, conn); |
1487 | MySqlCommand icmd = new MySqlCommand(createItems, conn); | 1604 | MySqlCommand icmd = new MySqlCommand(createItems, conn); |
1488 | MySqlCommand tcmd = new MySqlCommand(createTerrain, conn); | 1605 | MySqlCommand tcmd = new MySqlCommand(createTerrain, conn); |
1489 | MySqlCommand lcmd = new MySqlCommand(createLand, conn); | 1606 | //MySqlCommand lcmd = new MySqlCommand(createLand, conn); |
1490 | MySqlCommand lalcmd = new MySqlCommand(createLandAccessList, conn); | 1607 | MySqlCommand lalcmd = new MySqlCommand(createLandAccessList, conn); |
1491 | 1608 | ||
1492 | if (conn.State != ConnectionState.Open) | 1609 | if (conn.State != ConnectionState.Open) |
@@ -1539,14 +1656,14 @@ namespace OpenSim.Data.MySQL | |||
1539 | m_log.WarnFormat("[MySql]: Terrain Table Already Exists: {0}", e); | 1656 | m_log.WarnFormat("[MySql]: Terrain Table Already Exists: {0}", e); |
1540 | } | 1657 | } |
1541 | 1658 | ||
1542 | try | 1659 | //try |
1543 | { | 1660 | //{ |
1544 | lcmd.ExecuteNonQuery(); | 1661 | //lcmd.ExecuteNonQuery(); |
1545 | } | 1662 | //} |
1546 | catch (MySqlException e) | 1663 | //catch (MySqlException e) |
1547 | { | 1664 | //{ |
1548 | m_log.WarnFormat("[MySql]: Land Table Already Exists: {0}", e); | 1665 | //m_log.WarnFormat("[MySql]: Land Table Already Exists: {0}", e); |
1549 | } | 1666 | //} |
1550 | 1667 | ||
1551 | try | 1668 | try |
1552 | { | 1669 | { |