diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Data/MSSQL/MSSQLAssetData.cs | 245 |
1 files changed, 147 insertions, 98 deletions
diff --git a/OpenSim/Data/MSSQL/MSSQLAssetData.cs b/OpenSim/Data/MSSQL/MSSQLAssetData.cs index ed1c91b..4d5ca1c 100644 --- a/OpenSim/Data/MSSQL/MSSQLAssetData.cs +++ b/OpenSim/Data/MSSQL/MSSQLAssetData.cs | |||
@@ -41,44 +41,83 @@ namespace OpenSim.Data.MSSQL | |||
41 | /// </summary> | 41 | /// </summary> |
42 | internal class MSSQLAssetData : AssetDataBase | 42 | internal class MSSQLAssetData : AssetDataBase |
43 | { | 43 | { |
44 | private const string _migrationStore = "AssetStore"; | ||
45 | |||
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
45 | 47 | ||
48 | /// <summary> | ||
49 | /// Database manager | ||
50 | /// </summary> | ||
46 | private MSSQLManager database; | 51 | private MSSQLManager database; |
47 | 52 | ||
48 | #region IAssetProviderPlugin Members | 53 | #region IPlugin Members |
54 | |||
55 | override public void Dispose() { } | ||
49 | 56 | ||
50 | /// <summary> | 57 | /// <summary> |
51 | /// Migration method | 58 | /// <para>Initialises asset interface</para> |
52 | /// <list type="bullet"> | ||
53 | /// <item>Execute "CreateAssetsTable.sql" if tableName == null</item> | ||
54 | /// </list> | ||
55 | /// </summary> | 59 | /// </summary> |
56 | /// <param name="tableName">Name of table</param> | 60 | override public void Initialise() |
57 | private void UpgradeAssetsTable(string tableName) | ||
58 | { | 61 | { |
59 | // null as the version, indicates that the table didn't exist | 62 | m_log.Info("[MSSQLUserData]: " + Name + " cannot be default-initialized!"); |
60 | if (tableName == null) | 63 | throw new PluginNotInitialisedException(Name); |
64 | } | ||
65 | |||
66 | /// <summary> | ||
67 | /// Initialises asset interface | ||
68 | /// </summary> | ||
69 | /// <para> | ||
70 | /// a string instead of file, if someone writes the support | ||
71 | /// </para> | ||
72 | /// <param name="connectionString">connect string</param> | ||
73 | override public void Initialise(string connectionString) | ||
74 | { | ||
75 | if (string.IsNullOrEmpty(connectionString)) | ||
61 | { | 76 | { |
62 | m_log.Info("[ASSET DB]: Creating new database tables"); | 77 | database = new MSSQLManager(connectionString); |
63 | database.ExecuteResourceSql("CreateAssetsTable.sql"); | 78 | } |
64 | return; | 79 | else |
80 | { | ||
81 | |||
82 | IniFile gridDataMSSqlFile = new IniFile("mssql_connection.ini"); | ||
83 | string settingDataSource = gridDataMSSqlFile.ParseFileReadValue("data_source"); | ||
84 | string settingInitialCatalog = gridDataMSSqlFile.ParseFileReadValue("initial_catalog"); | ||
85 | string settingPersistSecurityInfo = gridDataMSSqlFile.ParseFileReadValue("persist_security_info"); | ||
86 | string settingUserId = gridDataMSSqlFile.ParseFileReadValue("user_id"); | ||
87 | string settingPassword = gridDataMSSqlFile.ParseFileReadValue("password"); | ||
88 | |||
89 | database = | ||
90 | new MSSQLManager(settingDataSource, settingInitialCatalog, settingPersistSecurityInfo, settingUserId, | ||
91 | settingPassword); | ||
65 | } | 92 | } |
66 | 93 | ||
94 | //TODO can be removed at some time!! | ||
95 | TestTables(); | ||
96 | |||
97 | //New migration to check for DB changes | ||
98 | database.CheckMigration(_migrationStore); | ||
67 | } | 99 | } |
68 | 100 | ||
69 | /// <summary> | 101 | /// <summary> |
70 | /// Ensure that the assets related tables exists and are at the latest version | 102 | /// Database provider version. |
71 | /// </summary> | 103 | /// </summary> |
72 | private void TestTables() | 104 | override public string Version |
73 | { | 105 | { |
74 | Dictionary<string, string> tableList = new Dictionary<string, string>(); | 106 | get { return database.getVersion(); } |
75 | 107 | } | |
76 | tableList["assets"] = null; | ||
77 | database.GetTableVersion(tableList); | ||
78 | 108 | ||
79 | UpgradeAssetsTable(tableList["assets"]); | 109 | /// <summary> |
110 | /// The name of this DB provider. | ||
111 | /// </summary> | ||
112 | override public string Name | ||
113 | { | ||
114 | get { return "MSSQL Asset storage engine"; } | ||
80 | } | 115 | } |
81 | 116 | ||
117 | #endregion | ||
118 | |||
119 | #region IAssetProviderPlugin Members | ||
120 | |||
82 | /// <summary> | 121 | /// <summary> |
83 | /// Fetch Asset from database | 122 | /// Fetch Asset from database |
84 | /// </summary> | 123 | /// </summary> |
@@ -86,13 +125,26 @@ namespace OpenSim.Data.MSSQL | |||
86 | /// <returns></returns> | 125 | /// <returns></returns> |
87 | override public AssetBase FetchAsset(UUID assetID) | 126 | override public AssetBase FetchAsset(UUID assetID) |
88 | { | 127 | { |
89 | Dictionary<string, string> param = new Dictionary<string, string>(); | 128 | using (AutoClosingSqlCommand command = database.Query("SELECT * FROM assets WHERE id = @id")) |
90 | param["id"] = assetID.ToString(); | ||
91 | |||
92 | using (IDbCommand result = database.Query("SELECT * FROM assets WHERE id = @id", param)) | ||
93 | using (IDataReader reader = result.ExecuteReader()) | ||
94 | { | 129 | { |
95 | return database.getAssetRow(reader); | 130 | command.Parameters.Add(database.CreateParameter("id", assetID)); |
131 | using (IDataReader reader = command.ExecuteReader()) | ||
132 | { | ||
133 | if (reader.Read()) | ||
134 | { | ||
135 | AssetBase asset = new AssetBase(); | ||
136 | // Region Main | ||
137 | asset.FullID = new UUID((string)reader["id"]); | ||
138 | asset.Name = (string)reader["name"]; | ||
139 | asset.Description = (string)reader["description"]; | ||
140 | asset.Type = Convert.ToSByte(reader["assetType"]); | ||
141 | asset.Local = Convert.ToBoolean(reader["local"]); | ||
142 | asset.Temporary = Convert.ToBoolean(reader["temporary"]); | ||
143 | asset.Data = (byte[])reader["data"]; | ||
144 | return asset; | ||
145 | } | ||
146 | return null; // throw new Exception("No rows to return"); | ||
147 | } | ||
96 | } | 148 | } |
97 | } | 149 | } |
98 | 150 | ||
@@ -102,34 +154,27 @@ namespace OpenSim.Data.MSSQL | |||
102 | /// <param name="asset">the asset</param> | 154 | /// <param name="asset">the asset</param> |
103 | override public void CreateAsset(AssetBase asset) | 155 | override public void CreateAsset(AssetBase asset) |
104 | { | 156 | { |
105 | if (ExistsAsset((UUID) asset.FullID)) | 157 | if (ExistsAsset(asset.FullID)) |
106 | { | 158 | { |
107 | return; | 159 | return; |
108 | } | 160 | } |
109 | 161 | ||
110 | 162 | using (AutoClosingSqlCommand command = database.Query( | |
111 | using (AutoClosingSqlCommand cmd = | ||
112 | database.Query( | ||
113 | "INSERT INTO assets ([id], [name], [description], [assetType], [local], [temporary], [data])" + | 163 | "INSERT INTO assets ([id], [name], [description], [assetType], [local], [temporary], [data])" + |
114 | " VALUES " + | 164 | " VALUES " + |
115 | "(@id, @name, @description, @assetType, @local, @temporary, @data)")) | 165 | "(@id, @name, @description, @assetType, @local, @temporary, @data)")) |
116 | { | 166 | { |
117 | |||
118 | //SqlParameter p = cmd.Parameters.Add("id", SqlDbType.NVarChar); | 167 | //SqlParameter p = cmd.Parameters.Add("id", SqlDbType.NVarChar); |
119 | //p.Value = asset.FullID.ToString(); | 168 | //p.Value = asset.FullID.ToString(); |
120 | cmd.Parameters.AddWithValue("id", asset.FullID.ToString()); | 169 | command.Parameters.Add(database.CreateParameter("id", asset.FullID)); |
121 | cmd.Parameters.AddWithValue("name", asset.Name); | 170 | command.Parameters.Add(database.CreateParameter("name", asset.Name)); |
122 | cmd.Parameters.AddWithValue("description", asset.Description); | 171 | command.Parameters.Add(database.CreateParameter("description", asset.Description)); |
123 | SqlParameter e = cmd.Parameters.Add("assetType", SqlDbType.TinyInt); | 172 | command.Parameters.Add(database.CreateParameter("assetType", asset.Type)); |
124 | e.Value = asset.Type; | 173 | command.Parameters.Add(database.CreateParameter("local", asset.Local)); |
125 | SqlParameter g = cmd.Parameters.Add("local", SqlDbType.TinyInt); | 174 | command.Parameters.Add(database.CreateParameter("temporary", asset.Temporary)); |
126 | g.Value = asset.Local; | 175 | command.Parameters.Add(database.CreateParameter("data", asset.Data)); |
127 | SqlParameter h = cmd.Parameters.Add("temporary", SqlDbType.TinyInt); | 176 | |
128 | h.Value = asset.Temporary; | 177 | command.ExecuteNonQuery(); |
129 | SqlParameter i = cmd.Parameters.Add("data", SqlDbType.Image); | ||
130 | i.Value = asset.Data; | ||
131 | |||
132 | cmd.ExecuteNonQuery(); | ||
133 | } | 178 | } |
134 | } | 179 | } |
135 | 180 | ||
@@ -139,7 +184,7 @@ namespace OpenSim.Data.MSSQL | |||
139 | /// <param name="asset">the asset</param> | 184 | /// <param name="asset">the asset</param> |
140 | override public void UpdateAsset(AssetBase asset) | 185 | override public void UpdateAsset(AssetBase asset) |
141 | { | 186 | { |
142 | using (IDbCommand command = database.Query("UPDATE assets set id = @id, " + | 187 | using (AutoClosingSqlCommand command = database.Query("UPDATE assets set id = @id, " + |
143 | "name = @name, " + | 188 | "name = @name, " + |
144 | "description = @description," + | 189 | "description = @description," + |
145 | "assetType = @assetType," + | 190 | "assetType = @assetType," + |
@@ -148,22 +193,14 @@ namespace OpenSim.Data.MSSQL | |||
148 | "data = @data where " + | 193 | "data = @data where " + |
149 | "id = @keyId;")) | 194 | "id = @keyId;")) |
150 | { | 195 | { |
151 | SqlParameter param1 = new SqlParameter("@id", asset.FullID.ToString()); | 196 | command.Parameters.Add(database.CreateParameter("id", asset.FullID)); |
152 | SqlParameter param2 = new SqlParameter("@name", asset.Name); | 197 | command.Parameters.Add(database.CreateParameter("name", asset.Name)); |
153 | SqlParameter param3 = new SqlParameter("@description", asset.Description); | 198 | command.Parameters.Add(database.CreateParameter("description", asset.Description)); |
154 | SqlParameter param4 = new SqlParameter("@assetType", asset.Type); | 199 | command.Parameters.Add(database.CreateParameter("assetType", asset.Type)); |
155 | SqlParameter param6 = new SqlParameter("@local", asset.Local); | 200 | command.Parameters.Add(database.CreateParameter("local", asset.Local)); |
156 | SqlParameter param7 = new SqlParameter("@temporary", asset.Temporary); | 201 | command.Parameters.Add(database.CreateParameter("temporary", asset.Temporary)); |
157 | SqlParameter param8 = new SqlParameter("@data", asset.Data); | 202 | command.Parameters.Add(database.CreateParameter("data", asset.Data)); |
158 | SqlParameter param9 = new SqlParameter("@keyId", asset.FullID.ToString()); | 203 | command.Parameters.Add(database.CreateParameter("@keyId", asset.FullID)); |
159 | command.Parameters.Add(param1); | ||
160 | command.Parameters.Add(param2); | ||
161 | command.Parameters.Add(param3); | ||
162 | command.Parameters.Add(param4); | ||
163 | command.Parameters.Add(param6); | ||
164 | command.Parameters.Add(param7); | ||
165 | command.Parameters.Add(param8); | ||
166 | command.Parameters.Add(param9); | ||
167 | 204 | ||
168 | try | 205 | try |
169 | { | 206 | { |
@@ -192,57 +229,69 @@ namespace OpenSim.Data.MSSQL | |||
192 | 229 | ||
193 | #endregion | 230 | #endregion |
194 | 231 | ||
195 | #region IPlugin Members | 232 | #region Private Methods |
196 | |||
197 | override public void Dispose() { } | ||
198 | 233 | ||
199 | /// <summary> | 234 | /// <summary> |
200 | /// <para>Initialises asset interface</para> | 235 | /// Migration method |
201 | /// <para> | 236 | /// <list type="bullet"> |
202 | /// TODO: this would allow you to pass in connnect info as | 237 | /// <item>Execute "CreateAssetsTable.sql" if tableName == null</item> |
203 | /// a string instead of file, if someone writes the support | 238 | /// </list> |
204 | /// </para> | ||
205 | /// </summary> | 239 | /// </summary> |
206 | /// <param name="connect">connect string</param> | 240 | /// <param name="tableName">Name of table</param> |
207 | override public void Initialise(string connect) | 241 | private void UpgradeAssetsTable(string tableName) |
208 | { | 242 | { |
209 | Initialise(); | 243 | // null as the version, indicates that the table didn't exist |
244 | if (tableName == null) | ||
245 | { | ||
246 | m_log.Info("[ASSET DB]: Creating new database tables"); | ||
247 | database.ExecuteResourceSql("CreateAssetsTable.sql"); | ||
248 | return; | ||
249 | } | ||
210 | } | 250 | } |
211 | 251 | ||
212 | /// <summary> | 252 | /// <summary> |
213 | /// Initialises asset interface | 253 | /// Ensure that the assets related tables exists and are at the latest version |
214 | /// </summary> | 254 | /// </summary> |
215 | /// <remarks>it use mssql_connection.ini</remarks> | 255 | private void TestTables() |
216 | override public void Initialise() | ||
217 | { | 256 | { |
218 | IniFile gridDataMSSqlFile = new IniFile("mssql_connection.ini"); | 257 | Dictionary<string, string> tableList = new Dictionary<string, string>(); |
219 | string settingDataSource = gridDataMSSqlFile.ParseFileReadValue("data_source"); | ||
220 | string settingInitialCatalog = gridDataMSSqlFile.ParseFileReadValue("initial_catalog"); | ||
221 | string settingPersistSecurityInfo = gridDataMSSqlFile.ParseFileReadValue("persist_security_info"); | ||
222 | string settingUserId = gridDataMSSqlFile.ParseFileReadValue("user_id"); | ||
223 | string settingPassword = gridDataMSSqlFile.ParseFileReadValue("password"); | ||
224 | 258 | ||
225 | database = | 259 | tableList["assets"] = null; |
226 | new MSSQLManager(settingDataSource, settingInitialCatalog, settingPersistSecurityInfo, settingUserId, | 260 | database.GetTableVersion(tableList); |
227 | settingPassword); | ||
228 | 261 | ||
229 | TestTables(); | 262 | UpgradeAssetsTable(tableList["assets"]); |
230 | } | ||
231 | 263 | ||
232 | /// <summary> | 264 | //Special for Migrations |
233 | /// Database provider version. | 265 | using (AutoClosingSqlCommand cmd = database.Query("select * from migrations where name = '" + _migrationStore + "'")) |
234 | /// </summary> | 266 | { |
235 | override public string Version | 267 | try |
236 | { | 268 | { |
237 | get { return database.getVersion(); } | 269 | bool insert = true; |
238 | } | 270 | using (SqlDataReader reader = cmd.ExecuteReader()) |
271 | { | ||
272 | if (reader.Read()) insert = false; | ||
273 | } | ||
274 | if (insert) | ||
275 | { | ||
276 | cmd.CommandText = "insert into migrations(name, version) values('" + _migrationStore + "', 1)"; | ||
277 | cmd.ExecuteNonQuery(); | ||
278 | } | ||
279 | } | ||
280 | catch | ||
281 | { | ||
282 | //No migrations table | ||
283 | //HACK create one and add data | ||
284 | cmd.CommandText = "create table migrations(name varchar(100), version int)"; | ||
285 | cmd.ExecuteNonQuery(); | ||
286 | |||
287 | cmd.CommandText = "insert into migrations(name, version) values('migrations', 1)"; | ||
288 | cmd.ExecuteNonQuery(); | ||
289 | |||
290 | cmd.CommandText = "insert into migrations(name, version) values('" + _migrationStore + "', 1)"; | ||
291 | cmd.ExecuteNonQuery(); | ||
292 | } | ||
293 | } | ||
239 | 294 | ||
240 | /// <summary> | ||
241 | /// The name of this DB provider. | ||
242 | /// </summary> | ||
243 | override public string Name | ||
244 | { | ||
245 | get { return "MSSQL Asset storage engine"; } | ||
246 | } | 295 | } |
247 | 296 | ||
248 | #endregion | 297 | #endregion |