aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Data/MSSQL
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Data/MSSQL')
-rw-r--r--OpenSim/Data/MSSQL/MSSQLAssetData.cs289
-rw-r--r--OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs227
-rw-r--r--OpenSim/Data/MSSQL/MSSQLAvatarData.cs71
-rw-r--r--OpenSim/Data/MSSQL/MSSQLEstateData.cs577
-rw-r--r--OpenSim/Data/MSSQL/MSSQLFriendsData.cs99
-rw-r--r--OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs384
-rw-r--r--OpenSim/Data/MSSQL/MSSQLGridUserData.cs64
-rw-r--r--OpenSim/Data/MSSQL/MSSQLInventoryData.cs831
-rw-r--r--OpenSim/Data/MSSQL/MSSQLManager.cs219
-rw-r--r--OpenSim/Data/MSSQL/MSSQLMigration.cs99
-rw-r--r--OpenSim/Data/MSSQL/MSSQLPresenceData.cs117
-rw-r--r--OpenSim/Data/MSSQL/MSSQLRegionData.cs347
-rw-r--r--OpenSim/Data/MSSQL/MSSQLSimulationData.cs2219
-rw-r--r--OpenSim/Data/MSSQL/MSSQLUserAccountData.cs246
-rw-r--r--OpenSim/Data/MSSQL/MSSQLXInventoryData.cs305
-rw-r--r--OpenSim/Data/MSSQL/Properties/AssemblyInfo.cs65
-rw-r--r--OpenSim/Data/MSSQL/Resources/AssetStore.migrations106
-rw-r--r--OpenSim/Data/MSSQL/Resources/AuthStore.migrations32
-rw-r--r--OpenSim/Data/MSSQL/Resources/Avatar.migrations64
-rw-r--r--OpenSim/Data/MSSQL/Resources/EstateStore.migrations334
-rw-r--r--OpenSim/Data/MSSQL/Resources/FriendsStore.migrations50
-rw-r--r--OpenSim/Data/MSSQL/Resources/GridStore.migrations245
-rw-r--r--OpenSim/Data/MSSQL/Resources/GridUserStore.migrations65
-rw-r--r--OpenSim/Data/MSSQL/Resources/InventoryStore.migrations279
-rw-r--r--OpenSim/Data/MSSQL/Resources/LogStore.migrations19
-rw-r--r--OpenSim/Data/MSSQL/Resources/Presence.migrations31
-rw-r--r--OpenSim/Data/MSSQL/Resources/RegionStore.migrations1150
-rw-r--r--OpenSim/Data/MSSQL/Resources/UserAccount.migrations55
-rw-r--r--OpenSim/Data/MSSQL/Resources/UserStore.migrations421
29 files changed, 0 insertions, 9010 deletions
diff --git a/OpenSim/Data/MSSQL/MSSQLAssetData.cs b/OpenSim/Data/MSSQL/MSSQLAssetData.cs
deleted file mode 100644
index c7488d8..0000000
--- a/OpenSim/Data/MSSQL/MSSQLAssetData.cs
+++ /dev/null
@@ -1,289 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Data;
30using System.Data.SqlClient;
31using System.Reflection;
32using System.Collections.Generic;
33using OpenMetaverse;
34using log4net;
35using OpenSim.Framework;
36
37namespace OpenSim.Data.MSSQL
38{
39 /// <summary>
40 /// A MSSQL Interface for the Asset server
41 /// </summary>
42 public class MSSQLAssetData : AssetDataBase
43 {
44 private const string _migrationStore = "AssetStore";
45
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 private long m_ticksToEpoch;
48 /// <summary>
49 /// Database manager
50 /// </summary>
51 private MSSQLManager m_database;
52 private string m_connectionString;
53
54 #region IPlugin Members
55
56 override public void Dispose() { }
57
58 /// <summary>
59 /// <para>Initialises asset interface</para>
60 /// </summary>
61 // [Obsolete("Cannot be default-initialized!")]
62 override public void Initialise()
63 {
64 m_log.Info("[MSSQLAssetData]: " + Name + " cannot be default-initialized!");
65 throw new PluginNotInitialisedException(Name);
66 }
67
68 /// <summary>
69 /// Initialises asset interface
70 /// </summary>
71 /// <para>
72 /// a string instead of file, if someone writes the support
73 /// </para>
74 /// <param name="connectionString">connect string</param>
75 override public void Initialise(string connectionString)
76 {
77 m_ticksToEpoch = new System.DateTime(1970, 1, 1).Ticks;
78
79 m_database = new MSSQLManager(connectionString);
80 m_connectionString = connectionString;
81
82 //New migration to check for DB changes
83 m_database.CheckMigration(_migrationStore);
84 }
85
86 /// <summary>
87 /// Database provider version.
88 /// </summary>
89 override public string Version
90 {
91 get { return m_database.getVersion(); }
92 }
93
94 /// <summary>
95 /// The name of this DB provider.
96 /// </summary>
97 override public string Name
98 {
99 get { return "MSSQL Asset storage engine"; }
100 }
101
102 #endregion
103
104 #region IAssetDataPlugin Members
105
106 /// <summary>
107 /// Fetch Asset from m_database
108 /// </summary>
109 /// <param name="assetID">the asset UUID</param>
110 /// <returns></returns>
111 override public AssetBase GetAsset(UUID assetID)
112 {
113 string sql = "SELECT * FROM assets WHERE id = @id";
114 using (SqlConnection conn = new SqlConnection(m_connectionString))
115 using (SqlCommand cmd = new SqlCommand(sql, conn))
116 {
117 cmd.Parameters.Add(m_database.CreateParameter("id", assetID));
118 conn.Open();
119 using (SqlDataReader reader = cmd.ExecuteReader())
120 {
121 if (reader.Read())
122 {
123 AssetBase asset = new AssetBase(
124 DBGuid.FromDB(reader["id"]),
125 (string)reader["name"],
126 Convert.ToSByte(reader["assetType"]),
127 reader["creatorid"].ToString()
128 );
129 // Region Main
130 asset.Description = (string)reader["description"];
131 asset.Local = Convert.ToBoolean(reader["local"]);
132 asset.Temporary = Convert.ToBoolean(reader["temporary"]);
133 asset.Flags = (AssetFlags)(Convert.ToInt32(reader["asset_flags"]));
134 asset.Data = (byte[])reader["data"];
135 return asset;
136 }
137 return null; // throw new Exception("No rows to return");
138 }
139 }
140 }
141
142 /// <summary>
143 /// Create asset in m_database
144 /// </summary>
145 /// <param name="asset">the asset</param>
146 override public void StoreAsset(AssetBase asset)
147 {
148
149 string sql =
150 @"IF EXISTS(SELECT * FROM assets WHERE id=@id)
151 UPDATE assets set name = @name, description = @description, assetType = @assetType,
152 local = @local, temporary = @temporary, creatorid = @creatorid, data = @data
153 WHERE id=@id
154 ELSE
155 INSERT INTO assets
156 ([id], [name], [description], [assetType], [local],
157 [temporary], [create_time], [access_time], [creatorid], [asset_flags], [data])
158 VALUES
159 (@id, @name, @description, @assetType, @local,
160 @temporary, @create_time, @access_time, @creatorid, @asset_flags, @data)";
161
162 string assetName = asset.Name;
163 if (asset.Name.Length > 64)
164 {
165 assetName = asset.Name.Substring(0, 64);
166 m_log.Warn("[ASSET DB]: Name field truncated from " + asset.Name.Length + " to " + assetName.Length + " characters on add");
167 }
168
169 string assetDescription = asset.Description;
170 if (asset.Description.Length > 64)
171 {
172 assetDescription = asset.Description.Substring(0, 64);
173 m_log.Warn("[ASSET DB]: Description field truncated from " + asset.Description.Length + " to " + assetDescription.Length + " characters on add");
174 }
175
176 using (SqlConnection conn = new SqlConnection(m_connectionString))
177 using (SqlCommand command = new SqlCommand(sql, conn))
178 {
179 int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
180 command.Parameters.Add(m_database.CreateParameter("id", asset.FullID));
181 command.Parameters.Add(m_database.CreateParameter("name", assetName));
182 command.Parameters.Add(m_database.CreateParameter("description", assetDescription));
183 command.Parameters.Add(m_database.CreateParameter("assetType", asset.Type));
184 command.Parameters.Add(m_database.CreateParameter("local", asset.Local));
185 command.Parameters.Add(m_database.CreateParameter("temporary", asset.Temporary));
186 command.Parameters.Add(m_database.CreateParameter("access_time", now));
187 command.Parameters.Add(m_database.CreateParameter("create_time", now));
188 command.Parameters.Add(m_database.CreateParameter("asset_flags", (int)asset.Flags));
189 command.Parameters.Add(m_database.CreateParameter("creatorid", asset.Metadata.CreatorID));
190 command.Parameters.Add(m_database.CreateParameter("data", asset.Data));
191 conn.Open();
192 try
193 {
194 command.ExecuteNonQuery();
195 }
196 catch(Exception e)
197 {
198 m_log.Error("[ASSET DB]: Error storing item :" + e.Message);
199 }
200 }
201 }
202
203
204// Commented out since currently unused - this probably should be called in GetAsset()
205// private void UpdateAccessTime(AssetBase asset)
206// {
207// using (AutoClosingSqlCommand cmd = m_database.Query("UPDATE assets SET access_time = @access_time WHERE id=@id"))
208// {
209// int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
210// cmd.Parameters.AddWithValue("@id", asset.FullID.ToString());
211// cmd.Parameters.AddWithValue("@access_time", now);
212// try
213// {
214// cmd.ExecuteNonQuery();
215// }
216// catch (Exception e)
217// {
218// m_log.Error(e.ToString());
219// }
220// }
221// }
222
223 /// <summary>
224 /// Check if asset exist in m_database
225 /// </summary>
226 /// <param name="uuid"></param>
227 /// <returns>true if exist.</returns>
228 override public bool ExistsAsset(UUID uuid)
229 {
230 if (GetAsset(uuid) != null)
231 {
232 return true;
233 }
234 return false;
235 }
236
237 /// <summary>
238 /// Returns a list of AssetMetadata objects. The list is a subset of
239 /// the entire data set offset by <paramref name="start" /> containing
240 /// <paramref name="count" /> elements.
241 /// </summary>
242 /// <param name="start">The number of results to discard from the total data set.</param>
243 /// <param name="count">The number of rows the returned list should contain.</param>
244 /// <returns>A list of AssetMetadata objects.</returns>
245 public override List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
246 {
247 List<AssetMetadata> retList = new List<AssetMetadata>(count);
248 string sql = @"WITH OrderedAssets AS
249 (
250 SELECT id, name, description, assetType, temporary, creatorid,
251 RowNumber = ROW_NUMBER() OVER (ORDER BY id)
252 FROM assets
253 )
254 SELECT *
255 FROM OrderedAssets
256 WHERE RowNumber BETWEEN @start AND @stop;";
257
258 using (SqlConnection conn = new SqlConnection(m_connectionString))
259 using (SqlCommand cmd = new SqlCommand(sql, conn))
260 {
261 cmd.Parameters.Add(m_database.CreateParameter("start", start));
262 cmd.Parameters.Add(m_database.CreateParameter("stop", start + count - 1));
263 conn.Open();
264 using (SqlDataReader reader = cmd.ExecuteReader())
265 {
266 while (reader.Read())
267 {
268 AssetMetadata metadata = new AssetMetadata();
269 metadata.FullID = DBGuid.FromDB(reader["id"]);
270 metadata.Name = (string)reader["name"];
271 metadata.Description = (string)reader["description"];
272 metadata.Type = Convert.ToSByte(reader["assetType"]);
273 metadata.Temporary = Convert.ToBoolean(reader["temporary"]);
274 metadata.CreatorID = (string)reader["creatorid"];
275 retList.Add(metadata);
276 }
277 }
278 }
279
280 return retList;
281 }
282
283 public override bool Delete(string id)
284 {
285 return false;
286 }
287 #endregion
288 }
289}
diff --git a/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs b/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs
deleted file mode 100644
index 1ae78c4..0000000
--- a/OpenSim/Data/MSSQL/MSSQLAuthenticationData.cs
+++ /dev/null
@@ -1,227 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using System.Data.SqlClient;
35using System.Reflection;
36using System.Text;
37
38namespace OpenSim.Data.MSSQL
39{
40 public class MSSQLAuthenticationData : IAuthenticationData
41 {
42 private string m_Realm;
43 private List<string> m_ColumnNames = null;
44 private int m_LastExpire = 0;
45 private string m_ConnectionString;
46 private MSSQLManager m_database;
47
48 public MSSQLAuthenticationData(string connectionString, string realm)
49 {
50 m_Realm = realm;
51 m_ConnectionString = connectionString;
52 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
53 {
54 conn.Open();
55 Migration m = new Migration(conn, GetType().Assembly, "AuthStore");
56 m_database = new MSSQLManager(m_ConnectionString);
57 m.Update();
58 }
59 }
60
61 public AuthenticationData Get(UUID principalID)
62 {
63 AuthenticationData ret = new AuthenticationData();
64 ret.Data = new Dictionary<string, object>();
65
66 string sql = string.Format("select * from {0} where UUID = @principalID", m_Realm);
67
68 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
69 using (SqlCommand cmd = new SqlCommand(sql, conn))
70 {
71 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID));
72 conn.Open();
73 using (SqlDataReader result = cmd.ExecuteReader())
74 {
75 if (result.Read())
76 {
77 ret.PrincipalID = principalID;
78
79 if (m_ColumnNames == null)
80 {
81 m_ColumnNames = new List<string>();
82
83 DataTable schemaTable = result.GetSchemaTable();
84 foreach (DataRow row in schemaTable.Rows)
85 m_ColumnNames.Add(row["ColumnName"].ToString());
86 }
87
88 foreach (string s in m_ColumnNames)
89 {
90 if (s == "UUID")
91 continue;
92
93 ret.Data[s] = result[s].ToString();
94 }
95 return ret;
96 }
97 }
98 }
99 return null;
100 }
101
102 public bool Store(AuthenticationData data)
103 {
104 if (data.Data.ContainsKey("UUID"))
105 data.Data.Remove("UUID");
106
107 string[] fields = new List<string>(data.Data.Keys).ToArray();
108 StringBuilder updateBuilder = new StringBuilder();
109
110 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
111 using (SqlCommand cmd = new SqlCommand())
112 {
113 updateBuilder.AppendFormat("update {0} set ", m_Realm);
114
115 bool first = true;
116 foreach (string field in fields)
117 {
118 if (!first)
119 updateBuilder.Append(", ");
120 updateBuilder.AppendFormat("{0} = @{0}",field);
121
122 first = false;
123 cmd.Parameters.Add(m_database.CreateParameter("@" + field, data.Data[field]));
124 }
125
126 updateBuilder.Append(" where UUID = @principalID");
127
128 cmd.CommandText = updateBuilder.ToString();
129 cmd.Connection = conn;
130 cmd.Parameters.Add(m_database.CreateParameter("@principalID", data.PrincipalID));
131
132 conn.Open();
133 if (cmd.ExecuteNonQuery() < 1)
134 {
135 StringBuilder insertBuilder = new StringBuilder();
136
137 insertBuilder.AppendFormat("insert into {0} (UUID, ", m_Realm);
138 insertBuilder.Append(String.Join(", ", fields));
139 insertBuilder.Append(") values (@principalID, @");
140 insertBuilder.Append(String.Join(", @", fields));
141 insertBuilder.Append(")");
142
143 cmd.CommandText = insertBuilder.ToString();
144
145 if (cmd.ExecuteNonQuery() < 1)
146 {
147 return false;
148 }
149 }
150 }
151 return true;
152 }
153
154 public bool SetDataItem(UUID principalID, string item, string value)
155 {
156 string sql = string.Format("update {0} set {1} = @{1} where UUID = @UUID", m_Realm, item);
157 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
158 using (SqlCommand cmd = new SqlCommand(sql, conn))
159 {
160 cmd.Parameters.Add(m_database.CreateParameter("@" + item, value));
161 conn.Open();
162 if (cmd.ExecuteNonQuery() > 0)
163 return true;
164 }
165 return false;
166 }
167
168 public bool SetToken(UUID principalID, string token, int lifetime)
169 {
170 if (System.Environment.TickCount - m_LastExpire > 30000)
171 DoExpire();
172
173 string sql = "insert into tokens (UUID, token, validity) values (@principalID, @token, @lifetime)";
174 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
175 using (SqlCommand cmd = new SqlCommand(sql, conn))
176 {
177 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID));
178 cmd.Parameters.Add(m_database.CreateParameter("@token", token));
179 cmd.Parameters.Add(m_database.CreateParameter("@lifetime", DateTime.Now.AddMinutes(lifetime)));
180 conn.Open();
181
182 if (cmd.ExecuteNonQuery() > 0)
183 {
184 return true;
185 }
186 }
187 return false;
188 }
189
190 public bool CheckToken(UUID principalID, string token, int lifetime)
191 {
192 if (System.Environment.TickCount - m_LastExpire > 30000)
193 DoExpire();
194
195 DateTime validDate = DateTime.Now.AddMinutes(lifetime);
196 string sql = "update tokens set validity = @validDate where UUID = @principalID and token = @token and validity > GetDate()";
197 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
198 using (SqlCommand cmd = new SqlCommand(sql, conn))
199 {
200 cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID));
201 cmd.Parameters.Add(m_database.CreateParameter("@token", token));
202 cmd.Parameters.Add(m_database.CreateParameter("@validDate", validDate));
203 conn.Open();
204
205 if (cmd.ExecuteNonQuery() > 0)
206 {
207 return true;
208 }
209 }
210 return false;
211 }
212
213 private void DoExpire()
214 {
215 DateTime currentDateTime = DateTime.Now;
216 string sql = "delete from tokens where validity < @currentDateTime";
217 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
218 using (SqlCommand cmd = new SqlCommand(sql, conn))
219 {
220 conn.Open();
221 cmd.Parameters.Add(m_database.CreateParameter("@currentDateTime", currentDateTime));
222 cmd.ExecuteNonQuery();
223 }
224 m_LastExpire = System.Environment.TickCount;
225 }
226 }
227}
diff --git a/OpenSim/Data/MSSQL/MSSQLAvatarData.cs b/OpenSim/Data/MSSQL/MSSQLAvatarData.cs
deleted file mode 100644
index 301b424..0000000
--- a/OpenSim/Data/MSSQL/MSSQLAvatarData.cs
+++ /dev/null
@@ -1,71 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using System.Data.SqlClient;
37
38namespace OpenSim.Data.MSSQL
39{
40 /// <summary>
41 /// A MSSQL Interface for Avatar Storage
42 /// </summary>
43 public class MSSQLAvatarData : MSSQLGenericTableHandler<AvatarBaseData>,
44 IAvatarData
45 {
46// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 public MSSQLAvatarData(string connectionString, string realm) :
49 base(connectionString, realm, "Avatar")
50 {
51 }
52
53 public bool Delete(UUID principalID, string name)
54 {
55 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
56 using (SqlCommand cmd = new SqlCommand())
57 {
58
59 cmd.CommandText = String.Format("DELETE FROM {0} where [PrincipalID] = @PrincipalID and [Name] = @Name", m_Realm);
60 cmd.Parameters.Add(m_database.CreateParameter("@PrincipalID", principalID.ToString()));
61 cmd.Parameters.Add(m_database.CreateParameter("@Name", name));
62 cmd.Connection = conn;
63 conn.Open();
64 if (cmd.ExecuteNonQuery() > 0)
65 return true;
66
67 return false;
68 }
69 }
70 }
71}
diff --git a/OpenSim/Data/MSSQL/MSSQLEstateData.cs b/OpenSim/Data/MSSQL/MSSQLEstateData.cs
deleted file mode 100644
index 1faa249..0000000
--- a/OpenSim/Data/MSSQL/MSSQLEstateData.cs
+++ /dev/null
@@ -1,577 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Data.SqlClient;
32using System.Reflection;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces;
37
38namespace OpenSim.Data.MSSQL
39{
40 public class MSSQLEstateStore : IEstateDataStore
41 {
42 private const string _migrationStore = "EstateStore";
43
44 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45
46 private MSSQLManager _Database;
47 private string m_connectionString;
48 private FieldInfo[] _Fields;
49 private Dictionary<string, FieldInfo> _FieldMap = new Dictionary<string, FieldInfo>();
50
51 #region Public methods
52
53 public MSSQLEstateStore()
54 {
55 }
56
57 public MSSQLEstateStore(string connectionString)
58 {
59 Initialise(connectionString);
60 }
61
62 /// <summary>
63 /// Initialises the estatedata class.
64 /// </summary>
65 /// <param name="connectionString">connectionString.</param>
66 public void Initialise(string connectionString)
67 {
68 if (!string.IsNullOrEmpty(connectionString))
69 {
70 m_connectionString = connectionString;
71 _Database = new MSSQLManager(connectionString);
72 }
73
74 //Migration settings
75 using (SqlConnection conn = new SqlConnection(m_connectionString))
76 {
77 conn.Open();
78 Migration m = new Migration(conn, GetType().Assembly, "EstateStore");
79 m.Update();
80 }
81
82 //Interesting way to get parameters! Maybe implement that also with other types
83 Type t = typeof(EstateSettings);
84 _Fields = t.GetFields(BindingFlags.NonPublic |
85 BindingFlags.Instance |
86 BindingFlags.DeclaredOnly);
87
88 foreach (FieldInfo f in _Fields)
89 {
90 if (f.Name.Substring(0, 2) == "m_")
91 _FieldMap[f.Name.Substring(2)] = f;
92 }
93 }
94
95 /// <summary>
96 /// Loads the estate settings.
97 /// </summary>
98 /// <param name="regionID">region ID.</param>
99 /// <returns></returns>
100 public EstateSettings LoadEstateSettings(UUID regionID, bool create)
101 {
102 EstateSettings es = new EstateSettings();
103
104 string sql = "select estate_settings." + String.Join(",estate_settings.", FieldList) + " from estate_map left join estate_settings on estate_map.EstateID = estate_settings.EstateID where estate_settings.EstateID is not null and RegionID = @RegionID";
105
106 bool insertEstate = false;
107 using (SqlConnection conn = new SqlConnection(m_connectionString))
108 using (SqlCommand cmd = new SqlCommand(sql, conn))
109 {
110 cmd.Parameters.Add(_Database.CreateParameter("@RegionID", regionID));
111 conn.Open();
112 using (SqlDataReader reader = cmd.ExecuteReader())
113 {
114 if (reader.Read())
115 {
116 foreach (string name in FieldList)
117 {
118 FieldInfo f = _FieldMap[name];
119 object v = reader[name];
120 if (f.FieldType == typeof(bool))
121 {
122 f.SetValue(es, Convert.ToInt32(v) != 0);
123 }
124 else if (f.FieldType == typeof(UUID))
125 {
126 f.SetValue(es, new UUID((Guid)v)); // uuid);
127 }
128 else if (f.FieldType == typeof(string))
129 {
130 f.SetValue(es, v.ToString());
131 }
132 else if (f.FieldType == typeof(UInt32))
133 {
134 f.SetValue(es, Convert.ToUInt32(v));
135 }
136 else if (f.FieldType == typeof(Single))
137 {
138 f.SetValue(es, Convert.ToSingle(v));
139 }
140 else
141 f.SetValue(es, v);
142 }
143 }
144 else
145 {
146 insertEstate = true;
147 }
148 }
149 }
150
151 if (insertEstate && create)
152 {
153 DoCreate(es);
154 LinkRegion(regionID, (int)es.EstateID);
155 }
156
157 LoadBanList(es);
158
159 es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
160 es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
161 es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
162
163 //Set event
164 es.OnSave += StoreEstateSettings;
165 return es;
166 }
167
168 public EstateSettings CreateNewEstate()
169 {
170 EstateSettings es = new EstateSettings();
171 es.OnSave += StoreEstateSettings;
172
173 DoCreate(es);
174
175 LoadBanList(es);
176
177 es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
178 es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
179 es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
180
181 return es;
182 }
183
184 private void DoCreate(EstateSettings es)
185 {
186 List<string> names = new List<string>(FieldList);
187
188 names.Remove("EstateID");
189
190 string sql = string.Format("insert into estate_settings ({0}) values ( @{1})", String.Join(",", names.ToArray()), String.Join(", @", names.ToArray()));
191
192 //_Log.Debug("[DB ESTATE]: SQL: " + sql);
193 using (SqlConnection conn = new SqlConnection(m_connectionString))
194 using (SqlCommand insertCommand = new SqlCommand(sql, conn))
195 {
196 insertCommand.CommandText = sql + " SET @ID = SCOPE_IDENTITY()";
197
198 foreach (string name in names)
199 {
200 insertCommand.Parameters.Add(_Database.CreateParameter("@" + name, _FieldMap[name].GetValue(es)));
201 }
202 SqlParameter idParameter = new SqlParameter("@ID", SqlDbType.Int);
203 idParameter.Direction = ParameterDirection.Output;
204 insertCommand.Parameters.Add(idParameter);
205 conn.Open();
206 insertCommand.ExecuteNonQuery();
207
208 es.EstateID = Convert.ToUInt32(idParameter.Value);
209 }
210
211 //TODO check if this is needed??
212 es.Save();
213 }
214
215 /// <summary>
216 /// Stores the estate settings.
217 /// </summary>
218 /// <param name="es">estate settings</param>
219 public void StoreEstateSettings(EstateSettings es)
220 {
221 List<string> names = new List<string>(FieldList);
222
223 names.Remove("EstateID");
224
225 string sql = string.Format("UPDATE estate_settings SET ");
226 foreach (string name in names)
227 {
228 sql += name + " = @" + name + ", ";
229 }
230 sql = sql.Remove(sql.LastIndexOf(","));
231 sql += " WHERE EstateID = @EstateID";
232
233 using (SqlConnection conn = new SqlConnection(m_connectionString))
234 using (SqlCommand cmd = new SqlCommand(sql, conn))
235 {
236 foreach (string name in names)
237 {
238 cmd.Parameters.Add(_Database.CreateParameter("@" + name, _FieldMap[name].GetValue(es)));
239 }
240
241 cmd.Parameters.Add(_Database.CreateParameter("@EstateID", es.EstateID));
242 conn.Open();
243 cmd.ExecuteNonQuery();
244 }
245
246 SaveBanList(es);
247 SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers);
248 SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess);
249 SaveUUIDList(es.EstateID, "estate_groups", es.EstateGroups);
250 }
251
252 #endregion
253
254 #region Private methods
255
256 private string[] FieldList
257 {
258 get { return new List<string>(_FieldMap.Keys).ToArray(); }
259 }
260
261 private void LoadBanList(EstateSettings es)
262 {
263 es.ClearBans();
264
265 string sql = "select bannedUUID from estateban where EstateID = @EstateID";
266
267 using (SqlConnection conn = new SqlConnection(m_connectionString))
268 using (SqlCommand cmd = new SqlCommand(sql, conn))
269 {
270 SqlParameter idParameter = new SqlParameter("@EstateID", SqlDbType.Int);
271 idParameter.Value = es.EstateID;
272 cmd.Parameters.Add(idParameter);
273 conn.Open();
274 using (SqlDataReader reader = cmd.ExecuteReader())
275 {
276 while (reader.Read())
277 {
278 EstateBan eb = new EstateBan();
279
280 eb.BannedUserID = new UUID((Guid)reader["bannedUUID"]); //uuid;
281 eb.BannedHostAddress = "0.0.0.0";
282 eb.BannedHostIPMask = "0.0.0.0";
283 es.AddBan(eb);
284 }
285 }
286 }
287 }
288
289 private UUID[] LoadUUIDList(uint estateID, string table)
290 {
291 List<UUID> uuids = new List<UUID>();
292
293 string sql = string.Format("select uuid from {0} where EstateID = @EstateID", table);
294
295 using (SqlConnection conn = new SqlConnection(m_connectionString))
296 using (SqlCommand cmd = new SqlCommand(sql, conn))
297 {
298 cmd.Parameters.Add(_Database.CreateParameter("@EstateID", estateID));
299 conn.Open();
300 using (SqlDataReader reader = cmd.ExecuteReader())
301 {
302 while (reader.Read())
303 {
304 uuids.Add(new UUID((Guid)reader["uuid"])); //uuid);
305 }
306 }
307 }
308
309 return uuids.ToArray();
310 }
311
312 private void SaveBanList(EstateSettings es)
313 {
314 //Delete first
315 using (SqlConnection conn = new SqlConnection(m_connectionString))
316 {
317 conn.Open();
318 using (SqlCommand cmd = conn.CreateCommand())
319 {
320 cmd.CommandText = "delete from estateban where EstateID = @EstateID";
321 cmd.Parameters.AddWithValue("@EstateID", (int)es.EstateID);
322 cmd.ExecuteNonQuery();
323
324 //Insert after
325 cmd.CommandText = "insert into estateban (EstateID, bannedUUID,bannedIp, bannedIpHostMask, bannedNameMask) values ( @EstateID, @bannedUUID, '','','' )";
326 cmd.Parameters.AddWithValue("@bannedUUID", Guid.Empty);
327 foreach (EstateBan b in es.EstateBans)
328 {
329 cmd.Parameters["@bannedUUID"].Value = b.BannedUserID.Guid;
330 cmd.ExecuteNonQuery();
331 }
332 }
333 }
334 }
335
336 private void SaveUUIDList(uint estateID, string table, UUID[] data)
337 {
338 using (SqlConnection conn = new SqlConnection(m_connectionString))
339 {
340 conn.Open();
341 using (SqlCommand cmd = conn.CreateCommand())
342 {
343 cmd.Parameters.AddWithValue("@EstateID", (int)estateID);
344 cmd.CommandText = string.Format("delete from {0} where EstateID = @EstateID", table);
345 cmd.ExecuteNonQuery();
346
347 cmd.CommandText = string.Format("insert into {0} (EstateID, uuid) values ( @EstateID, @uuid )", table);
348 cmd.Parameters.AddWithValue("@uuid", Guid.Empty);
349 foreach (UUID uuid in data)
350 {
351 cmd.Parameters["@uuid"].Value = uuid.Guid; //.ToString(); //TODO check if this works
352 cmd.ExecuteNonQuery();
353 }
354 }
355 }
356 }
357
358 public EstateSettings LoadEstateSettings(int estateID)
359 {
360 EstateSettings es = new EstateSettings();
361 string sql = "select estate_settings." + String.Join(",estate_settings.", FieldList) + " from estate_settings where EstateID = @EstateID";
362 using (SqlConnection conn = new SqlConnection(m_connectionString))
363 {
364 conn.Open();
365 using (SqlCommand cmd = new SqlCommand(sql, conn))
366 {
367 cmd.Parameters.AddWithValue("@EstateID", (int)estateID);
368 using (SqlDataReader reader = cmd.ExecuteReader())
369 {
370 if (reader.Read())
371 {
372 foreach (string name in FieldList)
373 {
374 FieldInfo f = _FieldMap[name];
375 object v = reader[name];
376 if (f.FieldType == typeof(bool))
377 {
378 f.SetValue(es, Convert.ToInt32(v) != 0);
379 }
380 else if (f.FieldType == typeof(UUID))
381 {
382 f.SetValue(es, new UUID((Guid)v)); // uuid);
383 }
384 else if (f.FieldType == typeof(string))
385 {
386 f.SetValue(es, v.ToString());
387 }
388 else if (f.FieldType == typeof(UInt32))
389 {
390 f.SetValue(es, Convert.ToUInt32(v));
391 }
392 else if (f.FieldType == typeof(Single))
393 {
394 f.SetValue(es, Convert.ToSingle(v));
395 }
396 else
397 f.SetValue(es, v);
398 }
399 }
400
401 }
402 }
403 }
404 LoadBanList(es);
405
406 es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
407 es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
408 es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
409
410 //Set event
411 es.OnSave += StoreEstateSettings;
412 return es;
413
414 }
415
416 public List<EstateSettings> LoadEstateSettingsAll()
417 {
418 List<EstateSettings> allEstateSettings = new List<EstateSettings>();
419
420 List<int> allEstateIds = GetEstatesAll();
421
422 foreach (int estateId in allEstateIds)
423 allEstateSettings.Add(LoadEstateSettings(estateId));
424
425 return allEstateSettings;
426 }
427
428 public List<int> GetEstates(string search)
429 {
430 List<int> result = new List<int>();
431 string sql = "select estateID from estate_settings where EstateName = @EstateName";
432 using (SqlConnection conn = new SqlConnection(m_connectionString))
433 {
434 conn.Open();
435 using (SqlCommand cmd = new SqlCommand(sql, conn))
436 {
437 cmd.Parameters.AddWithValue("@EstateName", search);
438
439 using (IDataReader reader = cmd.ExecuteReader())
440 {
441 while (reader.Read())
442 {
443 result.Add(Convert.ToInt32(reader["EstateID"]));
444 }
445 reader.Close();
446 }
447 }
448 }
449
450 return result;
451 }
452
453 public List<int> GetEstatesAll()
454 {
455 List<int> result = new List<int>();
456 string sql = "select estateID from estate_settings";
457 using (SqlConnection conn = new SqlConnection(m_connectionString))
458 {
459 conn.Open();
460 using (SqlCommand cmd = new SqlCommand(sql, conn))
461 {
462 using (IDataReader reader = cmd.ExecuteReader())
463 {
464 while (reader.Read())
465 {
466 result.Add(Convert.ToInt32(reader["EstateID"]));
467 }
468 reader.Close();
469 }
470 }
471 }
472
473 return result;
474 }
475
476 public List<int> GetEstatesByOwner(UUID ownerID)
477 {
478 List<int> result = new List<int>();
479 string sql = "select estateID from estate_settings where EstateOwner = @EstateOwner";
480 using (SqlConnection conn = new SqlConnection(m_connectionString))
481 {
482 conn.Open();
483 using (SqlCommand cmd = new SqlCommand(sql, conn))
484 {
485 cmd.Parameters.AddWithValue("@EstateOwner", ownerID);
486
487 using (IDataReader reader = cmd.ExecuteReader())
488 {
489 while (reader.Read())
490 {
491 result.Add(Convert.ToInt32(reader["EstateID"]));
492 }
493 reader.Close();
494 }
495 }
496 }
497
498 return result;
499 }
500
501 public bool LinkRegion(UUID regionID, int estateID)
502 {
503 string deleteSQL = "delete from estate_map where RegionID = @RegionID";
504 string insertSQL = "insert into estate_map values (@RegionID, @EstateID)";
505 using (SqlConnection conn = new SqlConnection(m_connectionString))
506 {
507 conn.Open();
508 SqlTransaction transaction = conn.BeginTransaction();
509
510 try
511 {
512 using (SqlCommand cmd = new SqlCommand(deleteSQL, conn))
513 {
514 cmd.Transaction = transaction;
515 cmd.Parameters.AddWithValue("@RegionID", regionID.Guid);
516
517 cmd.ExecuteNonQuery();
518 }
519
520 using (SqlCommand cmd = new SqlCommand(insertSQL, conn))
521 {
522 cmd.Transaction = transaction;
523 cmd.Parameters.AddWithValue("@RegionID", regionID.Guid);
524 cmd.Parameters.AddWithValue("@EstateID", estateID);
525
526 int ret = cmd.ExecuteNonQuery();
527
528 if (ret != 0)
529 transaction.Commit();
530 else
531 transaction.Rollback();
532
533 return (ret != 0);
534 }
535 }
536 catch (Exception ex)
537 {
538 m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message);
539 transaction.Rollback();
540 }
541 }
542 return false;
543 }
544
545 public List<UUID> GetRegions(int estateID)
546 {
547 List<UUID> result = new List<UUID>();
548 string sql = "select RegionID from estate_map where EstateID = @EstateID";
549 using (SqlConnection conn = new SqlConnection(m_connectionString))
550 {
551 conn.Open();
552 using (SqlCommand cmd = new SqlCommand(sql, conn))
553 {
554 cmd.Parameters.AddWithValue("@EstateID", estateID);
555
556 using (IDataReader reader = cmd.ExecuteReader())
557 {
558 while (reader.Read())
559 {
560 result.Add(DBGuid.FromDB(reader["RegionID"]));
561 }
562 reader.Close();
563 }
564 }
565 }
566
567 return result;
568 }
569
570 public bool DeleteEstate(int estateID)
571 {
572 // TODO: Implementation!
573 return false;
574 }
575 #endregion
576 }
577}
diff --git a/OpenSim/Data/MSSQL/MSSQLFriendsData.cs b/OpenSim/Data/MSSQL/MSSQLFriendsData.cs
deleted file mode 100644
index fef6978..0000000
--- a/OpenSim/Data/MSSQL/MSSQLFriendsData.cs
+++ /dev/null
@@ -1,99 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using System.Data.SqlClient;
35using System.Reflection;
36using System.Text;
37
38namespace OpenSim.Data.MSSQL
39{
40 public class MSSQLFriendsData : MSSQLGenericTableHandler<FriendsData>, IFriendsData
41 {
42 public MSSQLFriendsData(string connectionString, string realm)
43 : base(connectionString, realm, "FriendsStore")
44 {
45 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
46 {
47 conn.Open();
48 Migration m = new Migration(conn, GetType().Assembly, "FriendsStore");
49 m.Update();
50 }
51 }
52
53 public bool Delete(UUID principalID, string friend)
54 {
55 return Delete(principalID.ToString(), friend);
56 }
57
58 public bool Delete(string principalID, string friend)
59 {
60 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
61 using (SqlCommand cmd = new SqlCommand())
62 {
63 cmd.CommandText = String.Format("delete from {0} where PrincipalID = @PrincipalID and Friend = @Friend", m_Realm);
64 cmd.Parameters.Add(m_database.CreateParameter("@PrincipalID", principalID.ToString()));
65 cmd.Parameters.Add(m_database.CreateParameter("@Friend", friend));
66 cmd.Connection = conn;
67 conn.Open();
68 cmd.ExecuteNonQuery();
69
70 return true;
71 }
72 }
73
74 public FriendsData[] GetFriends(UUID principalID)
75 {
76 return GetFriends(principalID.ToString());
77 }
78
79 public FriendsData[] GetFriends(string principalID)
80 {
81 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
82 using (SqlCommand cmd = new SqlCommand())
83 {
84
85 cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = @PrincipalID", m_Realm);
86 cmd.Parameters.Add(m_database.CreateParameter("@PrincipalID", principalID.ToString()));
87 cmd.Connection = conn;
88 conn.Open();
89 return DoQuery(cmd);
90 }
91 }
92
93 public FriendsData[] GetFriends(Guid principalID)
94 {
95 return GetFriends(principalID.ToString());
96 }
97
98 }
99}
diff --git a/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs b/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs
deleted file mode 100644
index 4145d95..0000000
--- a/OpenSim/Data/MSSQL/MSSQLGenericTableHandler.cs
+++ /dev/null
@@ -1,384 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using log4net;
33using System.Data.SqlClient;
34using OpenMetaverse;
35using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces;
37using System.Text;
38
39namespace OpenSim.Data.MSSQL
40{
41 public class MSSQLGenericTableHandler<T> where T : class, new()
42 {
43// private static readonly ILog m_log =
44// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45
46 protected string m_ConnectionString;
47 protected MSSQLManager m_database; //used for parameter type translation
48 protected Dictionary<string, FieldInfo> m_Fields =
49 new Dictionary<string, FieldInfo>();
50
51 protected List<string> m_ColumnNames = null;
52 protected string m_Realm;
53 protected FieldInfo m_DataField = null;
54
55 public MSSQLGenericTableHandler(string connectionString,
56 string realm, string storeName)
57 {
58 m_Realm = realm;
59
60 m_ConnectionString = connectionString;
61
62 if (storeName != String.Empty)
63 {
64 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
65 {
66 conn.Open();
67 Migration m = new Migration(conn, GetType().Assembly, storeName);
68 m.Update();
69 }
70
71 }
72 m_database = new MSSQLManager(m_ConnectionString);
73
74 Type t = typeof(T);
75 FieldInfo[] fields = t.GetFields(BindingFlags.Public |
76 BindingFlags.Instance |
77 BindingFlags.DeclaredOnly);
78
79 if (fields.Length == 0)
80 return;
81
82 foreach (FieldInfo f in fields)
83 {
84 if (f.Name != "Data")
85 m_Fields[f.Name] = f;
86 else
87 m_DataField = f;
88 }
89
90 }
91
92 private void CheckColumnNames(SqlDataReader reader)
93 {
94 if (m_ColumnNames != null)
95 return;
96
97 m_ColumnNames = new List<string>();
98
99 DataTable schemaTable = reader.GetSchemaTable();
100 foreach (DataRow row in schemaTable.Rows)
101 {
102 if (row["ColumnName"] != null &&
103 (!m_Fields.ContainsKey(row["ColumnName"].ToString())))
104 m_ColumnNames.Add(row["ColumnName"].ToString());
105
106 }
107 }
108
109 private List<string> GetConstraints()
110 {
111 List<string> constraints = new List<string>();
112 string query = string.Format(@"SELECT
113 COL_NAME(ic.object_id,ic.column_id) AS column_name
114 FROM sys.indexes AS i
115 INNER JOIN sys.index_columns AS ic
116 ON i.object_id = ic.object_id AND i.index_id = ic.index_id
117 WHERE i.is_primary_key = 1
118 AND i.object_id = OBJECT_ID('{0}');", m_Realm);
119 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
120 using (SqlCommand cmd = new SqlCommand(query, conn))
121 {
122 conn.Open();
123 using (SqlDataReader rdr = cmd.ExecuteReader())
124 {
125 while (rdr.Read())
126 {
127 // query produces 0 to many rows of single column, so always add the first item in each row
128 constraints.Add((string)rdr[0]);
129 }
130 }
131 return constraints;
132 }
133 }
134
135 public virtual T[] Get(string field, string key)
136 {
137 return Get(new string[] { field }, new string[] { key });
138 }
139
140 public virtual T[] Get(string[] fields, string[] keys)
141 {
142 if (fields.Length != keys.Length)
143 return new T[0];
144
145 List<string> terms = new List<string>();
146
147 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
148 using (SqlCommand cmd = new SqlCommand())
149 {
150
151 for (int i = 0; i < fields.Length; i++)
152 {
153 cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
154 terms.Add("[" + fields[i] + "] = @" + fields[i]);
155 }
156
157 string where = String.Join(" AND ", terms.ToArray());
158
159 string query = String.Format("SELECT * FROM {0} WHERE {1}",
160 m_Realm, where);
161
162 cmd.Connection = conn;
163 cmd.CommandText = query;
164 conn.Open();
165 return DoQuery(cmd);
166 }
167 }
168
169 protected T[] DoQuery(SqlCommand cmd)
170 {
171 List<T> result = new List<T>();
172 using (SqlDataReader reader = cmd.ExecuteReader())
173 {
174 if (reader == null)
175 return new T[0];
176
177 CheckColumnNames(reader);
178
179 while (reader.Read())
180 {
181 T row = new T();
182
183 foreach (string name in m_Fields.Keys)
184 {
185 if (m_Fields[name].GetValue(row) is bool)
186 {
187 int v = Convert.ToInt32(reader[name]);
188 m_Fields[name].SetValue(row, v != 0 ? true : false);
189 }
190 else if (m_Fields[name].GetValue(row) is UUID)
191 {
192 UUID uuid = UUID.Zero;
193
194 UUID.TryParse(reader[name].ToString(), out uuid);
195 m_Fields[name].SetValue(row, uuid);
196 }
197 else if (m_Fields[name].GetValue(row) is int)
198 {
199 int v = Convert.ToInt32(reader[name]);
200 m_Fields[name].SetValue(row, v);
201 }
202 else
203 {
204 m_Fields[name].SetValue(row, reader[name]);
205 }
206 }
207
208 if (m_DataField != null)
209 {
210 Dictionary<string, string> data =
211 new Dictionary<string, string>();
212
213 foreach (string col in m_ColumnNames)
214 {
215 data[col] = reader[col].ToString();
216 if (data[col] == null)
217 data[col] = String.Empty;
218 }
219
220 m_DataField.SetValue(row, data);
221 }
222
223 result.Add(row);
224 }
225 return result.ToArray();
226 }
227 }
228
229 public virtual T[] Get(string where)
230 {
231 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
232 using (SqlCommand cmd = new SqlCommand())
233 {
234
235 string query = String.Format("SELECT * FROM {0} WHERE {1}",
236 m_Realm, where);
237 cmd.Connection = conn;
238 cmd.CommandText = query;
239
240 //m_log.WarnFormat("[MSSQLGenericTable]: SELECT {0} WHERE {1}", m_Realm, where);
241
242 conn.Open();
243 return DoQuery(cmd);
244 }
245 }
246
247 public virtual bool Store(T row)
248 {
249 List<string> constraintFields = GetConstraints();
250 List<KeyValuePair<string, string>> constraints = new List<KeyValuePair<string, string>>();
251
252 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
253 using (SqlCommand cmd = new SqlCommand())
254 {
255
256 StringBuilder query = new StringBuilder();
257 List<String> names = new List<String>();
258 List<String> values = new List<String>();
259
260 foreach (FieldInfo fi in m_Fields.Values)
261 {
262 names.Add(fi.Name);
263 values.Add("@" + fi.Name);
264 // Temporarily return more information about what field is unexpectedly null for
265 // http://opensimulator.org/mantis/view.php?id=5403. This might be due to a bug in the
266 // InventoryTransferModule or we may be required to substitute a DBNull here.
267 if (fi.GetValue(row) == null)
268 throw new NullReferenceException(
269 string.Format(
270 "[MSSQL GENERIC TABLE HANDLER]: Trying to store field {0} for {1} which is unexpectedly null",
271 fi.Name, row));
272
273 if (constraintFields.Count > 0 && constraintFields.Contains(fi.Name))
274 {
275 constraints.Add(new KeyValuePair<string, string>(fi.Name, fi.GetValue(row).ToString()));
276 }
277 cmd.Parameters.Add(m_database.CreateParameter(fi.Name, fi.GetValue(row).ToString()));
278 }
279
280 if (m_DataField != null)
281 {
282 Dictionary<string, string> data =
283 (Dictionary<string, string>)m_DataField.GetValue(row);
284
285 foreach (KeyValuePair<string, string> kvp in data)
286 {
287 if (constraintFields.Count > 0 && constraintFields.Contains(kvp.Key))
288 {
289 constraints.Add(new KeyValuePair<string, string>(kvp.Key, kvp.Key));
290 }
291 names.Add(kvp.Key);
292 values.Add("@" + kvp.Key);
293 cmd.Parameters.Add(m_database.CreateParameter("@" + kvp.Key, kvp.Value));
294 }
295
296 }
297
298 query.AppendFormat("UPDATE {0} SET ", m_Realm);
299 int i = 0;
300 for (i = 0; i < names.Count - 1; i++)
301 {
302 query.AppendFormat("[{0}] = {1}, ", names[i], values[i]);
303 }
304 query.AppendFormat("[{0}] = {1} ", names[i], values[i]);
305 if (constraints.Count > 0)
306 {
307 List<string> terms = new List<string>();
308 for (int j = 0; j < constraints.Count; j++)
309 {
310 terms.Add(" [" + constraints[j].Key + "] = @" + constraints[j].Key);
311 }
312 string where = String.Join(" AND ", terms.ToArray());
313 query.AppendFormat(" WHERE {0} ", where);
314
315 }
316 cmd.Connection = conn;
317 cmd.CommandText = query.ToString();
318
319 conn.Open();
320 if (cmd.ExecuteNonQuery() > 0)
321 {
322 //m_log.WarnFormat("[MSSQLGenericTable]: Updating {0}", m_Realm);
323 return true;
324 }
325 else
326 {
327 // assume record has not yet been inserted
328
329 query = new StringBuilder();
330 query.AppendFormat("INSERT INTO {0} ([", m_Realm);
331 query.Append(String.Join("],[", names.ToArray()));
332 query.Append("]) values (" + String.Join(",", values.ToArray()) + ")");
333 cmd.Connection = conn;
334 cmd.CommandText = query.ToString();
335 //m_log.WarnFormat("[MSSQLGenericTable]: Inserting into {0}", m_Realm);
336 if (conn.State != ConnectionState.Open)
337 conn.Open();
338 if (cmd.ExecuteNonQuery() > 0)
339 return true;
340 }
341
342 return false;
343 }
344 }
345
346 public virtual bool Delete(string field, string key)
347 {
348 return Delete(new string[] { field }, new string[] { key });
349 }
350
351 public virtual bool Delete(string[] fields, string[] keys)
352 {
353 if (fields.Length != keys.Length)
354 return false;
355
356 List<string> terms = new List<string>();
357
358 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
359 using (SqlCommand cmd = new SqlCommand())
360 {
361 for (int i = 0; i < fields.Length; i++)
362 {
363 cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
364 terms.Add("[" + fields[i] + "] = @" + fields[i]);
365 }
366
367 string where = String.Join(" AND ", terms.ToArray());
368
369 string query = String.Format("DELETE FROM {0} WHERE {1}", m_Realm, where);
370
371 cmd.Connection = conn;
372 cmd.CommandText = query;
373 conn.Open();
374
375 if (cmd.ExecuteNonQuery() > 0)
376 {
377 //m_log.Warn("[MSSQLGenericTable]: " + deleteCommand);
378 return true;
379 }
380 return false;
381 }
382 }
383 }
384}
diff --git a/OpenSim/Data/MSSQL/MSSQLGridUserData.cs b/OpenSim/Data/MSSQL/MSSQLGridUserData.cs
deleted file mode 100644
index 9e215f9..0000000
--- a/OpenSim/Data/MSSQL/MSSQLGridUserData.cs
+++ /dev/null
@@ -1,64 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using System.Data.SqlClient;
37
38namespace OpenSim.Data.MSSQL
39{
40 /// <summary>
41 /// A MSSQL Interface for Avatar Storage
42 /// </summary>
43 public class MSSQLGridUserData : MSSQLGenericTableHandler<GridUserData>,
44 IGridUserData
45 {
46// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 public MSSQLGridUserData(string connectionString, string realm) :
49 base(connectionString, realm, "GridUserStore")
50 {
51 }
52
53 public GridUserData Get(string userID)
54 {
55 GridUserData[] ret = Get("UserID", userID);
56
57 if (ret.Length == 0)
58 return null;
59
60 return ret[0];
61 }
62
63 }
64}
diff --git a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs b/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
deleted file mode 100644
index 961593f..0000000
--- a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
+++ /dev/null
@@ -1,831 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Data.SqlClient;
32using System.Reflection;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36
37namespace OpenSim.Data.MSSQL
38{
39 /// <summary>
40 /// A MSSQL interface for the inventory server
41 /// </summary>
42 public class MSSQLInventoryData : IInventoryDataPlugin
43 {
44 private const string _migrationStore = "InventoryStore";
45
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 /// <summary>
49 /// The database manager
50 /// </summary>
51 private MSSQLManager database;
52 private string m_connectionString;
53
54 #region IPlugin members
55
56 [Obsolete("Cannot be default-initialized!")]
57 public void Initialise()
58 {
59 m_log.Info("[MSSQLInventoryData]: " + Name + " cannot be default-initialized!");
60 throw new PluginNotInitialisedException(Name);
61 }
62
63 /// <summary>
64 /// Loads and initialises the MSSQL inventory storage interface
65 /// </summary>
66 /// <param name="connectionString">connect string</param>
67 /// <remarks>use mssql_connection.ini</remarks>
68 public void Initialise(string connectionString)
69 {
70 m_connectionString = connectionString;
71 database = new MSSQLManager(connectionString);
72
73 //New migrations check of store
74 database.CheckMigration(_migrationStore);
75 }
76
77 /// <summary>
78 /// The name of this DB provider
79 /// </summary>
80 /// <returns>A string containing the name of the DB provider</returns>
81 public string Name
82 {
83 get { return "MSSQL Inventory Data Interface"; }
84 }
85
86 /// <summary>
87 /// Closes this DB provider
88 /// </summary>
89 public void Dispose()
90 {
91 database = null;
92 }
93
94 /// <summary>
95 /// Returns the version of this DB provider
96 /// </summary>
97 /// <returns>A string containing the DB provider</returns>
98 public string Version
99 {
100 get { return database.getVersion(); }
101 }
102
103 #endregion
104
105 #region Folder methods
106
107 /// <summary>
108 /// Returns a list of the root folders within a users inventory
109 /// </summary>
110 /// <param name="user">The user whos inventory is to be searched</param>
111 /// <returns>A list of folder objects</returns>
112 public List<InventoryFolderBase> getUserRootFolders(UUID user)
113 {
114 if (user == UUID.Zero)
115 return new List<InventoryFolderBase>();
116
117 return getInventoryFolders(UUID.Zero, user);
118 }
119
120 /// <summary>
121 /// see InventoryItemBase.getUserRootFolder
122 /// </summary>
123 /// <param name="user">the User UUID</param>
124 /// <returns></returns>
125 public InventoryFolderBase getUserRootFolder(UUID user)
126 {
127 List<InventoryFolderBase> items = getUserRootFolders(user);
128
129 InventoryFolderBase rootFolder = null;
130
131 // There should only ever be one root folder for a user. However, if there's more
132 // than one we'll simply use the first one rather than failing. It would be even
133 // nicer to print some message to this effect, but this feels like it's too low a
134 // to put such a message out, and it's too minor right now to spare the time to
135 // suitably refactor.
136 if (items.Count > 0)
137 {
138 rootFolder = items[0];
139 }
140
141 return rootFolder;
142 }
143
144 /// <summary>
145 /// Returns a list of folders in a users inventory contained within the specified folder
146 /// </summary>
147 /// <param name="parentID">The folder to search</param>
148 /// <returns>A list of inventory folders</returns>
149 public List<InventoryFolderBase> getInventoryFolders(UUID parentID)
150 {
151 return getInventoryFolders(parentID, UUID.Zero);
152 }
153
154 /// <summary>
155 /// Returns a specified inventory folder
156 /// </summary>
157 /// <param name="folderID">The folder to return</param>
158 /// <returns>A folder class</returns>
159 public InventoryFolderBase getInventoryFolder(UUID folderID)
160 {
161 string sql = "SELECT * FROM inventoryfolders WHERE folderID = @folderID";
162 using (SqlConnection conn = new SqlConnection(m_connectionString))
163 using (SqlCommand cmd = new SqlCommand(sql, conn))
164 {
165 cmd.Parameters.Add(database.CreateParameter("folderID", folderID));
166 conn.Open();
167 using (SqlDataReader reader = cmd.ExecuteReader())
168 {
169 if (reader.Read())
170 {
171 return readInventoryFolder(reader);
172 }
173 }
174 }
175 m_log.InfoFormat("[INVENTORY DB] : Found no inventory folder with ID : {0}", folderID);
176 return null;
177 }
178
179 /// <summary>
180 /// Returns all child folders in the hierarchy from the parent folder and down.
181 /// Does not return the parent folder itself.
182 /// </summary>
183 /// <param name="parentID">The folder to get subfolders for</param>
184 /// <returns>A list of inventory folders</returns>
185 public List<InventoryFolderBase> getFolderHierarchy(UUID parentID)
186 {
187 //Note maybe change this to use a Dataset that loading in all folders of a user and then go throw it that way.
188 //Note this is changed so it opens only one connection to the database and not everytime it wants to get data.
189
190 /* NOTE: the implementation below is very inefficient (makes a separate request to get subfolders for
191 * every found folder, recursively). Inventory code for other DBs has been already rewritten to get ALL
192 * inventory for a specific user at once.
193 *
194 * Meanwhile, one little thing is corrected: getFolderHierarchy(UUID.Zero) doesn't make sense and should never
195 * be used, so check for that and return an empty list.
196 */
197
198 List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
199
200 if (parentID == UUID.Zero)
201 return folders;
202
203 string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = @parentID";
204 using (SqlConnection conn = new SqlConnection(m_connectionString))
205 using (SqlCommand cmd = new SqlCommand(sql, conn))
206 {
207 cmd.Parameters.Add(database.CreateParameter("@parentID", parentID));
208 conn.Open();
209 folders.AddRange(getInventoryFolders(cmd));
210
211 List<InventoryFolderBase> tempFolders = new List<InventoryFolderBase>();
212
213 foreach (InventoryFolderBase folderBase in folders)
214 {
215 tempFolders.AddRange(getFolderHierarchy(folderBase.ID, cmd));
216 }
217 if (tempFolders.Count > 0)
218 {
219 folders.AddRange(tempFolders);
220 }
221 }
222 return folders;
223 }
224
225 /// <summary>
226 /// Creates a new inventory folder
227 /// </summary>
228 /// <param name="folder">Folder to create</param>
229 public void addInventoryFolder(InventoryFolderBase folder)
230 {
231 string sql = @"INSERT INTO inventoryfolders ([folderID], [agentID], [parentFolderID], [folderName], [type], [version])
232 VALUES (@folderID, @agentID, @parentFolderID, @folderName, @type, @version);";
233
234 string folderName = folder.Name;
235 if (folderName.Length > 64)
236 {
237 folderName = folderName.Substring(0, 64);
238 m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on add");
239 }
240 using (SqlConnection conn = new SqlConnection(m_connectionString))
241 using (SqlCommand cmd = new SqlCommand(sql, conn))
242 {
243 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
244 cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner));
245 cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
246 cmd.Parameters.Add(database.CreateParameter("folderName", folderName));
247 cmd.Parameters.Add(database.CreateParameter("type", folder.Type));
248 cmd.Parameters.Add(database.CreateParameter("version", folder.Version));
249 conn.Open();
250 try
251 {
252 cmd.ExecuteNonQuery();
253 }
254 catch (Exception e)
255 {
256 m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
257 }
258 }
259 }
260
261 /// <summary>
262 /// Updates an inventory folder
263 /// </summary>
264 /// <param name="folder">Folder to update</param>
265 public void updateInventoryFolder(InventoryFolderBase folder)
266 {
267 string sql = @"UPDATE inventoryfolders SET agentID = @agentID,
268 parentFolderID = @parentFolderID,
269 folderName = @folderName,
270 type = @type,
271 version = @version
272 WHERE folderID = @folderID";
273
274 string folderName = folder.Name;
275 if (folderName.Length > 64)
276 {
277 folderName = folderName.Substring(0, 64);
278 m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on update");
279 }
280 using (SqlConnection conn = new SqlConnection(m_connectionString))
281 using (SqlCommand cmd = new SqlCommand(sql, conn))
282 {
283 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
284 cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner));
285 cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
286 cmd.Parameters.Add(database.CreateParameter("folderName", folderName));
287 cmd.Parameters.Add(database.CreateParameter("type", folder.Type));
288 cmd.Parameters.Add(database.CreateParameter("version", folder.Version));
289 conn.Open();
290 try
291 {
292 cmd.ExecuteNonQuery();
293 }
294 catch (Exception e)
295 {
296 m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
297 }
298 }
299 }
300
301 /// <summary>
302 /// Updates an inventory folder
303 /// </summary>
304 /// <param name="folder">Folder to update</param>
305 public void moveInventoryFolder(InventoryFolderBase folder)
306 {
307 string sql = @"UPDATE inventoryfolders SET parentFolderID = @parentFolderID WHERE folderID = @folderID";
308 using (SqlConnection conn = new SqlConnection(m_connectionString))
309 using (SqlCommand cmd = new SqlCommand(sql, conn))
310 {
311 cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
312 cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
313 conn.Open();
314 try
315 {
316 cmd.ExecuteNonQuery();
317 }
318 catch (Exception e)
319 {
320 m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
321 }
322 }
323 }
324
325 /// <summary>
326 /// Delete an inventory folder
327 /// </summary>
328 /// <param name="folderID">Id of folder to delete</param>
329 public void deleteInventoryFolder(UUID folderID)
330 {
331 string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = @parentID";
332
333 using (SqlConnection conn = new SqlConnection(m_connectionString))
334 using (SqlCommand cmd = new SqlCommand(sql, conn))
335 {
336 List<InventoryFolderBase> subFolders;
337 cmd.Parameters.Add(database.CreateParameter("@parentID", UUID.Zero));
338 conn.Open();
339 subFolders = getFolderHierarchy(folderID, cmd);
340
341
342 //Delete all sub-folders
343 foreach (InventoryFolderBase f in subFolders)
344 {
345 DeleteOneFolder(f.ID, conn);
346 DeleteItemsInFolder(f.ID, conn);
347 }
348
349 //Delete the actual row
350 DeleteOneFolder(folderID, conn);
351 DeleteItemsInFolder(folderID, conn);
352 }
353 }
354
355 #endregion
356
357 #region Item Methods
358
359 /// <summary>
360 /// Returns a list of items in a specified folder
361 /// </summary>
362 /// <param name="folderID">The folder to search</param>
363 /// <returns>A list containing inventory items</returns>
364 public List<InventoryItemBase> getInventoryInFolder(UUID folderID)
365 {
366 string sql = "SELECT * FROM inventoryitems WHERE parentFolderID = @parentFolderID";
367 using (SqlConnection conn = new SqlConnection(m_connectionString))
368 using (SqlCommand cmd = new SqlCommand(sql, conn))
369 {
370 cmd.Parameters.Add(database.CreateParameter("parentFolderID", folderID));
371 conn.Open();
372 List<InventoryItemBase> items = new List<InventoryItemBase>();
373
374 using (SqlDataReader reader = cmd.ExecuteReader())
375 {
376 while (reader.Read())
377 {
378 items.Add(readInventoryItem(reader));
379 }
380 }
381 return items;
382 }
383 }
384
385 /// <summary>
386 /// Returns a specified inventory item
387 /// </summary>
388 /// <param name="itemID">The item ID</param>
389 /// <returns>An inventory item</returns>
390 public InventoryItemBase getInventoryItem(UUID itemID)
391 {
392 string sql = "SELECT * FROM inventoryitems WHERE inventoryID = @inventoryID";
393 using (SqlConnection conn = new SqlConnection(m_connectionString))
394 using (SqlCommand cmd = new SqlCommand(sql, conn))
395 {
396 cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID));
397 conn.Open();
398 using (SqlDataReader reader = cmd.ExecuteReader())
399 {
400 if (reader.Read())
401 {
402 return readInventoryItem(reader);
403 }
404 }
405 }
406
407 m_log.InfoFormat("[INVENTORY DB]: Found no inventory item with ID : {0}", itemID);
408 return null;
409 }
410
411 /// <summary>
412 /// Adds a specified item to the database
413 /// </summary>
414 /// <param name="item">The inventory item</param>
415 public void addInventoryItem(InventoryItemBase item)
416 {
417 if (getInventoryItem(item.ID) != null)
418 {
419 updateInventoryItem(item);
420 return;
421 }
422
423 string sql = @"INSERT INTO inventoryitems
424 ([inventoryID], [assetID], [assetType], [parentFolderID], [avatarID], [inventoryName],
425 [inventoryDescription], [inventoryNextPermissions], [inventoryCurrentPermissions],
426 [invType], [creatorID], [inventoryBasePermissions], [inventoryEveryOnePermissions], [inventoryGroupPermissions],
427 [salePrice], [saleType], [creationDate], [groupID], [groupOwned], [flags])
428 VALUES
429 (@inventoryID, @assetID, @assetType, @parentFolderID, @avatarID, @inventoryName, @inventoryDescription,
430 @inventoryNextPermissions, @inventoryCurrentPermissions, @invType, @creatorID,
431 @inventoryBasePermissions, @inventoryEveryOnePermissions, @inventoryGroupPermissions, @salePrice, @saleType,
432 @creationDate, @groupID, @groupOwned, @flags)";
433
434 string itemName = item.Name;
435 if (item.Name.Length > 64)
436 {
437 itemName = item.Name.Substring(0, 64);
438 m_log.Warn("[INVENTORY DB]: Name field truncated from " + item.Name.Length.ToString() + " to " + itemName.Length.ToString() + " characters");
439 }
440
441 string itemDesc = item.Description;
442 if (item.Description.Length > 128)
443 {
444 itemDesc = item.Description.Substring(0, 128);
445 m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters");
446 }
447
448 using (SqlConnection conn = new SqlConnection(m_connectionString))
449 using (SqlCommand command = new SqlCommand(sql, conn))
450 {
451 command.Parameters.Add(database.CreateParameter("inventoryID", item.ID));
452 command.Parameters.Add(database.CreateParameter("assetID", item.AssetID));
453 command.Parameters.Add(database.CreateParameter("assetType", item.AssetType));
454 command.Parameters.Add(database.CreateParameter("parentFolderID", item.Folder));
455 command.Parameters.Add(database.CreateParameter("avatarID", item.Owner));
456 command.Parameters.Add(database.CreateParameter("inventoryName", itemName));
457 command.Parameters.Add(database.CreateParameter("inventoryDescription", itemDesc));
458 command.Parameters.Add(database.CreateParameter("inventoryNextPermissions", item.NextPermissions));
459 command.Parameters.Add(database.CreateParameter("inventoryCurrentPermissions", item.CurrentPermissions));
460 command.Parameters.Add(database.CreateParameter("invType", item.InvType));
461 command.Parameters.Add(database.CreateParameter("creatorID", item.CreatorId));
462 command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions));
463 command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions));
464 command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions));
465 command.Parameters.Add(database.CreateParameter("salePrice", item.SalePrice));
466 command.Parameters.Add(database.CreateParameter("saleType", item.SaleType));
467 command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate));
468 command.Parameters.Add(database.CreateParameter("groupID", item.GroupID));
469 command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned));
470 command.Parameters.Add(database.CreateParameter("flags", item.Flags));
471 conn.Open();
472 try
473 {
474 command.ExecuteNonQuery();
475 }
476 catch (Exception e)
477 {
478 m_log.Error("[INVENTORY DB]: Error inserting item :" + e.Message);
479 }
480 }
481
482 sql = "UPDATE inventoryfolders SET version = version + 1 WHERE folderID = @folderID";
483 using (SqlConnection conn = new SqlConnection(m_connectionString))
484 using (SqlCommand command = new SqlCommand(sql, conn))
485 {
486 command.Parameters.Add(database.CreateParameter("folderID", item.Folder.ToString()));
487 conn.Open();
488 try
489 {
490 command.ExecuteNonQuery();
491 }
492 catch (Exception e)
493 {
494 m_log.Error("[INVENTORY DB] Error updating inventory folder for new item :" + e.Message);
495 }
496 }
497 }
498
499 /// <summary>
500 /// Updates the specified inventory item
501 /// </summary>
502 /// <param name="item">Inventory item to update</param>
503 public void updateInventoryItem(InventoryItemBase item)
504 {
505 string sql = @"UPDATE inventoryitems SET assetID = @assetID,
506 assetType = @assetType,
507 parentFolderID = @parentFolderID,
508 avatarID = @avatarID,
509 inventoryName = @inventoryName,
510 inventoryDescription = @inventoryDescription,
511 inventoryNextPermissions = @inventoryNextPermissions,
512 inventoryCurrentPermissions = @inventoryCurrentPermissions,
513 invType = @invType,
514 creatorID = @creatorID,
515 inventoryBasePermissions = @inventoryBasePermissions,
516 inventoryEveryOnePermissions = @inventoryEveryOnePermissions,
517 inventoryGroupPermissions = @inventoryGroupPermissions,
518 salePrice = @salePrice,
519 saleType = @saleType,
520 creationDate = @creationDate,
521 groupID = @groupID,
522 groupOwned = @groupOwned,
523 flags = @flags
524 WHERE inventoryID = @inventoryID";
525
526 string itemName = item.Name;
527 if (item.Name.Length > 64)
528 {
529 itemName = item.Name.Substring(0, 64);
530 m_log.Warn("[INVENTORY DB]: Name field truncated from " + item.Name.Length.ToString() + " to " + itemName.Length.ToString() + " characters on update");
531 }
532
533 string itemDesc = item.Description;
534 if (item.Description.Length > 128)
535 {
536 itemDesc = item.Description.Substring(0, 128);
537 m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters on update");
538 }
539
540 using (SqlConnection conn = new SqlConnection(m_connectionString))
541 using (SqlCommand command = new SqlCommand(sql, conn))
542 {
543 command.Parameters.Add(database.CreateParameter("inventoryID", item.ID));
544 command.Parameters.Add(database.CreateParameter("assetID", item.AssetID));
545 command.Parameters.Add(database.CreateParameter("assetType", item.AssetType));
546 command.Parameters.Add(database.CreateParameter("parentFolderID", item.Folder));
547 command.Parameters.Add(database.CreateParameter("avatarID", item.Owner));
548 command.Parameters.Add(database.CreateParameter("inventoryName", itemName));
549 command.Parameters.Add(database.CreateParameter("inventoryDescription", itemDesc));
550 command.Parameters.Add(database.CreateParameter("inventoryNextPermissions", item.NextPermissions));
551 command.Parameters.Add(database.CreateParameter("inventoryCurrentPermissions", item.CurrentPermissions));
552 command.Parameters.Add(database.CreateParameter("invType", item.InvType));
553 command.Parameters.Add(database.CreateParameter("creatorID", item.CreatorId));
554 command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions));
555 command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions));
556 command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions));
557 command.Parameters.Add(database.CreateParameter("salePrice", item.SalePrice));
558 command.Parameters.Add(database.CreateParameter("saleType", item.SaleType));
559 command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate));
560 command.Parameters.Add(database.CreateParameter("groupID", item.GroupID));
561 command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned));
562 command.Parameters.Add(database.CreateParameter("flags", item.Flags));
563 conn.Open();
564 try
565 {
566 command.ExecuteNonQuery();
567 }
568 catch (Exception e)
569 {
570 m_log.Error("[INVENTORY DB]: Error updating item :" + e.Message);
571 }
572 }
573 }
574
575 // See IInventoryDataPlugin
576
577 /// <summary>
578 /// Delete an item in inventory database
579 /// </summary>
580 /// <param name="itemID">the item UUID</param>
581 public void deleteInventoryItem(UUID itemID)
582 {
583 string sql = "DELETE FROM inventoryitems WHERE inventoryID=@inventoryID";
584 using (SqlConnection conn = new SqlConnection(m_connectionString))
585 using (SqlCommand cmd = new SqlCommand(sql, conn))
586 {
587 cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID));
588 try
589 {
590 conn.Open();
591 cmd.ExecuteNonQuery();
592 }
593 catch (Exception e)
594 {
595 m_log.Error("[INVENTORY DB]: Error deleting item :" + e.Message);
596 }
597 }
598 }
599
600 public InventoryItemBase queryInventoryItem(UUID itemID)
601 {
602 return getInventoryItem(itemID);
603 }
604
605 public InventoryFolderBase queryInventoryFolder(UUID folderID)
606 {
607 return getInventoryFolder(folderID);
608 }
609
610 /// <summary>
611 /// Returns all activated gesture-items in the inventory of the specified avatar.
612 /// </summary>
613 /// <param name="avatarID">The <see cref="UUID"/> of the avatar</param>
614 /// <returns>
615 /// The list of gestures (<see cref="InventoryItemBase"/>s)
616 /// </returns>
617 public List<InventoryItemBase> fetchActiveGestures(UUID avatarID)
618 {
619 string sql = "SELECT * FROM inventoryitems WHERE avatarId = @uuid AND assetType = @assetType and flags = 1";
620 using (SqlConnection conn = new SqlConnection(m_connectionString))
621 using (SqlCommand cmd = new SqlCommand(sql, conn))
622 {
623 cmd.Parameters.Add(database.CreateParameter("uuid", avatarID));
624 cmd.Parameters.Add(database.CreateParameter("assetType", (int)AssetType.Gesture));
625 conn.Open();
626 using (SqlDataReader reader = cmd.ExecuteReader())
627 {
628 List<InventoryItemBase> gestureList = new List<InventoryItemBase>();
629 while (reader.Read())
630 {
631 gestureList.Add(readInventoryItem(reader));
632 }
633 return gestureList;
634 }
635 }
636 }
637
638 #endregion
639
640 #region Private methods
641
642 /// <summary>
643 /// Delete an item in inventory database
644 /// </summary>
645 /// <param name="folderID">the item ID</param>
646 /// <param name="connection">connection to the database</param>
647 private void DeleteItemsInFolder(UUID folderID, SqlConnection connection)
648 {
649 using (SqlCommand command = new SqlCommand("DELETE FROM inventoryitems WHERE folderID=@folderID", connection))
650 {
651 command.Parameters.Add(database.CreateParameter("folderID", folderID));
652
653 try
654 {
655 command.ExecuteNonQuery();
656 }
657 catch (Exception e)
658 {
659 m_log.Error("[INVENTORY DB] Error deleting item :" + e.Message);
660 }
661 }
662 }
663
664 /// <summary>
665 /// Gets the folder hierarchy in a loop.
666 /// </summary>
667 /// <param name="parentID">parent ID.</param>
668 /// <param name="command">SQL command/connection to database</param>
669 /// <returns></returns>
670 private static List<InventoryFolderBase> getFolderHierarchy(UUID parentID, SqlCommand command)
671 {
672 command.Parameters["@parentID"].Value = parentID.Guid; //.ToString();
673
674 List<InventoryFolderBase> folders = getInventoryFolders(command);
675
676 if (folders.Count > 0)
677 {
678 List<InventoryFolderBase> tempFolders = new List<InventoryFolderBase>();
679
680 foreach (InventoryFolderBase folderBase in folders)
681 {
682 tempFolders.AddRange(getFolderHierarchy(folderBase.ID, command));
683 }
684
685 if (tempFolders.Count > 0)
686 {
687 folders.AddRange(tempFolders);
688 }
689 }
690 return folders;
691 }
692
693 /// <summary>
694 /// Gets the inventory folders.
695 /// </summary>
696 /// <param name="parentID">parentID, use UUID.Zero to get root</param>
697 /// <param name="user">user id, use UUID.Zero, if you want all folders from a parentID.</param>
698 /// <returns></returns>
699 private List<InventoryFolderBase> getInventoryFolders(UUID parentID, UUID user)
700 {
701 string sql = "SELECT * FROM inventoryfolders WHERE parentFolderID = @parentID AND agentID LIKE @uuid";
702 using (SqlConnection conn = new SqlConnection(m_connectionString))
703 using (SqlCommand command = new SqlCommand(sql, conn))
704 {
705 if (user == UUID.Zero)
706 {
707 command.Parameters.Add(database.CreateParameter("uuid", "%"));
708 }
709 else
710 {
711 command.Parameters.Add(database.CreateParameter("uuid", user));
712 }
713 command.Parameters.Add(database.CreateParameter("parentID", parentID));
714 conn.Open();
715 return getInventoryFolders(command);
716 }
717 }
718
719 /// <summary>
720 /// Gets the inventory folders.
721 /// </summary>
722 /// <param name="command">SQLcommand.</param>
723 /// <returns></returns>
724 private static List<InventoryFolderBase> getInventoryFolders(SqlCommand command)
725 {
726 using (SqlDataReader reader = command.ExecuteReader())
727 {
728
729 List<InventoryFolderBase> items = new List<InventoryFolderBase>();
730 while (reader.Read())
731 {
732 items.Add(readInventoryFolder(reader));
733 }
734 return items;
735 }
736 }
737
738 /// <summary>
739 /// Reads a list of inventory folders returned by a query.
740 /// </summary>
741 /// <param name="reader">A MSSQL Data Reader</param>
742 /// <returns>A List containing inventory folders</returns>
743 protected static InventoryFolderBase readInventoryFolder(SqlDataReader reader)
744 {
745 try
746 {
747 InventoryFolderBase folder = new InventoryFolderBase();
748 folder.Owner = DBGuid.FromDB(reader["agentID"]);
749 folder.ParentID = DBGuid.FromDB(reader["parentFolderID"]);
750 folder.ID = DBGuid.FromDB(reader["folderID"]);
751 folder.Name = (string)reader["folderName"];
752 folder.Type = (short)reader["type"];
753 folder.Version = Convert.ToUInt16(reader["version"]);
754
755 return folder;
756 }
757 catch (Exception e)
758 {
759 m_log.Error("[INVENTORY DB] Error reading inventory folder :" + e.Message);
760 }
761
762 return null;
763 }
764
765 /// <summary>
766 /// Reads a one item from an SQL result
767 /// </summary>
768 /// <param name="reader">The SQL Result</param>
769 /// <returns>the item read</returns>
770 private static InventoryItemBase readInventoryItem(IDataRecord reader)
771 {
772 try
773 {
774 InventoryItemBase item = new InventoryItemBase();
775
776 item.ID = DBGuid.FromDB(reader["inventoryID"]);
777 item.AssetID = DBGuid.FromDB(reader["assetID"]);
778 item.AssetType = Convert.ToInt32(reader["assetType"].ToString());
779 item.Folder = DBGuid.FromDB(reader["parentFolderID"]);
780 item.Owner = DBGuid.FromDB(reader["avatarID"]);
781 item.Name = reader["inventoryName"].ToString();
782 item.Description = reader["inventoryDescription"].ToString();
783 item.NextPermissions = Convert.ToUInt32(reader["inventoryNextPermissions"]);
784 item.CurrentPermissions = Convert.ToUInt32(reader["inventoryCurrentPermissions"]);
785 item.InvType = Convert.ToInt32(reader["invType"].ToString());
786 item.CreatorId = reader["creatorID"].ToString();
787 item.BasePermissions = Convert.ToUInt32(reader["inventoryBasePermissions"]);
788 item.EveryOnePermissions = Convert.ToUInt32(reader["inventoryEveryOnePermissions"]);
789 item.GroupPermissions = Convert.ToUInt32(reader["inventoryGroupPermissions"]);
790 item.SalePrice = Convert.ToInt32(reader["salePrice"]);
791 item.SaleType = Convert.ToByte(reader["saleType"]);
792 item.CreationDate = Convert.ToInt32(reader["creationDate"]);
793 item.GroupID = DBGuid.FromDB(reader["groupID"]);
794 item.GroupOwned = Convert.ToBoolean(reader["groupOwned"]);
795 item.Flags = Convert.ToUInt32(reader["flags"]);
796
797 return item;
798 }
799 catch (SqlException e)
800 {
801 m_log.Error("[INVENTORY DB]: Error reading inventory item :" + e.Message);
802 }
803
804 return null;
805 }
806
807 /// <summary>
808 /// Delete a folder in inventory databasae
809 /// </summary>
810 /// <param name="folderID">the folder UUID</param>
811 /// <param name="connection">connection to database</param>
812 private void DeleteOneFolder(UUID folderID, SqlConnection connection)
813 {
814 try
815 {
816 using (SqlCommand command = new SqlCommand("DELETE FROM inventoryfolders WHERE folderID=@folderID and type=-1", connection))
817 {
818 command.Parameters.Add(database.CreateParameter("folderID", folderID));
819
820 command.ExecuteNonQuery();
821 }
822 }
823 catch (SqlException e)
824 {
825 m_log.Error("[INVENTORY DB]: Error deleting folder :" + e.Message);
826 }
827 }
828
829 #endregion
830 }
831}
diff --git a/OpenSim/Data/MSSQL/MSSQLManager.cs b/OpenSim/Data/MSSQL/MSSQLManager.cs
deleted file mode 100644
index 9a0015c..0000000
--- a/OpenSim/Data/MSSQL/MSSQLManager.cs
+++ /dev/null
@@ -1,219 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Data.SqlClient;
32using System.IO;
33using System.Reflection;
34using log4net;
35using OpenMetaverse;
36
37namespace OpenSim.Data.MSSQL
38{
39 /// <summary>
40 /// A management class for the MS SQL Storage Engine
41 /// </summary>
42 public class MSSQLManager
43 {
44// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45
46 /// <summary>
47 /// Connection string for ADO.net
48 /// </summary>
49 private readonly string connectionString;
50
51 /// <summary>
52 /// Initialize the manager and set the connectionstring
53 /// </summary>
54 /// <param name="connection"></param>
55 public MSSQLManager(string connection)
56 {
57 connectionString = connection;
58 }
59
60 /// <summary>
61 /// Type conversion to a SQLDbType functions
62 /// </summary>
63 /// <param name="type"></param>
64 /// <returns></returns>
65 internal SqlDbType DbtypeFromType(Type type)
66 {
67 if (type == typeof(string))
68 {
69 return SqlDbType.VarChar;
70 }
71 if (type == typeof(double))
72 {
73 return SqlDbType.Float;
74 }
75 if (type == typeof(Single))
76 {
77 return SqlDbType.Float;
78 }
79 if (type == typeof(int))
80 {
81 return SqlDbType.Int;
82 }
83 if (type == typeof(bool))
84 {
85 return SqlDbType.Bit;
86 }
87 if (type == typeof(UUID))
88 {
89 return SqlDbType.UniqueIdentifier;
90 }
91 if (type == typeof(sbyte))
92 {
93 return SqlDbType.Int;
94 }
95 if (type == typeof(Byte[]))
96 {
97 return SqlDbType.Image;
98 }
99 if (type == typeof(uint) || type == typeof(ushort))
100 {
101 return SqlDbType.Int;
102 }
103 if (type == typeof(ulong))
104 {
105 return SqlDbType.BigInt;
106 }
107 if (type == typeof(DateTime))
108 {
109 return SqlDbType.DateTime;
110 }
111
112 return SqlDbType.VarChar;
113 }
114
115 /// <summary>
116 /// Creates value for parameter.
117 /// </summary>
118 /// <param name="value">The value.</param>
119 /// <returns></returns>
120 private static object CreateParameterValue(object value)
121 {
122 Type valueType = value.GetType();
123
124 if (valueType == typeof(UUID)) //TODO check if this works
125 {
126 return ((UUID) value).Guid;
127 }
128 if (valueType == typeof(UUID))
129 {
130 return ((UUID)value).Guid;
131 }
132 if (valueType == typeof(bool))
133 {
134 return (bool)value ? 1 : 0;
135 }
136 if (valueType == typeof(Byte[]))
137 {
138 return value;
139 }
140 if (valueType == typeof(int))
141 {
142 return value;
143 }
144 return value;
145 }
146
147 /// <summary>
148 /// Create a parameter for a command
149 /// </summary>
150 /// <param name="parameterName">Name of the parameter.</param>
151 /// <param name="parameterObject">parameter object.</param>
152 /// <returns></returns>
153 internal SqlParameter CreateParameter(string parameterName, object parameterObject)
154 {
155 return CreateParameter(parameterName, parameterObject, false);
156 }
157
158 /// <summary>
159 /// Creates the parameter for a command.
160 /// </summary>
161 /// <param name="parameterName">Name of the parameter.</param>
162 /// <param name="parameterObject">parameter object.</param>
163 /// <param name="parameterOut">if set to <c>true</c> parameter is a output parameter</param>
164 /// <returns></returns>
165 internal SqlParameter CreateParameter(string parameterName, object parameterObject, bool parameterOut)
166 {
167 //Tweak so we dont always have to add @ sign
168 if (!parameterName.StartsWith("@")) parameterName = "@" + parameterName;
169
170 //HACK if object is null, it is turned into a string, there are no nullable type till now
171 if (parameterObject == null) parameterObject = "";
172
173 SqlParameter parameter = new SqlParameter(parameterName, DbtypeFromType(parameterObject.GetType()));
174
175 if (parameterOut)
176 {
177 parameter.Direction = ParameterDirection.Output;
178 }
179 else
180 {
181 parameter.Direction = ParameterDirection.Input;
182 parameter.Value = CreateParameterValue(parameterObject);
183 }
184
185 return parameter;
186 }
187
188 /// <summary>
189 /// Checks if we need to do some migrations to the database
190 /// </summary>
191 /// <param name="migrationStore">migrationStore.</param>
192 public void CheckMigration(string migrationStore)
193 {
194 using (SqlConnection connection = new SqlConnection(connectionString))
195 {
196 connection.Open();
197 Assembly assem = GetType().Assembly;
198 MSSQLMigration migration = new MSSQLMigration(connection, assem, migrationStore);
199
200 migration.Update();
201 }
202 }
203
204 /// <summary>
205 /// Returns the version of this DB provider
206 /// </summary>
207 /// <returns>A string containing the DB provider</returns>
208 public string getVersion()
209 {
210 Module module = GetType().Module;
211 // string dllName = module.Assembly.ManifestModule.Name;
212 Version dllVersion = module.Assembly.GetName().Version;
213
214 return
215 string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build,
216 dllVersion.Revision);
217 }
218 }
219}
diff --git a/OpenSim/Data/MSSQL/MSSQLMigration.cs b/OpenSim/Data/MSSQL/MSSQLMigration.cs
deleted file mode 100644
index c2fecef..0000000
--- a/OpenSim/Data/MSSQL/MSSQLMigration.cs
+++ /dev/null
@@ -1,99 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Data;
30using System.Data.Common;
31using System.Reflection;
32using System.Data.SqlClient;
33
34namespace OpenSim.Data.MSSQL
35{
36 public class MSSQLMigration : Migration
37 {
38 public MSSQLMigration(DbConnection conn, Assembly assem, string type)
39 : base(conn, assem, type)
40 {
41 }
42
43 public MSSQLMigration(DbConnection conn, Assembly assem, string subtype, string type)
44 : base(conn, assem, subtype, type)
45 {
46 }
47
48 protected override int FindVersion(DbConnection conn, string type)
49 {
50 int version = 0;
51 using (DbCommand cmd = conn.CreateCommand())
52 {
53 try
54 {
55 cmd.CommandText = "select top 1 version from migrations where name = '" + type + "' order by version desc"; //Must be
56 using (IDataReader reader = cmd.ExecuteReader())
57 {
58 if (reader.Read())
59 {
60 version = Convert.ToInt32(reader["version"]);
61 }
62 reader.Close();
63 }
64 }
65 catch
66 {
67 // Return -1 to indicate table does not exist
68 return -1;
69 }
70 }
71 return version;
72 }
73
74 protected override void ExecuteScript(DbConnection conn, string[] script)
75 {
76 if (!(conn is SqlConnection))
77 {
78 base.ExecuteScript(conn, script);
79 return;
80 }
81
82 foreach (string sql in script)
83 {
84 try
85 {
86 using (SqlCommand cmd = new SqlCommand(sql, (SqlConnection)conn))
87 {
88 cmd.ExecuteNonQuery();
89 }
90 }
91 catch (Exception)
92 {
93 throw new Exception(sql);
94
95 }
96 }
97 }
98 }
99}
diff --git a/OpenSim/Data/MSSQL/MSSQLPresenceData.cs b/OpenSim/Data/MSSQL/MSSQLPresenceData.cs
deleted file mode 100644
index 0c71e79..0000000
--- a/OpenSim/Data/MSSQL/MSSQLPresenceData.cs
+++ /dev/null
@@ -1,117 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using System.Data.SqlClient;
37
38namespace OpenSim.Data.MSSQL
39{
40 /// <summary>
41 /// A MySQL Interface for the Presence Server
42 /// </summary>
43 public class MSSQLPresenceData : MSSQLGenericTableHandler<PresenceData>,
44 IPresenceData
45 {
46// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 public MSSQLPresenceData(string connectionString, string realm) :
49 base(connectionString, realm, "Presence")
50 {
51 }
52
53 public PresenceData Get(UUID sessionID)
54 {
55 PresenceData[] ret = Get("SessionID",
56 sessionID.ToString());
57
58 if (ret.Length == 0)
59 return null;
60
61 return ret[0];
62 }
63
64 public void LogoutRegionAgents(UUID regionID)
65 {
66 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
67 using (SqlCommand cmd = new SqlCommand())
68 {
69
70 cmd.CommandText = String.Format("DELETE FROM {0} WHERE [RegionID]=@RegionID", m_Realm);
71
72 cmd.Parameters.Add(m_database.CreateParameter("@RegionID", regionID.ToString()));
73 cmd.Connection = conn;
74 conn.Open();
75 cmd.ExecuteNonQuery();
76 }
77 }
78
79 public bool ReportAgent(UUID sessionID, UUID regionID)
80 {
81 PresenceData[] pd = Get("SessionID", sessionID.ToString());
82 if (pd.Length == 0)
83 return false;
84
85 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
86 using (SqlCommand cmd = new SqlCommand())
87 {
88
89 cmd.CommandText = String.Format(@"UPDATE {0} SET
90 [RegionID] = @RegionID
91 WHERE [SessionID] = @SessionID", m_Realm);
92
93 cmd.Parameters.Add(m_database.CreateParameter("@SessionID", sessionID.ToString()));
94 cmd.Parameters.Add(m_database.CreateParameter("@RegionID", regionID.ToString()));
95 cmd.Connection = conn;
96 conn.Open();
97 if (cmd.ExecuteNonQuery() == 0)
98 return false;
99 }
100 return true;
101 }
102
103 public bool VerifyAgent(UUID agentId, UUID secureSessionID)
104 {
105 PresenceData[] ret = Get("SecureSessionID",
106 secureSessionID.ToString());
107
108 if (ret.Length == 0)
109 return false;
110
111 if(ret[0].UserID != agentId.ToString())
112 return false;
113
114 return true;
115 }
116 }
117}
diff --git a/OpenSim/Data/MSSQL/MSSQLRegionData.cs b/OpenSim/Data/MSSQL/MSSQLRegionData.cs
deleted file mode 100644
index 0d89706..0000000
--- a/OpenSim/Data/MSSQL/MSSQLRegionData.cs
+++ /dev/null
@@ -1,347 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Data.SqlClient;
32using System.Drawing;
33using System.IO;
34using System.Reflection;
35using log4net;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40using RegionFlags = OpenSim.Framework.RegionFlags;
41
42namespace OpenSim.Data.MSSQL
43{
44 /// <summary>
45 /// A MSSQL Interface for the Region Server.
46 /// </summary>
47 public class MSSQLRegionData : IRegionData
48 {
49 private string m_Realm;
50 private List<string> m_ColumnNames = null;
51 private string m_ConnectionString;
52 private MSSQLManager m_database;
53 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
54
55 public MSSQLRegionData(string connectionString, string realm)
56 {
57 m_Realm = realm;
58 m_ConnectionString = connectionString;
59 m_database = new MSSQLManager(connectionString);
60
61 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
62 {
63 conn.Open();
64 Migration m = new Migration(conn, GetType().Assembly, "GridStore");
65 m.Update();
66 }
67 }
68
69 public List<RegionData> Get(string regionName, UUID scopeID)
70 {
71 string sql = "select * from ["+m_Realm+"] where regionName like @regionName";
72 if (scopeID != UUID.Zero)
73 sql += " and ScopeID = @scopeID";
74 sql += " order by regionName";
75 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
76 using (SqlCommand cmd = new SqlCommand(sql, conn))
77 {
78 cmd.Parameters.Add(m_database.CreateParameter("@regionName", regionName));
79 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
80 conn.Open();
81 return RunCommand(cmd);
82 }
83 }
84
85 public RegionData Get(int posX, int posY, UUID scopeID)
86 {
87 string sql = "select * from ["+m_Realm+"] where locX = @posX and locY = @posY";
88 if (scopeID != UUID.Zero)
89 sql += " and ScopeID = @scopeID";
90
91 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
92 using (SqlCommand cmd = new SqlCommand(sql, conn))
93 {
94 cmd.Parameters.Add(m_database.CreateParameter("@posX", posX.ToString()));
95 cmd.Parameters.Add(m_database.CreateParameter("@posY", posY.ToString()));
96 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
97 conn.Open();
98 List<RegionData> ret = RunCommand(cmd);
99 if (ret.Count == 0)
100 return null;
101
102 return ret[0];
103 }
104 }
105
106 public RegionData Get(UUID regionID, UUID scopeID)
107 {
108 string sql = "select * from ["+m_Realm+"] where uuid = @regionID";
109 if (scopeID != UUID.Zero)
110 sql += " and ScopeID = @scopeID";
111 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
112 using (SqlCommand cmd = new SqlCommand(sql, conn))
113 {
114 cmd.Parameters.Add(m_database.CreateParameter("@regionID", regionID));
115 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
116 conn.Open();
117 List<RegionData> ret = RunCommand(cmd);
118 if (ret.Count == 0)
119 return null;
120
121 return ret[0];
122 }
123 }
124
125 public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID)
126 {
127 string sql = "select * from ["+m_Realm+"] where locX between @startX and @endX and locY between @startY and @endY";
128 if (scopeID != UUID.Zero)
129 sql += " and ScopeID = @scopeID";
130
131 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
132 using (SqlCommand cmd = new SqlCommand(sql, conn))
133 {
134 cmd.Parameters.Add(m_database.CreateParameter("@startX", startX));
135 cmd.Parameters.Add(m_database.CreateParameter("@startY", startY));
136 cmd.Parameters.Add(m_database.CreateParameter("@endX", endX));
137 cmd.Parameters.Add(m_database.CreateParameter("@endY", endY));
138 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
139 conn.Open();
140 return RunCommand(cmd);
141 }
142 }
143
144 public List<RegionData> RunCommand(SqlCommand cmd)
145 {
146 List<RegionData> retList = new List<RegionData>();
147
148 SqlDataReader result = cmd.ExecuteReader();
149
150 while (result.Read())
151 {
152 RegionData ret = new RegionData();
153 ret.Data = new Dictionary<string, object>();
154
155 UUID regionID;
156 UUID.TryParse(result["uuid"].ToString(), out regionID);
157 ret.RegionID = regionID;
158 UUID scope;
159 UUID.TryParse(result["ScopeID"].ToString(), out scope);
160 ret.ScopeID = scope;
161 ret.RegionName = result["regionName"].ToString();
162 ret.posX = Convert.ToInt32(result["locX"]);
163 ret.posY = Convert.ToInt32(result["locY"]);
164 ret.sizeX = Convert.ToInt32(result["sizeX"]);
165 ret.sizeY = Convert.ToInt32(result["sizeY"]);
166
167 if (m_ColumnNames == null)
168 {
169 m_ColumnNames = new List<string>();
170
171 DataTable schemaTable = result.GetSchemaTable();
172 foreach (DataRow row in schemaTable.Rows)
173 m_ColumnNames.Add(row["ColumnName"].ToString());
174 }
175
176 foreach (string s in m_ColumnNames)
177 {
178 if (s == "uuid")
179 continue;
180 if (s == "ScopeID")
181 continue;
182 if (s == "regionName")
183 continue;
184 if (s == "locX")
185 continue;
186 if (s == "locY")
187 continue;
188
189 ret.Data[s] = result[s].ToString();
190 }
191
192 retList.Add(ret);
193 }
194 return retList;
195 }
196
197 public bool Store(RegionData data)
198 {
199 if (data.Data.ContainsKey("uuid"))
200 data.Data.Remove("uuid");
201 if (data.Data.ContainsKey("ScopeID"))
202 data.Data.Remove("ScopeID");
203 if (data.Data.ContainsKey("regionName"))
204 data.Data.Remove("regionName");
205 if (data.Data.ContainsKey("posX"))
206 data.Data.Remove("posX");
207 if (data.Data.ContainsKey("posY"))
208 data.Data.Remove("posY");
209 if (data.Data.ContainsKey("sizeX"))
210 data.Data.Remove("sizeX");
211 if (data.Data.ContainsKey("sizeY"))
212 data.Data.Remove("sizeY");
213 if (data.Data.ContainsKey("locX"))
214 data.Data.Remove("locX");
215 if (data.Data.ContainsKey("locY"))
216 data.Data.Remove("locY");
217
218 string[] fields = new List<string>(data.Data.Keys).ToArray();
219
220 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
221 using (SqlCommand cmd = new SqlCommand())
222 {
223
224 string update = "update [" + m_Realm + "] set locX=@posX, locY=@posY, sizeX=@sizeX, sizeY=@sizeY ";
225
226 foreach (string field in fields)
227 {
228
229 update += ", ";
230 update += "[" + field + "] = @" + field;
231
232 cmd.Parameters.Add(m_database.CreateParameter("@" + field, data.Data[field]));
233 }
234
235 update += " where uuid = @regionID";
236
237 if (data.ScopeID != UUID.Zero)
238 update += " and ScopeID = @scopeID";
239
240 cmd.CommandText = update;
241 cmd.Connection = conn;
242 cmd.Parameters.Add(m_database.CreateParameter("@regionID", data.RegionID));
243 cmd.Parameters.Add(m_database.CreateParameter("@regionName", data.RegionName));
244 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", data.ScopeID));
245 cmd.Parameters.Add(m_database.CreateParameter("@posX", data.posX));
246 cmd.Parameters.Add(m_database.CreateParameter("@posY", data.posY));
247 cmd.Parameters.Add(m_database.CreateParameter("@sizeX", data.sizeX));
248 cmd.Parameters.Add(m_database.CreateParameter("@sizeY", data.sizeY));
249 conn.Open();
250 try
251 {
252 if (cmd.ExecuteNonQuery() < 1)
253 {
254 string insert = "insert into [" + m_Realm + "] ([uuid], [ScopeID], [locX], [locY], [sizeX], [sizeY], [regionName], [" +
255 String.Join("], [", fields) +
256 "]) values (@regionID, @scopeID, @posX, @posY, @sizeX, @sizeY, @regionName, @" + String.Join(", @", fields) + ")";
257
258 cmd.CommandText = insert;
259
260 try
261 {
262 if (cmd.ExecuteNonQuery() < 1)
263 {
264 return false;
265 }
266 }
267 catch (Exception ex)
268 {
269 m_log.Warn("[MSSQL Grid]: Error inserting into Regions table: " + ex.Message + ", INSERT sql: " + insert);
270 }
271 }
272 }
273 catch (Exception ex)
274 {
275 m_log.Warn("[MSSQL Grid]: Error updating Regions table: " + ex.Message + ", UPDATE sql: " + update);
276 }
277 }
278
279 return true;
280 }
281
282 public bool SetDataItem(UUID regionID, string item, string value)
283 {
284 string sql = "update [" + m_Realm +
285 "] set [" + item + "] = @" + item + " where uuid = @UUID";
286 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
287 using (SqlCommand cmd = new SqlCommand(sql, conn))
288 {
289 cmd.Parameters.Add(m_database.CreateParameter("@" + item, value));
290 cmd.Parameters.Add(m_database.CreateParameter("@UUID", regionID));
291 conn.Open();
292 if (cmd.ExecuteNonQuery() > 0)
293 return true;
294 }
295 return false;
296 }
297
298 public bool Delete(UUID regionID)
299 {
300 string sql = "delete from [" + m_Realm +
301 "] where uuid = @UUID";
302 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
303 using (SqlCommand cmd = new SqlCommand(sql, conn))
304 {
305 cmd.Parameters.Add(m_database.CreateParameter("@UUID", regionID));
306 conn.Open();
307 if (cmd.ExecuteNonQuery() > 0)
308 return true;
309 }
310 return false;
311 }
312
313 public List<RegionData> GetDefaultRegions(UUID scopeID)
314 {
315 return Get((int)RegionFlags.DefaultRegion, scopeID);
316 }
317
318 public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
319 {
320 List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
321 RegionDataDistanceCompare distanceComparer = new RegionDataDistanceCompare(x, y);
322 regions.Sort(distanceComparer);
323
324 return regions;
325 }
326
327 public List<RegionData> GetHyperlinks(UUID scopeID)
328 {
329 return Get((int)RegionFlags.Hyperlink, scopeID);
330 }
331
332 private List<RegionData> Get(int regionFlags, UUID scopeID)
333 {
334 string sql = "SELECT * FROM [" + m_Realm + "] WHERE (flags & " + regionFlags.ToString() + ") <> 0";
335 if (scopeID != UUID.Zero)
336 sql += " AND ScopeID = @scopeID";
337
338 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
339 using (SqlCommand cmd = new SqlCommand(sql, conn))
340 {
341 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
342 conn.Open();
343 return RunCommand(cmd);
344 }
345 }
346 }
347}
diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
deleted file mode 100644
index 17f42e1..0000000
--- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs
+++ /dev/null
@@ -1,2219 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Data.SqlClient;
32using System.Drawing;
33using System.IO;
34using System.Reflection;
35using log4net;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40
41namespace OpenSim.Data.MSSQL
42{
43 /// <summary>
44 /// A MSSQL Interface for the Region Server.
45 /// </summary>
46 public class MSSQLSimulationData : ISimulationDataStore
47 {
48 private const string _migrationStore = "RegionStore";
49
50 // private static FileSystemDataStore Instance = new FileSystemDataStore();
51 private static readonly ILog _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52
53 /// <summary>
54 /// The database manager
55 /// </summary>
56 private MSSQLManager _Database;
57 private string m_connectionString;
58 protected virtual Assembly Assembly
59 {
60 get { return GetType().Assembly; }
61 }
62
63 public MSSQLSimulationData()
64 {
65 }
66
67 public MSSQLSimulationData(string connectionString)
68 {
69 Initialise(connectionString);
70 }
71
72 /// <summary>
73 /// Initialises the region datastore
74 /// </summary>
75 /// <param name="connectionString">The connection string.</param>
76 public void Initialise(string connectionString)
77 {
78 m_connectionString = connectionString;
79 _Database = new MSSQLManager(connectionString);
80
81 using (SqlConnection conn = new SqlConnection(connectionString))
82 {
83 conn.Open();
84 //New Migration settings
85 Migration m = new Migration(conn, Assembly, "RegionStore");
86 m.Update();
87 }
88 }
89
90 /// <summary>
91 /// Dispose the database
92 /// </summary>
93 public void Dispose() { }
94
95 #region SceneObjectGroup region for loading and Store of the scene.
96
97 /// <summary>
98 /// Loads the objects present in the region.
99 /// </summary>
100 /// <param name="regionUUID">The region UUID.</param>
101 /// <returns></returns>
102 public List<SceneObjectGroup> LoadObjects(UUID regionUUID)
103 {
104 UUID lastGroupID = UUID.Zero;
105
106 Dictionary<UUID, SceneObjectPart> prims = new Dictionary<UUID, SceneObjectPart>();
107 Dictionary<UUID, SceneObjectGroup> objects = new Dictionary<UUID, SceneObjectGroup>();
108 SceneObjectGroup grp = null;
109
110 string sql = "SELECT *, " +
111 "sort = CASE WHEN prims.UUID = prims.SceneGroupID THEN 0 ELSE 1 END " +
112 "FROM prims " +
113 "LEFT JOIN primshapes ON prims.UUID = primshapes.UUID " +
114 "WHERE RegionUUID = @RegionUUID " +
115 "ORDER BY SceneGroupID asc, sort asc, LinkNumber asc";
116
117 using (SqlConnection conn = new SqlConnection(m_connectionString))
118 using (SqlCommand command = new SqlCommand(sql, conn))
119 {
120 command.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID));
121 conn.Open();
122 using (SqlDataReader reader = command.ExecuteReader())
123 {
124 while (reader.Read())
125 {
126 SceneObjectPart sceneObjectPart = BuildPrim(reader);
127 if (reader["Shape"] is DBNull)
128 sceneObjectPart.Shape = PrimitiveBaseShape.Default;
129 else
130 sceneObjectPart.Shape = BuildShape(reader);
131
132 prims[sceneObjectPart.UUID] = sceneObjectPart;
133
134 UUID groupID = new UUID((Guid)reader["SceneGroupID"]);
135
136 if (groupID != lastGroupID) // New SOG
137 {
138 if (grp != null)
139 objects[grp.UUID] = grp;
140
141 lastGroupID = groupID;
142
143 // There sometimes exist OpenSim bugs that 'orphan groups' so that none of the prims are
144 // recorded as the root prim (for which the UUID must equal the persisted group UUID). In
145 // this case, force the UUID to be the same as the group UUID so that at least these can be
146 // deleted (we need to change the UUID so that any other prims in the linkset can also be
147 // deleted).
148 if (sceneObjectPart.UUID != groupID && groupID != UUID.Zero)
149 {
150 _Log.WarnFormat(
151 "[REGION DB]: Found root prim {0} {1} at {2} where group was actually {3}. Forcing UUID to group UUID",
152 sceneObjectPart.Name, sceneObjectPart.UUID, sceneObjectPart.GroupPosition, groupID);
153
154 sceneObjectPart.UUID = groupID;
155 }
156
157 grp = new SceneObjectGroup(sceneObjectPart);
158 }
159 else
160 {
161 // Black magic to preserve link numbers
162 // Why is this needed, fix this in AddPart method.
163 int link = sceneObjectPart.LinkNum;
164
165 grp.AddPart(sceneObjectPart);
166
167 if (link != 0)
168 sceneObjectPart.LinkNum = link;
169 }
170 }
171 }
172 }
173
174 if (grp != null)
175 objects[grp.UUID] = grp;
176
177 // Instead of attempting to LoadItems on every prim,
178 // most of which probably have no items... get a
179 // list from DB of all prims which have items and
180 // LoadItems only on those
181 List<SceneObjectPart> primsWithInventory = new List<SceneObjectPart>();
182 string qry = "select distinct primID from primitems";
183 using (SqlConnection conn = new SqlConnection(m_connectionString))
184 using (SqlCommand command = new SqlCommand(qry, conn))
185 {
186 conn.Open();
187 using (SqlDataReader itemReader = command.ExecuteReader())
188 {
189 while (itemReader.Read())
190 {
191 if (!(itemReader["primID"] is DBNull))
192 {
193 UUID primID = new UUID(itemReader["primID"].ToString());
194 if (prims.ContainsKey(primID))
195 {
196 primsWithInventory.Add(prims[primID]);
197 }
198 }
199 }
200 }
201 }
202
203 LoadItems(primsWithInventory);
204
205 _Log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", objects.Count, prims.Count);
206
207 return new List<SceneObjectGroup>(objects.Values);
208 }
209
210 /// <summary>
211 /// Load in the prim's persisted inventory.
212 /// </summary>
213 /// <param name="allPrims">all prims with inventory on a region</param>
214 private void LoadItems(List<SceneObjectPart> allPrimsWithInventory)
215 {
216 string sql = "SELECT * FROM primitems WHERE PrimID = @PrimID";
217 using (SqlConnection conn = new SqlConnection(m_connectionString))
218 using (SqlCommand command = new SqlCommand(sql, conn))
219 {
220 conn.Open();
221 foreach (SceneObjectPart objectPart in allPrimsWithInventory)
222 {
223 command.Parameters.Clear();
224 command.Parameters.Add(_Database.CreateParameter("@PrimID", objectPart.UUID));
225
226 List<TaskInventoryItem> inventory = new List<TaskInventoryItem>();
227
228 using (SqlDataReader reader = command.ExecuteReader())
229 {
230 while (reader.Read())
231 {
232 TaskInventoryItem item = BuildItem(reader);
233
234 item.ParentID = objectPart.UUID; // Values in database are
235 // often wrong
236 inventory.Add(item);
237 }
238 }
239
240 objectPart.Inventory.RestoreInventoryItems(inventory);
241 }
242 }
243 }
244
245 /// <summary>
246 /// Stores all object's details apart from inventory
247 /// </summary>
248 /// <param name="obj"></param>
249 /// <param name="regionUUID"></param>
250 public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
251 {
252 uint flags = obj.RootPart.GetEffectiveObjectFlags();
253 // Eligibility check
254 //
255 if ((flags & (uint)PrimFlags.Temporary) != 0)
256 return;
257 if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0)
258 return;
259
260 _Log.DebugFormat("[MSSQL]: Adding/Changing SceneObjectGroup: {0} to region: {1}, object has {2} prims.", obj.UUID, regionUUID, obj.Parts.Length);
261
262 using (SqlConnection conn = new SqlConnection(m_connectionString))
263 {
264 conn.Open();
265 SqlTransaction transaction = conn.BeginTransaction();
266
267 try
268 {
269 foreach (SceneObjectPart sceneObjectPart in obj.Parts)
270 {
271 //Update prim
272 using (SqlCommand sqlCommand = conn.CreateCommand())
273 {
274 sqlCommand.Transaction = transaction;
275 try
276 {
277 StoreSceneObjectPrim(sceneObjectPart, sqlCommand, obj.UUID, regionUUID);
278 }
279 catch (SqlException sqlEx)
280 {
281 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrim SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber);
282 throw;
283 }
284 }
285
286 //Update primshapes
287 using (SqlCommand sqlCommand = conn.CreateCommand())
288 {
289 sqlCommand.Transaction = transaction;
290 try
291 {
292 StoreSceneObjectPrimShapes(sceneObjectPart, sqlCommand, obj.UUID, regionUUID);
293 }
294 catch (SqlException sqlEx)
295 {
296 _Log.ErrorFormat("[REGION DB]: Store SceneObjectPrimShapes SQL error: {0} at line {1}", sqlEx.Message, sqlEx.LineNumber);
297 throw;
298 }
299 }
300 }
301
302 transaction.Commit();
303 }
304 catch (Exception ex)
305 {
306 _Log.ErrorFormat("[REGION DB]: Store SceneObjectGroup error: {0}, Rolling back...", ex.Message);
307 try
308 {
309 transaction.Rollback();
310 }
311 catch (Exception ex2)
312 {
313 //Show error
314 _Log.InfoFormat("[REGION DB]: Rollback of SceneObjectGroup store transaction failed with error: {0}", ex2.Message);
315
316 }
317 }
318 }
319 }
320
321 /// <summary>
322 /// Stores the prim of the sceneobjectpart.
323 /// </summary>
324 /// <param name="sceneObjectPart">The sceneobjectpart or prim.</param>
325 /// <param name="sqlCommand">The SQL command with the transaction.</param>
326 /// <param name="sceneGroupID">The scenegroup UUID.</param>
327 /// <param name="regionUUID">The region UUID.</param>
328 private void StoreSceneObjectPrim(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID)
329 {
330 //Big query to update or insert a new prim.
331 //Note for SQL Server 2008 this could be simplified
332 string queryPrims = @"
333IF EXISTS (SELECT UUID FROM prims WHERE UUID = @UUID)
334 BEGIN
335 UPDATE prims SET
336 CreationDate = @CreationDate, Name = @Name, Text = @Text, Description = @Description, SitName = @SitName,
337 TouchName = @TouchName, ObjectFlags = @ObjectFlags, OwnerMask = @OwnerMask, NextOwnerMask = @NextOwnerMask, GroupMask = @GroupMask,
338 EveryoneMask = @EveryoneMask, BaseMask = @BaseMask, PositionX = @PositionX, PositionY = @PositionY, PositionZ = @PositionZ,
339 GroupPositionX = @GroupPositionX, GroupPositionY = @GroupPositionY, GroupPositionZ = @GroupPositionZ, VelocityX = @VelocityX,
340 VelocityY = @VelocityY, VelocityZ = @VelocityZ, AngularVelocityX = @AngularVelocityX, AngularVelocityY = @AngularVelocityY,
341 AngularVelocityZ = @AngularVelocityZ, AccelerationX = @AccelerationX, AccelerationY = @AccelerationY,
342 AccelerationZ = @AccelerationZ, RotationX = @RotationX, RotationY = @RotationY, RotationZ = @RotationZ, RotationW = @RotationW,
343 SitTargetOffsetX = @SitTargetOffsetX, SitTargetOffsetY = @SitTargetOffsetY, SitTargetOffsetZ = @SitTargetOffsetZ,
344 SitTargetOrientW = @SitTargetOrientW, SitTargetOrientX = @SitTargetOrientX, SitTargetOrientY = @SitTargetOrientY,
345 SitTargetOrientZ = @SitTargetOrientZ, RegionUUID = @RegionUUID, CreatorID = @CreatorID, OwnerID = @OwnerID, GroupID = @GroupID,
346 LastOwnerID = @LastOwnerID, SceneGroupID = @SceneGroupID, PayPrice = @PayPrice, PayButton1 = @PayButton1, PayButton2 = @PayButton2,
347 PayButton3 = @PayButton3, PayButton4 = @PayButton4, LoopedSound = @LoopedSound, LoopedSoundGain = @LoopedSoundGain,
348 TextureAnimation = @TextureAnimation, OmegaX = @OmegaX, OmegaY = @OmegaY, OmegaZ = @OmegaZ, CameraEyeOffsetX = @CameraEyeOffsetX,
349 CameraEyeOffsetY = @CameraEyeOffsetY, CameraEyeOffsetZ = @CameraEyeOffsetZ, CameraAtOffsetX = @CameraAtOffsetX,
350 CameraAtOffsetY = @CameraAtOffsetY, CameraAtOffsetZ = @CameraAtOffsetZ, ForceMouselook = @ForceMouselook,
351 ScriptAccessPin = @ScriptAccessPin, AllowedDrop = @AllowedDrop, DieAtEdge = @DieAtEdge, SalePrice = @SalePrice,
352 SaleType = @SaleType, ColorR = @ColorR, ColorG = @ColorG, ColorB = @ColorB, ColorA = @ColorA, ParticleSystem = @ParticleSystem,
353 ClickAction = @ClickAction, Material = @Material, CollisionSound = @CollisionSound, CollisionSoundVolume = @CollisionSoundVolume, PassTouches = @PassTouches,
354 LinkNumber = @LinkNumber, MediaURL = @MediaURL
355 WHERE UUID = @UUID
356 END
357ELSE
358 BEGIN
359 INSERT INTO
360 prims (
361 UUID, CreationDate, Name, Text, Description, SitName, TouchName, ObjectFlags, OwnerMask, NextOwnerMask, GroupMask,
362 EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX,
363 VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ,
364 RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW,
365 SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, RegionUUID, CreatorID, OwnerID, GroupID, LastOwnerID, SceneGroupID,
366 PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX,
367 OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ,
368 ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA,
369 ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, PassTouches, LinkNumber, MediaURL
370 ) VALUES (
371 @UUID, @CreationDate, @Name, @Text, @Description, @SitName, @TouchName, @ObjectFlags, @OwnerMask, @NextOwnerMask, @GroupMask,
372 @EveryoneMask, @BaseMask, @PositionX, @PositionY, @PositionZ, @GroupPositionX, @GroupPositionY, @GroupPositionZ, @VelocityX,
373 @VelocityY, @VelocityZ, @AngularVelocityX, @AngularVelocityY, @AngularVelocityZ, @AccelerationX, @AccelerationY, @AccelerationZ,
374 @RotationX, @RotationY, @RotationZ, @RotationW, @SitTargetOffsetX, @SitTargetOffsetY, @SitTargetOffsetZ, @SitTargetOrientW,
375 @SitTargetOrientX, @SitTargetOrientY, @SitTargetOrientZ, @RegionUUID, @CreatorID, @OwnerID, @GroupID, @LastOwnerID, @SceneGroupID,
376 @PayPrice, @PayButton1, @PayButton2, @PayButton3, @PayButton4, @LoopedSound, @LoopedSoundGain, @TextureAnimation, @OmegaX,
377 @OmegaY, @OmegaZ, @CameraEyeOffsetX, @CameraEyeOffsetY, @CameraEyeOffsetZ, @CameraAtOffsetX, @CameraAtOffsetY, @CameraAtOffsetZ,
378 @ForceMouselook, @ScriptAccessPin, @AllowedDrop, @DieAtEdge, @SalePrice, @SaleType, @ColorR, @ColorG, @ColorB, @ColorA,
379 @ParticleSystem, @ClickAction, @Material, @CollisionSound, @CollisionSoundVolume, @PassTouches, @LinkNumber, @MediaURL
380 )
381 END";
382
383 //Set commandtext.
384 sqlCommand.CommandText = queryPrims;
385 //Add parameters
386 sqlCommand.Parameters.AddRange(CreatePrimParameters(sceneObjectPart, sceneGroupID, regionUUID));
387
388 //Execute the query. If it fails then error is trapped in calling function
389 sqlCommand.ExecuteNonQuery();
390 }
391
392 /// <summary>
393 /// Stores the scene object prim shapes.
394 /// </summary>
395 /// <param name="sceneObjectPart">The sceneobjectpart containing prim shape.</param>
396 /// <param name="sqlCommand">The SQL command with the transaction.</param>
397 /// <param name="sceneGroupID">The scenegroup UUID.</param>
398 /// <param name="regionUUID">The region UUID.</param>
399 private void StoreSceneObjectPrimShapes(SceneObjectPart sceneObjectPart, SqlCommand sqlCommand, UUID sceneGroupID, UUID regionUUID)
400 {
401 //Big query to or insert or update primshapes
402 //Note for SQL Server 2008 this can be simplified
403 string queryPrimShapes = @"
404IF EXISTS (SELECT UUID FROM primshapes WHERE UUID = @UUID)
405 BEGIN
406 UPDATE primshapes SET
407 Shape = @Shape, ScaleX = @ScaleX, ScaleY = @ScaleY, ScaleZ = @ScaleZ, PCode = @PCode, PathBegin = @PathBegin,
408 PathEnd = @PathEnd, PathScaleX = @PathScaleX, PathScaleY = @PathScaleY, PathShearX = @PathShearX, PathShearY = @PathShearY,
409 PathSkew = @PathSkew, PathCurve = @PathCurve, PathRadiusOffset = @PathRadiusOffset, PathRevolutions = @PathRevolutions,
410 PathTaperX = @PathTaperX, PathTaperY = @PathTaperY, PathTwist = @PathTwist, PathTwistBegin = @PathTwistBegin,
411 ProfileBegin = @ProfileBegin, ProfileEnd = @ProfileEnd, ProfileCurve = @ProfileCurve, ProfileHollow = @ProfileHollow,
412 Texture = @Texture, ExtraParams = @ExtraParams, State = @State, Media = @Media
413 WHERE UUID = @UUID
414 END
415ELSE
416 BEGIN
417 INSERT INTO
418 primshapes (
419 UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY,
420 PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin,
421 ProfileEnd, ProfileCurve, ProfileHollow, Texture, ExtraParams, State, Media
422 ) VALUES (
423 @UUID, @Shape, @ScaleX, @ScaleY, @ScaleZ, @PCode, @PathBegin, @PathEnd, @PathScaleX, @PathScaleY, @PathShearX, @PathShearY,
424 @PathSkew, @PathCurve, @PathRadiusOffset, @PathRevolutions, @PathTaperX, @PathTaperY, @PathTwist, @PathTwistBegin, @ProfileBegin,
425 @ProfileEnd, @ProfileCurve, @ProfileHollow, @Texture, @ExtraParams, @State, @Media
426 )
427 END";
428
429 //Set commandtext.
430 sqlCommand.CommandText = queryPrimShapes;
431
432 //Add parameters
433 sqlCommand.Parameters.AddRange(CreatePrimShapeParameters(sceneObjectPart, sceneGroupID, regionUUID));
434
435 //Execute the query. If it fails then error is trapped in calling function
436 sqlCommand.ExecuteNonQuery();
437
438 }
439
440 /// <summary>
441 /// Removes a object from the database.
442 /// Meaning removing it from tables Prims, PrimShapes and PrimItems
443 /// </summary>
444 /// <param name="objectID">id of scenegroup</param>
445 /// <param name="regionUUID">regionUUID (is this used anyway</param>
446 public void RemoveObject(UUID objectID, UUID regionUUID)
447 {
448 _Log.InfoFormat("[MSSQL]: Removing obj: {0} from region: {1}", objectID, regionUUID);
449
450 //Remove from prims and primsitem table
451 string sqlPrims = "DELETE FROM PRIMS WHERE SceneGroupID = @objectID";
452 string sqlPrimItems = "DELETE FROM PRIMITEMS WHERE primID in (SELECT UUID FROM PRIMS WHERE SceneGroupID = @objectID)";
453 string sqlPrimShapes = "DELETE FROM PRIMSHAPES WHERE uuid in (SELECT UUID FROM PRIMS WHERE SceneGroupID = @objectID)";
454
455 lock (_Database)
456 {
457 //Using the non transaction mode.
458 using (SqlConnection conn = new SqlConnection(m_connectionString))
459 using (SqlCommand cmd = new SqlCommand())
460 {
461 cmd.Connection = conn;
462 cmd.CommandText = sqlPrimShapes;
463 conn.Open();
464 cmd.Parameters.Add(_Database.CreateParameter("objectID", objectID));
465 cmd.ExecuteNonQuery();
466
467 cmd.CommandText = sqlPrimItems;
468 cmd.ExecuteNonQuery();
469
470 cmd.CommandText = sqlPrims;
471 cmd.ExecuteNonQuery();
472 }
473 }
474 }
475
476 /// <summary>
477 /// Store the inventory of a prim. Warning deletes everything first and then adds all again.
478 /// </summary>
479 /// <param name="primID"></param>
480 /// <param name="items"></param>
481 public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items)
482 {
483 //_Log.InfoFormat("[REGION DB: Persisting Prim Inventory with prim ID {0}", primID);
484
485 //Statement from MySQL section!
486 // For now, we're just going to crudely remove all the previous inventory items
487 // no matter whether they have changed or not, and replace them with the current set.
488
489 //Delete everything from PrimID
490 //TODO add index on PrimID in DB, if not already exist
491
492 string sql = "DELETE PRIMITEMS WHERE primID = @primID";
493 using (SqlConnection conn = new SqlConnection(m_connectionString))
494 using (SqlCommand cmd = new SqlCommand(sql, conn))
495 {
496 cmd.Parameters.Add(_Database.CreateParameter("@primID", primID));
497 conn.Open();
498 cmd.ExecuteNonQuery();
499 }
500
501 sql =
502 @"INSERT INTO primitems (
503 itemID,primID,assetID,parentFolderID,invType,assetType,name,description,creationDate,creatorID,ownerID,lastOwnerID,groupID,
504 nextPermissions,currentPermissions,basePermissions,everyonePermissions,groupPermissions,flags)
505 VALUES (@itemID,@primID,@assetID,@parentFolderID,@invType,@assetType,@name,@description,@creationDate,@creatorID,@ownerID,
506 @lastOwnerID,@groupID,@nextPermissions,@currentPermissions,@basePermissions,@everyonePermissions,@groupPermissions,@flags)";
507
508 using (SqlConnection conn = new SqlConnection(m_connectionString))
509 using (SqlCommand cmd = new SqlCommand(sql, conn))
510 {
511 conn.Open();
512 foreach (TaskInventoryItem taskItem in items)
513 {
514 cmd.Parameters.AddRange(CreatePrimInventoryParameters(taskItem));
515 cmd.ExecuteNonQuery();
516 cmd.Parameters.Clear();
517 }
518 }
519 }
520
521 #endregion
522
523 /// <summary>
524 /// Loads the terrain map.
525 /// </summary>
526 /// <param name="regionID">regionID.</param>
527 /// <returns></returns>
528 public double[,] LoadTerrain(UUID regionID)
529 {
530 double[,] terrain = new double[(int)Constants.RegionSize, (int)Constants.RegionSize];
531 terrain.Initialize();
532
533 string sql = "select top 1 RegionUUID, Revision, Heightfield from terrain where RegionUUID = @RegionUUID order by Revision desc";
534
535 using (SqlConnection conn = new SqlConnection(m_connectionString))
536 using (SqlCommand cmd = new SqlCommand(sql, conn))
537 {
538 // MySqlParameter param = new MySqlParameter();
539 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
540 conn.Open();
541 using (SqlDataReader reader = cmd.ExecuteReader())
542 {
543 int rev;
544 if (reader.Read())
545 {
546 MemoryStream str = new MemoryStream((byte[])reader["Heightfield"]);
547 BinaryReader br = new BinaryReader(str);
548 for (int x = 0; x < (int)Constants.RegionSize; x++)
549 {
550 for (int y = 0; y < (int)Constants.RegionSize; y++)
551 {
552 terrain[x, y] = br.ReadDouble();
553 }
554 }
555 rev = (int)reader["Revision"];
556 }
557 else
558 {
559 _Log.Info("[REGION DB]: No terrain found for region");
560 return null;
561 }
562 _Log.Info("[REGION DB]: Loaded terrain revision r" + rev);
563 }
564 }
565
566 return terrain;
567 }
568
569 /// <summary>
570 /// Stores the terrain map to DB.
571 /// </summary>
572 /// <param name="terrain">terrain map data.</param>
573 /// <param name="regionID">regionID.</param>
574 public void StoreTerrain(double[,] terrain, UUID regionID)
575 {
576 int revision = Util.UnixTimeSinceEpoch();
577
578 //Delete old terrain map
579 string sql = "delete from terrain where RegionUUID=@RegionUUID";
580 using (SqlConnection conn = new SqlConnection(m_connectionString))
581 using (SqlCommand cmd = new SqlCommand(sql, conn))
582 {
583 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
584 conn.Open();
585 cmd.ExecuteNonQuery();
586 }
587
588 sql = "insert into terrain(RegionUUID, Revision, Heightfield) values(@RegionUUID, @Revision, @Heightfield)";
589
590 using (SqlConnection conn = new SqlConnection(m_connectionString))
591 using (SqlCommand cmd = new SqlCommand(sql, conn))
592 {
593 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
594 cmd.Parameters.Add(_Database.CreateParameter("@Revision", revision));
595 cmd.Parameters.Add(_Database.CreateParameter("@Heightfield", serializeTerrain(terrain)));
596 conn.Open();
597 cmd.ExecuteNonQuery();
598 }
599
600 _Log.Info("[REGION DB]: Stored terrain revision r " + revision);
601 }
602
603 /// <summary>
604 /// Loads all the land objects of a region.
605 /// </summary>
606 /// <param name="regionUUID">The region UUID.</param>
607 /// <returns></returns>
608 public List<LandData> LoadLandObjects(UUID regionUUID)
609 {
610 List<LandData> LandDataForRegion = new List<LandData>();
611
612 string sql = "select * from land where RegionUUID = @RegionUUID";
613
614 //Retrieve all land data from region
615 using (SqlConnection conn = new SqlConnection(m_connectionString))
616 using (SqlCommand cmd = new SqlCommand(sql, conn))
617 {
618 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionUUID));
619 conn.Open();
620 using (SqlDataReader readerLandData = cmd.ExecuteReader())
621 {
622 while (readerLandData.Read())
623 {
624 LandDataForRegion.Add(BuildLandData(readerLandData));
625 }
626 }
627 }
628
629 //Retrieve all accesslist data for all landdata
630 foreach (LandData LandData in LandDataForRegion)
631 {
632 sql = "select * from landaccesslist where LandUUID = @LandUUID";
633 using (SqlConnection conn = new SqlConnection(m_connectionString))
634 using (SqlCommand cmd = new SqlCommand(sql, conn))
635 {
636 cmd.Parameters.Add(_Database.CreateParameter("@LandUUID", LandData.GlobalID));
637 conn.Open();
638 using (SqlDataReader readerAccessList = cmd.ExecuteReader())
639 {
640 while (readerAccessList.Read())
641 {
642 LandData.ParcelAccessList.Add(BuildLandAccessData(readerAccessList));
643 }
644 }
645 }
646 }
647
648 //Return data
649 return LandDataForRegion;
650 }
651
652 /// <summary>
653 /// Stores land object with landaccess list.
654 /// </summary>
655 /// <param name="parcel">parcel data.</param>
656 public void StoreLandObject(ILandObject parcel)
657 {
658 //As this is only one record in land table I just delete all and then add a new record.
659 //As the delete landaccess is already in the mysql code
660
661 //Delete old values
662 RemoveLandObject(parcel.LandData.GlobalID);
663
664 //Insert new values
665 string sql = @"INSERT INTO [land]
666([UUID],[RegionUUID],[LocalLandID],[Bitmap],[Name],[Description],[OwnerUUID],[IsGroupOwned],[Area],[AuctionID],[Category],[ClaimDate],[ClaimPrice],[GroupUUID],[SalePrice],[LandStatus],[LandFlags],[LandingType],[MediaAutoScale],[MediaTextureUUID],[MediaURL],[MusicURL],[PassHours],[PassPrice],[SnapshotUUID],[UserLocationX],[UserLocationY],[UserLocationZ],[UserLookAtX],[UserLookAtY],[UserLookAtZ],[AuthbuyerID],[OtherCleanTime])
667VALUES
668(@UUID,@RegionUUID,@LocalLandID,@Bitmap,@Name,@Description,@OwnerUUID,@IsGroupOwned,@Area,@AuctionID,@Category,@ClaimDate,@ClaimPrice,@GroupUUID,@SalePrice,@LandStatus,@LandFlags,@LandingType,@MediaAutoScale,@MediaTextureUUID,@MediaURL,@MusicURL,@PassHours,@PassPrice,@SnapshotUUID,@UserLocationX,@UserLocationY,@UserLocationZ,@UserLookAtX,@UserLookAtY,@UserLookAtZ,@AuthbuyerID,@OtherCleanTime)";
669
670 using (SqlConnection conn = new SqlConnection(m_connectionString))
671 using (SqlCommand cmd = new SqlCommand(sql, conn))
672 {
673 cmd.Parameters.AddRange(CreateLandParameters(parcel.LandData, parcel.RegionUUID));
674 conn.Open();
675 cmd.ExecuteNonQuery();
676 }
677
678 sql = "INSERT INTO [landaccesslist] ([LandUUID],[AccessUUID],[Flags],[Expires]) VALUES (@LandUUID,@AccessUUID,@Flags,@Expires)";
679
680 using (SqlConnection conn = new SqlConnection(m_connectionString))
681 using (SqlCommand cmd = new SqlCommand(sql, conn))
682 {
683 conn.Open();
684 foreach (LandAccessEntry parcelAccessEntry in parcel.LandData.ParcelAccessList)
685 {
686 cmd.Parameters.AddRange(CreateLandAccessParameters(parcelAccessEntry, parcel.RegionUUID));
687
688 cmd.ExecuteNonQuery();
689 cmd.Parameters.Clear();
690 }
691 }
692 }
693
694 /// <summary>
695 /// Removes a land object from DB.
696 /// </summary>
697 /// <param name="globalID">UUID of landobject</param>
698 public void RemoveLandObject(UUID globalID)
699 {
700 string sql = "delete from land where UUID=@UUID";
701 using (SqlConnection conn = new SqlConnection(m_connectionString))
702 using (SqlCommand cmd = new SqlCommand(sql, conn))
703 {
704 cmd.Parameters.Add(_Database.CreateParameter("@UUID", globalID));
705 conn.Open();
706 cmd.ExecuteNonQuery();
707 }
708 sql = "delete from landaccesslist where LandUUID=@UUID";
709 using (SqlConnection conn = new SqlConnection(m_connectionString))
710 using (SqlCommand cmd = new SqlCommand(sql, conn))
711 {
712 cmd.Parameters.Add(_Database.CreateParameter("@UUID", globalID));
713 conn.Open();
714 cmd.ExecuteNonQuery();
715 }
716 }
717 public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
718 {
719 RegionLightShareData nWP = new RegionLightShareData();
720 nWP.OnSave += StoreRegionWindlightSettings;
721 string sql = "select * from [regionwindlight] where region_id = @regionID";
722 using (SqlConnection conn = new SqlConnection(m_connectionString))
723 using (SqlCommand cmd = new SqlCommand(sql, conn))
724 {
725 cmd.Parameters.Add(_Database.CreateParameter("@regionID", regionUUID));
726 conn.Open();
727 using (SqlDataReader result = cmd.ExecuteReader())
728 {
729 if (!result.Read())
730 {
731 //No result, so store our default windlight profile and return it
732 nWP.regionID = regionUUID;
733 StoreRegionWindlightSettings(nWP);
734 return nWP;
735 }
736 else
737 {
738 nWP.regionID = DBGuid.FromDB(result["region_id"]);
739 nWP.waterColor.X = Convert.ToSingle(result["water_color_r"]);
740 nWP.waterColor.Y = Convert.ToSingle(result["water_color_g"]);
741 nWP.waterColor.Z = Convert.ToSingle(result["water_color_b"]);
742 nWP.waterFogDensityExponent = Convert.ToSingle(result["water_fog_density_exponent"]);
743 nWP.underwaterFogModifier = Convert.ToSingle(result["underwater_fog_modifier"]);
744 nWP.reflectionWaveletScale.X = Convert.ToSingle(result["reflection_wavelet_scale_1"]);
745 nWP.reflectionWaveletScale.Y = Convert.ToSingle(result["reflection_wavelet_scale_2"]);
746 nWP.reflectionWaveletScale.Z = Convert.ToSingle(result["reflection_wavelet_scale_3"]);
747 nWP.fresnelScale = Convert.ToSingle(result["fresnel_scale"]);
748 nWP.fresnelOffset = Convert.ToSingle(result["fresnel_offset"]);
749 nWP.refractScaleAbove = Convert.ToSingle(result["refract_scale_above"]);
750 nWP.refractScaleBelow = Convert.ToSingle(result["refract_scale_below"]);
751 nWP.blurMultiplier = Convert.ToSingle(result["blur_multiplier"]);
752 nWP.bigWaveDirection.X = Convert.ToSingle(result["big_wave_direction_x"]);
753 nWP.bigWaveDirection.Y = Convert.ToSingle(result["big_wave_direction_y"]);
754 nWP.littleWaveDirection.X = Convert.ToSingle(result["little_wave_direction_x"]);
755 nWP.littleWaveDirection.Y = Convert.ToSingle(result["little_wave_direction_y"]);
756 UUID.TryParse(result["normal_map_texture"].ToString(), out nWP.normalMapTexture);
757 nWP.horizon.X = Convert.ToSingle(result["horizon_r"]);
758 nWP.horizon.Y = Convert.ToSingle(result["horizon_g"]);
759 nWP.horizon.Z = Convert.ToSingle(result["horizon_b"]);
760 nWP.horizon.W = Convert.ToSingle(result["horizon_i"]);
761 nWP.hazeHorizon = Convert.ToSingle(result["haze_horizon"]);
762 nWP.blueDensity.X = Convert.ToSingle(result["blue_density_r"]);
763 nWP.blueDensity.Y = Convert.ToSingle(result["blue_density_g"]);
764 nWP.blueDensity.Z = Convert.ToSingle(result["blue_density_b"]);
765 nWP.blueDensity.W = Convert.ToSingle(result["blue_density_i"]);
766 nWP.hazeDensity = Convert.ToSingle(result["haze_density"]);
767 nWP.densityMultiplier = Convert.ToSingle(result["density_multiplier"]);
768 nWP.distanceMultiplier = Convert.ToSingle(result["distance_multiplier"]);
769 nWP.maxAltitude = Convert.ToUInt16(result["max_altitude"]);
770 nWP.sunMoonColor.X = Convert.ToSingle(result["sun_moon_color_r"]);
771 nWP.sunMoonColor.Y = Convert.ToSingle(result["sun_moon_color_g"]);
772 nWP.sunMoonColor.Z = Convert.ToSingle(result["sun_moon_color_b"]);
773 nWP.sunMoonColor.W = Convert.ToSingle(result["sun_moon_color_i"]);
774 nWP.sunMoonPosition = Convert.ToSingle(result["sun_moon_position"]);
775 nWP.ambient.X = Convert.ToSingle(result["ambient_r"]);
776 nWP.ambient.Y = Convert.ToSingle(result["ambient_g"]);
777 nWP.ambient.Z = Convert.ToSingle(result["ambient_b"]);
778 nWP.ambient.W = Convert.ToSingle(result["ambient_i"]);
779 nWP.eastAngle = Convert.ToSingle(result["east_angle"]);
780 nWP.sunGlowFocus = Convert.ToSingle(result["sun_glow_focus"]);
781 nWP.sunGlowSize = Convert.ToSingle(result["sun_glow_size"]);
782 nWP.sceneGamma = Convert.ToSingle(result["scene_gamma"]);
783 nWP.starBrightness = Convert.ToSingle(result["star_brightness"]);
784 nWP.cloudColor.X = Convert.ToSingle(result["cloud_color_r"]);
785 nWP.cloudColor.Y = Convert.ToSingle(result["cloud_color_g"]);
786 nWP.cloudColor.Z = Convert.ToSingle(result["cloud_color_b"]);
787 nWP.cloudColor.W = Convert.ToSingle(result["cloud_color_i"]);
788 nWP.cloudXYDensity.X = Convert.ToSingle(result["cloud_x"]);
789 nWP.cloudXYDensity.Y = Convert.ToSingle(result["cloud_y"]);
790 nWP.cloudXYDensity.Z = Convert.ToSingle(result["cloud_density"]);
791 nWP.cloudCoverage = Convert.ToSingle(result["cloud_coverage"]);
792 nWP.cloudScale = Convert.ToSingle(result["cloud_scale"]);
793 nWP.cloudDetailXYDensity.X = Convert.ToSingle(result["cloud_detail_x"]);
794 nWP.cloudDetailXYDensity.Y = Convert.ToSingle(result["cloud_detail_y"]);
795 nWP.cloudDetailXYDensity.Z = Convert.ToSingle(result["cloud_detail_density"]);
796 nWP.cloudScrollX = Convert.ToSingle(result["cloud_scroll_x"]);
797 nWP.cloudScrollXLock = Convert.ToBoolean(result["cloud_scroll_x_lock"]);
798 nWP.cloudScrollY = Convert.ToSingle(result["cloud_scroll_y"]);
799 nWP.cloudScrollYLock = Convert.ToBoolean(result["cloud_scroll_y_lock"]);
800 nWP.drawClassicClouds = Convert.ToBoolean(result["draw_classic_clouds"]);
801 nWP.valid = true;
802 }
803 }
804 }
805 return nWP;
806 }
807
808 public void RemoveRegionWindlightSettings(UUID regionID)
809 {
810 string sql = "delete from [regionwindlight] where region_id = @region_id";
811 using (SqlConnection conn = new SqlConnection(m_connectionString))
812 using (SqlCommand cmd = new SqlCommand(sql, conn))
813 {
814 conn.Open();
815 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionID));
816 cmd.ExecuteNonQuery();
817 }
818 }
819
820 public void StoreRegionWindlightSettings(RegionLightShareData wl)
821 {
822 string sql = "select count (region_id) from regionwindlight where region_id = @region_id";
823 bool exists = false;
824 using (SqlConnection conn = new SqlConnection(m_connectionString))
825 {
826 conn.Open();
827 using (SqlCommand cmd = new SqlCommand(sql, conn))
828 {
829 cmd.Parameters.Add(_Database.CreateParameter("@region_id", wl.regionID));
830 exists = (int)cmd.ExecuteScalar() > 0;
831 }
832 }
833 if (exists)
834 {
835 RemoveRegionWindlightSettings(wl.regionID);
836 }
837
838 // sql insert
839 sql = @"INSERT INTO [regionwindlight]
840 ([region_id]
841 ,[water_color_r]
842 ,[water_color_g]
843 ,[water_color_b]
844 ,[water_fog_density_exponent]
845 ,[underwater_fog_modifier]
846 ,[reflection_wavelet_scale_1]
847 ,[reflection_wavelet_scale_2]
848 ,[reflection_wavelet_scale_3]
849 ,[fresnel_scale]
850 ,[fresnel_offset]
851 ,[refract_scale_above]
852 ,[refract_scale_below]
853 ,[blur_multiplier]
854 ,[big_wave_direction_x]
855 ,[big_wave_direction_y]
856 ,[little_wave_direction_x]
857 ,[little_wave_direction_y]
858 ,[normal_map_texture]
859 ,[horizon_r]
860 ,[horizon_g]
861 ,[horizon_b]
862 ,[horizon_i]
863 ,[haze_horizon]
864 ,[blue_density_r]
865 ,[blue_density_g]
866 ,[blue_density_b]
867 ,[blue_density_i]
868 ,[haze_density]
869 ,[density_multiplier]
870 ,[distance_multiplier]
871 ,[max_altitude]
872 ,[sun_moon_color_r]
873 ,[sun_moon_color_g]
874 ,[sun_moon_color_b]
875 ,[sun_moon_color_i]
876 ,[sun_moon_position]
877 ,[ambient_r]
878 ,[ambient_g]
879 ,[ambient_b]
880 ,[ambient_i]
881 ,[east_angle]
882 ,[sun_glow_focus]
883 ,[sun_glow_size]
884 ,[scene_gamma]
885 ,[star_brightness]
886 ,[cloud_color_r]
887 ,[cloud_color_g]
888 ,[cloud_color_b]
889 ,[cloud_color_i]
890 ,[cloud_x]
891 ,[cloud_y]
892 ,[cloud_density]
893 ,[cloud_coverage]
894 ,[cloud_scale]
895 ,[cloud_detail_x]
896 ,[cloud_detail_y]
897 ,[cloud_detail_density]
898 ,[cloud_scroll_x]
899 ,[cloud_scroll_x_lock]
900 ,[cloud_scroll_y]
901 ,[cloud_scroll_y_lock]
902 ,[draw_classic_clouds])
903 VALUES
904 (@region_id
905 ,@water_color_r
906 ,@water_color_g
907 ,@water_color_b
908 ,@water_fog_density_exponent
909 ,@underwater_fog_modifier
910 ,@reflection_wavelet_scale_1
911 ,@reflection_wavelet_scale_2
912 ,@reflection_wavelet_scale_3
913 ,@fresnel_scale
914 ,@fresnel_offset
915 ,@refract_scale_above
916 ,@refract_scale_below
917 ,@blur_multiplier
918 ,@big_wave_direction_x
919 ,@big_wave_direction_y
920 ,@little_wave_direction_x
921 ,@little_wave_direction_y
922 ,@normal_map_texture
923 ,@horizon_r
924 ,@horizon_g
925 ,@horizon_b
926 ,@horizon_i
927 ,@haze_horizon
928 ,@blue_density_r
929 ,@blue_density_g
930 ,@blue_density_b
931 ,@blue_density_i
932 ,@haze_density
933 ,@density_multiplier
934 ,@distance_multiplier
935 ,@max_altitude
936 ,@sun_moon_color_r
937 ,@sun_moon_color_g
938 ,@sun_moon_color_b
939 ,@sun_moon_color_i
940 ,@sun_moon_position
941 ,@ambient_r
942 ,@ambient_g
943 ,@ambient_b
944 ,@ambient_i
945 ,@east_angle
946 ,@sun_glow_focus
947 ,@sun_glow_size
948 ,@scene_gamma
949 ,@star_brightness
950 ,@cloud_color_r
951 ,@cloud_color_g
952 ,@cloud_color_b
953 ,@cloud_color_i
954 ,@cloud_x
955 ,@cloud_y
956 ,@cloud_density
957 ,@cloud_coverage
958 ,@cloud_scale
959 ,@cloud_detail_x
960 ,@cloud_detail_y
961 ,@cloud_detail_density
962 ,@cloud_scroll_x
963 ,@cloud_scroll_x_lock
964 ,@cloud_scroll_y
965 ,@cloud_scroll_y_lock
966 ,@draw_classic_clouds)";
967 using (SqlConnection conn = new SqlConnection(m_connectionString))
968 {
969 conn.Open();
970 using (SqlCommand cmd = new SqlCommand(sql, conn))
971 {
972 cmd.Parameters.Add(_Database.CreateParameter("region_id", wl.regionID));
973 cmd.Parameters.Add(_Database.CreateParameter("water_color_r", wl.waterColor.X));
974 cmd.Parameters.Add(_Database.CreateParameter("water_color_g", wl.waterColor.Y));
975 cmd.Parameters.Add(_Database.CreateParameter("water_color_b", wl.waterColor.Z));
976 cmd.Parameters.Add(_Database.CreateParameter("water_fog_density_exponent", wl.waterFogDensityExponent));
977 cmd.Parameters.Add(_Database.CreateParameter("underwater_fog_modifier", wl.underwaterFogModifier));
978 cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_1", wl.reflectionWaveletScale.X));
979 cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_2", wl.reflectionWaveletScale.Y));
980 cmd.Parameters.Add(_Database.CreateParameter("reflection_wavelet_scale_3", wl.reflectionWaveletScale.Z));
981 cmd.Parameters.Add(_Database.CreateParameter("fresnel_scale", wl.fresnelScale));
982 cmd.Parameters.Add(_Database.CreateParameter("fresnel_offset", wl.fresnelOffset));
983 cmd.Parameters.Add(_Database.CreateParameter("refract_scale_above", wl.refractScaleAbove));
984 cmd.Parameters.Add(_Database.CreateParameter("refract_scale_below", wl.refractScaleBelow));
985 cmd.Parameters.Add(_Database.CreateParameter("blur_multiplier", wl.blurMultiplier));
986 cmd.Parameters.Add(_Database.CreateParameter("big_wave_direction_x", wl.bigWaveDirection.X));
987 cmd.Parameters.Add(_Database.CreateParameter("big_wave_direction_y", wl.bigWaveDirection.Y));
988 cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_x", wl.littleWaveDirection.X));
989 cmd.Parameters.Add(_Database.CreateParameter("little_wave_direction_y", wl.littleWaveDirection.Y));
990 cmd.Parameters.Add(_Database.CreateParameter("normal_map_texture", wl.normalMapTexture));
991 cmd.Parameters.Add(_Database.CreateParameter("horizon_r", wl.horizon.X));
992 cmd.Parameters.Add(_Database.CreateParameter("horizon_g", wl.horizon.Y));
993 cmd.Parameters.Add(_Database.CreateParameter("horizon_b", wl.horizon.Z));
994 cmd.Parameters.Add(_Database.CreateParameter("horizon_i", wl.horizon.W));
995 cmd.Parameters.Add(_Database.CreateParameter("haze_horizon", wl.hazeHorizon));
996 cmd.Parameters.Add(_Database.CreateParameter("blue_density_r", wl.blueDensity.X));
997 cmd.Parameters.Add(_Database.CreateParameter("blue_density_g", wl.blueDensity.Y));
998 cmd.Parameters.Add(_Database.CreateParameter("blue_density_b", wl.blueDensity.Z));
999 cmd.Parameters.Add(_Database.CreateParameter("blue_density_i", wl.blueDensity.W));
1000 cmd.Parameters.Add(_Database.CreateParameter("haze_density", wl.hazeDensity));
1001 cmd.Parameters.Add(_Database.CreateParameter("density_multiplier", wl.densityMultiplier));
1002 cmd.Parameters.Add(_Database.CreateParameter("distance_multiplier", wl.distanceMultiplier));
1003 cmd.Parameters.Add(_Database.CreateParameter("max_altitude", wl.maxAltitude));
1004 cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_r", wl.sunMoonColor.X));
1005 cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_g", wl.sunMoonColor.Y));
1006 cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_b", wl.sunMoonColor.Z));
1007 cmd.Parameters.Add(_Database.CreateParameter("sun_moon_color_i", wl.sunMoonColor.W));
1008 cmd.Parameters.Add(_Database.CreateParameter("sun_moon_position", wl.sunMoonPosition));
1009 cmd.Parameters.Add(_Database.CreateParameter("ambient_r", wl.ambient.X));
1010 cmd.Parameters.Add(_Database.CreateParameter("ambient_g", wl.ambient.Y));
1011 cmd.Parameters.Add(_Database.CreateParameter("ambient_b", wl.ambient.Z));
1012 cmd.Parameters.Add(_Database.CreateParameter("ambient_i", wl.ambient.W));
1013 cmd.Parameters.Add(_Database.CreateParameter("east_angle", wl.eastAngle));
1014 cmd.Parameters.Add(_Database.CreateParameter("sun_glow_focus", wl.sunGlowFocus));
1015 cmd.Parameters.Add(_Database.CreateParameter("sun_glow_size", wl.sunGlowSize));
1016 cmd.Parameters.Add(_Database.CreateParameter("scene_gamma", wl.sceneGamma));
1017 cmd.Parameters.Add(_Database.CreateParameter("star_brightness", wl.starBrightness));
1018 cmd.Parameters.Add(_Database.CreateParameter("cloud_color_r", wl.cloudColor.X));
1019 cmd.Parameters.Add(_Database.CreateParameter("cloud_color_g", wl.cloudColor.Y));
1020 cmd.Parameters.Add(_Database.CreateParameter("cloud_color_b", wl.cloudColor.Z));
1021 cmd.Parameters.Add(_Database.CreateParameter("cloud_color_i", wl.cloudColor.W));
1022 cmd.Parameters.Add(_Database.CreateParameter("cloud_x", wl.cloudXYDensity.X));
1023 cmd.Parameters.Add(_Database.CreateParameter("cloud_y", wl.cloudXYDensity.Y));
1024 cmd.Parameters.Add(_Database.CreateParameter("cloud_density", wl.cloudXYDensity.Z));
1025 cmd.Parameters.Add(_Database.CreateParameter("cloud_coverage", wl.cloudCoverage));
1026 cmd.Parameters.Add(_Database.CreateParameter("cloud_scale", wl.cloudScale));
1027 cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_x", wl.cloudDetailXYDensity.X));
1028 cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_y", wl.cloudDetailXYDensity.Y));
1029 cmd.Parameters.Add(_Database.CreateParameter("cloud_detail_density", wl.cloudDetailXYDensity.Z));
1030 cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_x", wl.cloudScrollX));
1031 cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_x_lock", wl.cloudScrollXLock));
1032 cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_y", wl.cloudScrollY));
1033 cmd.Parameters.Add(_Database.CreateParameter("cloud_scroll_y_lock", wl.cloudScrollYLock));
1034 cmd.Parameters.Add(_Database.CreateParameter("draw_classic_clouds", wl.drawClassicClouds));
1035
1036 cmd.ExecuteNonQuery();
1037 }
1038 }
1039 #region update
1040 // }
1041 // else
1042 // {
1043 // // sql update
1044 // sql = @"UPDATE [OpenSim].[dbo].[regionwindlight]
1045 // SET [region_id] = @region_id
1046 // ,[water_color_r] = @water_color_r
1047 // ,[water_color_g] = @water_color_g
1048 // ,[water_color_b] = @water_color_b
1049 // ,[water_fog_density_exponent] = @water_fog_density_exponent
1050 // ,[underwater_fog_modifier] = @underwater_fog_modifier
1051 // ,[reflection_wavelet_scale_1] = @reflection_wavelet_scale_1
1052 // ,[reflection_wavelet_scale_2] = @reflection_wavelet_scale_2
1053 // ,[reflection_wavelet_scale_3] = @reflection_wavelet_scale_3
1054 // ,[fresnel_scale] = @fresnel_scale
1055 // ,[fresnel_offset] = @fresnel_offset
1056 // ,[refract_scale_above] = @refract_scale_above
1057 // ,[refract_scale_below] = @refract_scale_below
1058 // ,[blur_multiplier] = @blur_multiplier
1059 // ,[big_wave_direction_x] = @big_wave_direction_x
1060 // ,[big_wave_direction_y] = @big_wave_direction_y
1061 // ,[little_wave_direction_x] = @little_wave_direction_x
1062 // ,[little_wave_direction_y] = @little_wave_direction_y
1063 // ,[normal_map_texture] = @normal_map_texture
1064 // ,[horizon_r] = @horizon_r
1065 // ,[horizon_g] = @horizon_g
1066 // ,[horizon_b] = @horizon_b
1067 // ,[horizon_i] = @horizon_i
1068 // ,[haze_horizon] = @haze_horizon
1069 // ,[blue_density_r] = @blue_density_r
1070 // ,[blue_density_g] = @blue_density_g
1071 // ,[blue_density_b] = @blue_density_b
1072 // ,[blue_density_i] = @blue_density_i
1073 // ,[haze_density] = @haze_density
1074 // ,[density_multiplier] = @density_multiplier
1075 // ,[distance_multiplier] = @distance_multiplier
1076 // ,[max_altitude] = @max_altitude
1077 // ,[sun_moon_color_r] = @sun_moon_color_r
1078 // ,[sun_moon_color_g] = @sun_moon_color_g
1079 // ,[sun_moon_color_b] = @sun_moon_color_b
1080 // ,[sun_moon_color_i] = @sun_moon_color_i
1081 // ,[sun_moon_position] = @sun_moon_position
1082 // ,[ambient_r] = @ambient_r
1083 // ,[ambient_g] = @ambient_g
1084 // ,[ambient_b] = @ambient_b
1085 // ,[ambient_i] = @ambient_i
1086 // ,[east_angle] = @east_angle
1087 // ,[sun_glow_focus] = @sun_glow_focus
1088 // ,[sun_glow_size] = @sun_glow_size
1089 // ,[scene_gamma] = @scene_gamma
1090 // ,[star_brightness] = @star_brightness
1091 // ,[cloud_color_r] = @cloud_color_r
1092 // ,[cloud_color_g] = @cloud_color_g
1093 // ,[cloud_color_b] = @cloud_color_b
1094 // ,[cloud_color_i] = @cloud_color_i
1095 // ,[cloud_x] = @cloud_x
1096 // ,[cloud_y] = @cloud_y
1097 // ,[cloud_density] = @cloud_density
1098 // ,[cloud_coverage] = @cloud_coverage
1099 // ,[cloud_scale] = @cloud_scale
1100 // ,[cloud_detail_x] = @cloud_detail_x
1101 // ,[cloud_detail_y] = @cloud_detail_y
1102 // ,[cloud_detail_density] = @cloud_detail_density
1103 // ,[cloud_scroll_x] = @cloud_scroll_x
1104 // ,[cloud_scroll_x_lock] = @cloud_scroll_x_lock
1105 // ,[cloud_scroll_y] = @cloud_scroll_y
1106 // ,[cloud_scroll_y_lock] = @cloud_scroll_y_lock
1107 // ,[draw_classic_clouds] = @draw_classic_clouds
1108 // WHERE region_id = @region_id";
1109 // using (SqlConnection conn = new SqlConnection(m_connectionString))
1110 // {
1111 // conn.Open();
1112 // using (SqlCommand cmd = new SqlCommand(sql, conn))
1113 // {
1114 // cmd.Parameters.AddWithValue("region_id", wl.regionID);
1115 // cmd.Parameters.AddWithValue("water_color_r", wl.waterColor.X);
1116 // cmd.Parameters.AddWithValue("water_color_g", wl.waterColor.Y);
1117 // cmd.Parameters.AddWithValue("water_color_b", wl.waterColor.Z);
1118 // cmd.Parameters.AddWithValue("water_fog_density_exponent", wl.waterFogDensityExponent);
1119 // cmd.Parameters.AddWithValue("underwater_fog_modifier", wl.underwaterFogModifier);
1120 // cmd.Parameters.AddWithValue("reflection_wavelet_scale_1", wl.reflectionWaveletScale.X);
1121 // cmd.Parameters.AddWithValue("reflection_wavelet_scale_2", wl.reflectionWaveletScale.Y);
1122 // cmd.Parameters.AddWithValue("reflection_wavelet_scale_3", wl.reflectionWaveletScale.Z);
1123 // cmd.Parameters.AddWithValue("fresnel_scale", wl.fresnelScale);
1124 // cmd.Parameters.AddWithValue("fresnel_offset", wl.fresnelOffset);
1125 // cmd.Parameters.AddWithValue("refract_scale_above", wl.refractScaleAbove);
1126 // cmd.Parameters.AddWithValue("refract_scale_below", wl.refractScaleBelow);
1127 // cmd.Parameters.AddWithValue("blur_multiplier", wl.blurMultiplier);
1128 // cmd.Parameters.AddWithValue("big_wave_direction_x", wl.bigWaveDirection.X);
1129 // cmd.Parameters.AddWithValue("big_wave_direction_y", wl.bigWaveDirection.Y);
1130 // cmd.Parameters.AddWithValue("little_wave_direction_x", wl.littleWaveDirection.X);
1131 // cmd.Parameters.AddWithValue("little_wave_direction_y", wl.littleWaveDirection.Y);
1132 // cmd.Parameters.AddWithValue("normal_map_texture", wl.normalMapTexture);
1133 // cmd.Parameters.AddWithValue("horizon_r", wl.horizon.X);
1134 // cmd.Parameters.AddWithValue("horizon_g", wl.horizon.Y);
1135 // cmd.Parameters.AddWithValue("horizon_b", wl.horizon.Z);
1136 // cmd.Parameters.AddWithValue("horizon_i", wl.horizon.W);
1137 // cmd.Parameters.AddWithValue("haze_horizon", wl.hazeHorizon);
1138 // cmd.Parameters.AddWithValue("blue_density_r", wl.blueDensity.X);
1139 // cmd.Parameters.AddWithValue("blue_density_g", wl.blueDensity.Y);
1140 // cmd.Parameters.AddWithValue("blue_density_b", wl.blueDensity.Z);
1141 // cmd.Parameters.AddWithValue("blue_density_i", wl.blueDensity.W);
1142 // cmd.Parameters.AddWithValue("haze_density", wl.hazeDensity);
1143 // cmd.Parameters.AddWithValue("density_multiplier", wl.densityMultiplier);
1144 // cmd.Parameters.AddWithValue("distance_multiplier", wl.distanceMultiplier);
1145 // cmd.Parameters.AddWithValue("max_altitude", wl.maxAltitude);
1146 // cmd.Parameters.AddWithValue("sun_moon_color_r", wl.sunMoonColor.X);
1147 // cmd.Parameters.AddWithValue("sun_moon_color_g", wl.sunMoonColor.Y);
1148 // cmd.Parameters.AddWithValue("sun_moon_color_b", wl.sunMoonColor.Z);
1149 // cmd.Parameters.AddWithValue("sun_moon_color_i", wl.sunMoonColor.W);
1150 // cmd.Parameters.AddWithValue("sun_moon_position", wl.sunMoonPosition);
1151 // cmd.Parameters.AddWithValue("ambient_r", wl.ambient.X);
1152 // cmd.Parameters.AddWithValue("ambient_g", wl.ambient.Y);
1153 // cmd.Parameters.AddWithValue("ambient_b", wl.ambient.Z);
1154 // cmd.Parameters.AddWithValue("ambient_i", wl.ambient.W);
1155 // cmd.Parameters.AddWithValue("east_angle", wl.eastAngle);
1156 // cmd.Parameters.AddWithValue("sun_glow_focus", wl.sunGlowFocus);
1157 // cmd.Parameters.AddWithValue("sun_glow_size", wl.sunGlowSize);
1158 // cmd.Parameters.AddWithValue("scene_gamma", wl.sceneGamma);
1159 // cmd.Parameters.AddWithValue("star_brightness", wl.starBrightness);
1160 // cmd.Parameters.AddWithValue("cloud_color_r", wl.cloudColor.X);
1161 // cmd.Parameters.AddWithValue("cloud_color_g", wl.cloudColor.Y);
1162 // cmd.Parameters.AddWithValue("cloud_color_b", wl.cloudColor.Z);
1163 // cmd.Parameters.AddWithValue("cloud_color_i", wl.cloudColor.W);
1164 // cmd.Parameters.AddWithValue("cloud_x", wl.cloudXYDensity.X);
1165 // cmd.Parameters.AddWithValue("cloud_y", wl.cloudXYDensity.Y);
1166 // cmd.Parameters.AddWithValue("cloud_density", wl.cloudXYDensity.Z);
1167 // cmd.Parameters.AddWithValue("cloud_coverage", wl.cloudCoverage);
1168 // cmd.Parameters.AddWithValue("cloud_scale", wl.cloudScale);
1169 // cmd.Parameters.AddWithValue("cloud_detail_x", wl.cloudDetailXYDensity.X);
1170 // cmd.Parameters.AddWithValue("cloud_detail_y", wl.cloudDetailXYDensity.Y);
1171 // cmd.Parameters.AddWithValue("cloud_detail_density", wl.cloudDetailXYDensity.Z);
1172 // cmd.Parameters.AddWithValue("cloud_scroll_x", wl.cloudScrollX);
1173 // cmd.Parameters.AddWithValue("cloud_scroll_x_lock", wl.cloudScrollXLock);
1174 // cmd.Parameters.AddWithValue("cloud_scroll_y", wl.cloudScrollY);
1175 // cmd.Parameters.AddWithValue("cloud_scroll_y_lock", wl.cloudScrollYLock);
1176 // cmd.Parameters.AddWithValue("draw_classic_clouds", wl.drawClassicClouds);
1177
1178 // cmd.ExecuteNonQuery();
1179 // }
1180 // }
1181 // }
1182 #endregion
1183 }
1184
1185 #region Environment Settings
1186 public string LoadRegionEnvironmentSettings(UUID regionUUID)
1187 {
1188 string sql = "select * from [regionenvironment] where region_id = @region_id";
1189 using (SqlConnection conn = new SqlConnection(m_connectionString))
1190 using (SqlCommand cmd = new SqlCommand(sql, conn))
1191 {
1192 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID));
1193 conn.Open();
1194 using (SqlDataReader result = cmd.ExecuteReader())
1195 {
1196 if (!result.Read())
1197 {
1198 return String.Empty;
1199 }
1200 else
1201 {
1202 return Convert.ToString(result["llsd_settings"]);
1203 }
1204 }
1205 }
1206 }
1207
1208 public void StoreRegionEnvironmentSettings(UUID regionUUID, string settings)
1209 {
1210 {
1211 string sql = "DELETE FROM [regionenvironment] WHERE region_id = @region_id";
1212 using (SqlConnection conn = new SqlConnection(m_connectionString))
1213
1214 using (SqlCommand cmd = new SqlCommand(sql, conn))
1215 {
1216 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID));
1217 conn.Open();
1218 cmd.ExecuteNonQuery();
1219 }
1220
1221 sql = "INSERT INTO [regionenvironment] (region_id, llsd_settings) VALUES (@region_id, @llsd_settings)";
1222
1223 using (SqlConnection conn = new SqlConnection(m_connectionString))
1224
1225 using (SqlCommand cmd = new SqlCommand(sql, conn))
1226 {
1227 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID));
1228 cmd.Parameters.Add(_Database.CreateParameter("@llsd_settings", settings));
1229
1230 conn.Open();
1231 cmd.ExecuteNonQuery();
1232 }
1233 }
1234 }
1235
1236 public void RemoveRegionEnvironmentSettings(UUID regionUUID)
1237 {
1238 string sql = "delete from [regionenvironment] where region_id = @region_id";
1239 using (SqlConnection conn = new SqlConnection(m_connectionString))
1240 using (SqlCommand cmd = new SqlCommand(sql, conn))
1241 {
1242 cmd.Parameters.Add(_Database.CreateParameter("@region_id", regionUUID));
1243
1244 conn.Open();
1245 cmd.ExecuteNonQuery();
1246 }
1247 }
1248 #endregion
1249
1250 /// <summary>
1251 /// Loads the settings of a region.
1252 /// </summary>
1253 /// <param name="regionUUID">The region UUID.</param>
1254 /// <returns></returns>
1255 public RegionSettings LoadRegionSettings(UUID regionUUID)
1256 {
1257 string sql = "select * from regionsettings where regionUUID = @regionUUID";
1258 RegionSettings regionSettings;
1259 using (SqlConnection conn = new SqlConnection(m_connectionString))
1260 using (SqlCommand cmd = new SqlCommand(sql, conn))
1261 {
1262 cmd.Parameters.Add(_Database.CreateParameter("@regionUUID", regionUUID));
1263 conn.Open();
1264 using (SqlDataReader reader = cmd.ExecuteReader())
1265 {
1266 if (reader.Read())
1267 {
1268 regionSettings = BuildRegionSettings(reader);
1269 regionSettings.OnSave += StoreRegionSettings;
1270
1271 return regionSettings;
1272 }
1273 }
1274 }
1275
1276 //If we reach this point then there are new region settings for that region
1277 regionSettings = new RegionSettings();
1278 regionSettings.RegionUUID = regionUUID;
1279 regionSettings.OnSave += StoreRegionSettings;
1280
1281 //Store new values
1282 StoreNewRegionSettings(regionSettings);
1283
1284 LoadSpawnPoints(regionSettings);
1285
1286 return regionSettings;
1287 }
1288
1289 /// <summary>
1290 /// Store region settings, need to check if the check is really necesary. If we can make something for creating new region.
1291 /// </summary>
1292 /// <param name="regionSettings">region settings.</param>
1293 public void StoreRegionSettings(RegionSettings regionSettings)
1294 {
1295 //Little check if regionUUID already exist in DB
1296 string regionUUID;
1297 string sql = "SELECT regionUUID FROM regionsettings WHERE regionUUID = @regionUUID";
1298 using (SqlConnection conn = new SqlConnection(m_connectionString))
1299 using (SqlCommand cmd = new SqlCommand(sql, conn))
1300 {
1301 cmd.Parameters.Add(_Database.CreateParameter("@regionUUID", regionSettings.RegionUUID));
1302 conn.Open();
1303 regionUUID = cmd.ExecuteScalar().ToString();
1304 }
1305
1306 if (string.IsNullOrEmpty(regionUUID))
1307 {
1308 StoreNewRegionSettings(regionSettings);
1309 }
1310 else
1311 {
1312 //This method only updates region settings!!! First call LoadRegionSettings to create new region settings in DB
1313 sql =
1314 @"UPDATE [regionsettings] SET [block_terraform] = @block_terraform ,[block_fly] = @block_fly ,[allow_damage] = @allow_damage
1315,[restrict_pushing] = @restrict_pushing ,[allow_land_resell] = @allow_land_resell ,[allow_land_join_divide] = @allow_land_join_divide
1316,[block_show_in_search] = @block_show_in_search ,[agent_limit] = @agent_limit ,[object_bonus] = @object_bonus ,[maturity] = @maturity
1317,[disable_scripts] = @disable_scripts ,[disable_collisions] = @disable_collisions ,[disable_physics] = @disable_physics
1318,[terrain_texture_1] = @terrain_texture_1 ,[terrain_texture_2] = @terrain_texture_2 ,[terrain_texture_3] = @terrain_texture_3
1319,[terrain_texture_4] = @terrain_texture_4 ,[elevation_1_nw] = @elevation_1_nw ,[elevation_2_nw] = @elevation_2_nw
1320,[elevation_1_ne] = @elevation_1_ne ,[elevation_2_ne] = @elevation_2_ne ,[elevation_1_se] = @elevation_1_se ,[elevation_2_se] = @elevation_2_se
1321,[elevation_1_sw] = @elevation_1_sw ,[elevation_2_sw] = @elevation_2_sw ,[water_height] = @water_height ,[terrain_raise_limit] = @terrain_raise_limit
1322,[terrain_lower_limit] = @terrain_lower_limit ,[use_estate_sun] = @use_estate_sun ,[fixed_sun] = @fixed_sun ,[sun_position] = @sun_position
1323,[covenant] = @covenant ,[covenant_datetime] = @covenant_datetime, [sunvectorx] = @sunvectorx, [sunvectory] = @sunvectory, [sunvectorz] = @sunvectorz, [Sandbox] = @Sandbox, [loaded_creation_datetime] = @loaded_creation_datetime, [loaded_creation_id] = @loaded_creation_id, [map_tile_id] = @TerrainImageID, [telehubobject] = @telehubobject, [parcel_tile_id] = @ParcelImageID
1324 WHERE [regionUUID] = @regionUUID";
1325
1326 using (SqlConnection conn = new SqlConnection(m_connectionString))
1327 using (SqlCommand cmd = new SqlCommand(sql, conn))
1328 {
1329 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
1330 conn.Open();
1331 cmd.ExecuteNonQuery();
1332 }
1333 }
1334 SaveSpawnPoints(regionSettings);
1335 }
1336
1337 public void Shutdown()
1338 {
1339 //Not used??
1340 }
1341
1342 #region Private Methods
1343
1344 /// <summary>
1345 /// Serializes the terrain data for storage in DB.
1346 /// </summary>
1347 /// <param name="val">terrain data</param>
1348 /// <returns></returns>
1349 private static Array serializeTerrain(double[,] val)
1350 {
1351 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) * sizeof(double));
1352 BinaryWriter bw = new BinaryWriter(str);
1353
1354 // TODO: COMPATIBILITY - Add byte-order conversions
1355 for (int x = 0; x < (int)Constants.RegionSize; x++)
1356 for (int y = 0; y < (int)Constants.RegionSize; y++)
1357 {
1358 double height = val[x, y];
1359 if (height == 0.0)
1360 height = double.Epsilon;
1361
1362 bw.Write(height);
1363 }
1364
1365 return str.ToArray();
1366 }
1367
1368 /// <summary>
1369 /// Stores new regionsettings.
1370 /// </summary>
1371 /// <param name="regionSettings">The region settings.</param>
1372 private void StoreNewRegionSettings(RegionSettings regionSettings)
1373 {
1374 string sql = @"INSERT INTO [regionsettings]
1375 ([regionUUID],[block_terraform],[block_fly],[allow_damage],[restrict_pushing],[allow_land_resell],[allow_land_join_divide],
1376 [block_show_in_search],[agent_limit],[object_bonus],[maturity],[disable_scripts],[disable_collisions],[disable_physics],
1377 [terrain_texture_1],[terrain_texture_2],[terrain_texture_3],[terrain_texture_4],[elevation_1_nw],[elevation_2_nw],[elevation_1_ne],
1378 [elevation_2_ne],[elevation_1_se],[elevation_2_se],[elevation_1_sw],[elevation_2_sw],[water_height],[terrain_raise_limit],
1379 [terrain_lower_limit],[use_estate_sun],[fixed_sun],[sun_position],[covenant],[covenant_datetime],[sunvectorx], [sunvectory], [sunvectorz],[Sandbox], [loaded_creation_datetime], [loaded_creation_id]
1380 )
1381 VALUES
1382 (@regionUUID,@block_terraform,@block_fly,@allow_damage,@restrict_pushing,@allow_land_resell,@allow_land_join_divide,
1383 @block_show_in_search,@agent_limit,@object_bonus,@maturity,@disable_scripts,@disable_collisions,@disable_physics,
1384 @terrain_texture_1,@terrain_texture_2,@terrain_texture_3,@terrain_texture_4,@elevation_1_nw,@elevation_2_nw,@elevation_1_ne,
1385 @elevation_2_ne,@elevation_1_se,@elevation_2_se,@elevation_1_sw,@elevation_2_sw,@water_height,@terrain_raise_limit,
1386 @terrain_lower_limit,@use_estate_sun,@fixed_sun,@sun_position,@covenant, @covenant_datetime, @sunvectorx,@sunvectory, @sunvectorz, @Sandbox, @loaded_creation_datetime, @loaded_creation_id)";
1387
1388 using (SqlConnection conn = new SqlConnection(m_connectionString))
1389 using (SqlCommand cmd = new SqlCommand(sql, conn))
1390 {
1391 cmd.Parameters.AddRange(CreateRegionSettingParameters(regionSettings));
1392 conn.Open();
1393 cmd.ExecuteNonQuery();
1394 }
1395 }
1396
1397 #region Private DataRecord conversion methods
1398
1399 /// <summary>
1400 /// Builds the region settings from a datarecod.
1401 /// </summary>
1402 /// <param name="row">datarecord with regionsettings.</param>
1403 /// <returns></returns>
1404 private static RegionSettings BuildRegionSettings(IDataRecord row)
1405 {
1406 //TODO change this is some more generic code so we doesnt have to change it every time a new field is added?
1407 RegionSettings newSettings = new RegionSettings();
1408
1409 newSettings.RegionUUID = new UUID((Guid)row["regionUUID"]);
1410 newSettings.BlockTerraform = Convert.ToBoolean(row["block_terraform"]);
1411 newSettings.AllowDamage = Convert.ToBoolean(row["allow_damage"]);
1412 newSettings.BlockFly = Convert.ToBoolean(row["block_fly"]);
1413 newSettings.RestrictPushing = Convert.ToBoolean(row["restrict_pushing"]);
1414 newSettings.AllowLandResell = Convert.ToBoolean(row["allow_land_resell"]);
1415 newSettings.AllowLandJoinDivide = Convert.ToBoolean(row["allow_land_join_divide"]);
1416 newSettings.BlockShowInSearch = Convert.ToBoolean(row["block_show_in_search"]);
1417 newSettings.AgentLimit = Convert.ToInt32(row["agent_limit"]);
1418 newSettings.ObjectBonus = Convert.ToDouble(row["object_bonus"]);
1419 newSettings.Maturity = Convert.ToInt32(row["maturity"]);
1420 newSettings.DisableScripts = Convert.ToBoolean(row["disable_scripts"]);
1421 newSettings.DisableCollisions = Convert.ToBoolean(row["disable_collisions"]);
1422 newSettings.DisablePhysics = Convert.ToBoolean(row["disable_physics"]);
1423 newSettings.TerrainTexture1 = new UUID((Guid)row["terrain_texture_1"]);
1424 newSettings.TerrainTexture2 = new UUID((Guid)row["terrain_texture_2"]);
1425 newSettings.TerrainTexture3 = new UUID((Guid)row["terrain_texture_3"]);
1426 newSettings.TerrainTexture4 = new UUID((Guid)row["terrain_texture_4"]);
1427 newSettings.Elevation1NW = Convert.ToDouble(row["elevation_1_nw"]);
1428 newSettings.Elevation2NW = Convert.ToDouble(row["elevation_2_nw"]);
1429 newSettings.Elevation1NE = Convert.ToDouble(row["elevation_1_ne"]);
1430 newSettings.Elevation2NE = Convert.ToDouble(row["elevation_2_ne"]);
1431 newSettings.Elevation1SE = Convert.ToDouble(row["elevation_1_se"]);
1432 newSettings.Elevation2SE = Convert.ToDouble(row["elevation_2_se"]);
1433 newSettings.Elevation1SW = Convert.ToDouble(row["elevation_1_sw"]);
1434 newSettings.Elevation2SW = Convert.ToDouble(row["elevation_2_sw"]);
1435 newSettings.WaterHeight = Convert.ToDouble(row["water_height"]);
1436 newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
1437 newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
1438 newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
1439 newSettings.Sandbox = Convert.ToBoolean(row["Sandbox"]);
1440 newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
1441 newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
1442 newSettings.SunVector = new Vector3(
1443 Convert.ToSingle(row["sunvectorx"]),
1444 Convert.ToSingle(row["sunvectory"]),
1445 Convert.ToSingle(row["sunvectorz"])
1446 );
1447 newSettings.Covenant = new UUID((Guid)row["covenant"]);
1448 newSettings.CovenantChangedDateTime = Convert.ToInt32(row["covenant_datetime"]);
1449 newSettings.LoadedCreationDateTime = Convert.ToInt32(row["loaded_creation_datetime"]);
1450
1451 if (row["loaded_creation_id"] is DBNull)
1452 newSettings.LoadedCreationID = "";
1453 else
1454 newSettings.LoadedCreationID = (String)row["loaded_creation_id"];
1455
1456 newSettings.TerrainImageID = new UUID((string)row["map_tile_ID"]);
1457 newSettings.ParcelImageID = new UUID((Guid)row["parcel_tile_ID"]);
1458 newSettings.TelehubObject = new UUID((Guid)row["TelehubObject"]);
1459
1460 return newSettings;
1461 }
1462
1463 /// <summary>
1464 /// Builds the land data from a datarecord.
1465 /// </summary>
1466 /// <param name="row">datarecord with land data</param>
1467 /// <returns></returns>
1468 private static LandData BuildLandData(IDataRecord row)
1469 {
1470 LandData newData = new LandData();
1471
1472 newData.GlobalID = new UUID((Guid)row["UUID"]);
1473 newData.LocalID = Convert.ToInt32(row["LocalLandID"]);
1474
1475 // Bitmap is a byte[512]
1476 newData.Bitmap = (Byte[])row["Bitmap"];
1477
1478 newData.Name = (string)row["Name"];
1479 newData.Description = (string)row["Description"];
1480 newData.OwnerID = new UUID((Guid)row["OwnerUUID"]);
1481 newData.IsGroupOwned = Convert.ToBoolean(row["IsGroupOwned"]);
1482 newData.Area = Convert.ToInt32(row["Area"]);
1483 newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unemplemented
1484 newData.Category = (ParcelCategory)Convert.ToInt32(row["Category"]);
1485 //Enum libsecondlife.Parcel.ParcelCategory
1486 newData.ClaimDate = Convert.ToInt32(row["ClaimDate"]);
1487 newData.ClaimPrice = Convert.ToInt32(row["ClaimPrice"]);
1488 newData.GroupID = new UUID((Guid)row["GroupUUID"]);
1489 newData.SalePrice = Convert.ToInt32(row["SalePrice"]);
1490 newData.Status = (ParcelStatus)Convert.ToInt32(row["LandStatus"]);
1491 //Enum. libsecondlife.Parcel.ParcelStatus
1492 newData.Flags = Convert.ToUInt32(row["LandFlags"]);
1493 newData.LandingType = Convert.ToByte(row["LandingType"]);
1494 newData.MediaAutoScale = Convert.ToByte(row["MediaAutoScale"]);
1495 newData.MediaID = new UUID((Guid)row["MediaTextureUUID"]);
1496 newData.MediaURL = (string)row["MediaURL"];
1497 newData.MusicURL = (string)row["MusicURL"];
1498 newData.PassHours = Convert.ToSingle(row["PassHours"]);
1499 newData.PassPrice = Convert.ToInt32(row["PassPrice"]);
1500
1501 // UUID authedbuyer;
1502 // UUID snapshotID;
1503 //
1504 // if (UUID.TryParse((string)row["AuthBuyerID"], out authedbuyer))
1505 // newData.AuthBuyerID = authedbuyer;
1506 //
1507 // if (UUID.TryParse((string)row["SnapshotUUID"], out snapshotID))
1508 // newData.SnapshotID = snapshotID;
1509 newData.AuthBuyerID = new UUID((Guid)row["AuthBuyerID"]);
1510 newData.SnapshotID = new UUID((Guid)row["SnapshotUUID"]);
1511
1512 newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
1513
1514 try
1515 {
1516 newData.UserLocation =
1517 new Vector3(Convert.ToSingle(row["UserLocationX"]), Convert.ToSingle(row["UserLocationY"]),
1518 Convert.ToSingle(row["UserLocationZ"]));
1519 newData.UserLookAt =
1520 new Vector3(Convert.ToSingle(row["UserLookAtX"]), Convert.ToSingle(row["UserLookAtY"]),
1521 Convert.ToSingle(row["UserLookAtZ"]));
1522 }
1523 catch (InvalidCastException)
1524 {
1525 newData.UserLocation = Vector3.Zero;
1526 newData.UserLookAt = Vector3.Zero;
1527 _Log.ErrorFormat("[PARCEL]: unable to get parcel telehub settings for {1}", newData.Name);
1528 }
1529
1530 newData.ParcelAccessList = new List<LandAccessEntry>();
1531 newData.MediaDescription = (string)row["MediaDescription"];
1532 newData.MediaType = (string)row["MediaType"];
1533 newData.MediaWidth = Convert.ToInt32((((string)row["MediaSize"]).Split(','))[0]);
1534 newData.MediaHeight = Convert.ToInt32((((string)row["MediaSize"]).Split(','))[1]);
1535 newData.MediaLoop = Convert.ToBoolean(row["MediaLoop"]);
1536 newData.ObscureMusic = Convert.ToBoolean(row["ObscureMusic"]);
1537 newData.ObscureMedia = Convert.ToBoolean(row["ObscureMedia"]);
1538
1539 return newData;
1540 }
1541
1542 /// <summary>
1543 /// Builds the landaccess data from a data record.
1544 /// </summary>
1545 /// <param name="row">datarecord with landaccess data</param>
1546 /// <returns></returns>
1547 private static LandAccessEntry BuildLandAccessData(IDataRecord row)
1548 {
1549 LandAccessEntry entry = new LandAccessEntry();
1550 entry.AgentID = new UUID((Guid)row["AccessUUID"]);
1551 entry.Flags = (AccessList)Convert.ToInt32(row["Flags"]);
1552 entry.Expires = Convert.ToInt32(row["Expires"]);
1553 return entry;
1554 }
1555
1556 /// <summary>
1557 /// Builds the prim from a datarecord.
1558 /// </summary>
1559 /// <param name="primRow">datarecord</param>
1560 /// <returns></returns>
1561 private static SceneObjectPart BuildPrim(IDataRecord primRow)
1562 {
1563 SceneObjectPart prim = new SceneObjectPart();
1564
1565 prim.UUID = new UUID((Guid)primRow["UUID"]);
1566 // explicit conversion of integers is required, which sort
1567 // of sucks. No idea if there is a shortcut here or not.
1568 prim.CreationDate = Convert.ToInt32(primRow["CreationDate"]);
1569 prim.Name = (string)primRow["Name"];
1570 // various text fields
1571 prim.Text = (string)primRow["Text"];
1572 prim.Color = Color.FromArgb(Convert.ToInt32(primRow["ColorA"]),
1573 Convert.ToInt32(primRow["ColorR"]),
1574 Convert.ToInt32(primRow["ColorG"]),
1575 Convert.ToInt32(primRow["ColorB"]));
1576 prim.Description = (string)primRow["Description"];
1577 prim.SitName = (string)primRow["SitName"];
1578 prim.TouchName = (string)primRow["TouchName"];
1579 // permissions
1580 prim.Flags = (PrimFlags)Convert.ToUInt32(primRow["ObjectFlags"]);
1581 //prim.CreatorID = new UUID((Guid)primRow["CreatorID"]);
1582 prim.CreatorIdentification = (string)primRow["CreatorID"];
1583 prim.OwnerID = new UUID((Guid)primRow["OwnerID"]);
1584 prim.GroupID = new UUID((Guid)primRow["GroupID"]);
1585 prim.LastOwnerID = new UUID((Guid)primRow["LastOwnerID"]);
1586 prim.OwnerMask = Convert.ToUInt32(primRow["OwnerMask"]);
1587 prim.NextOwnerMask = Convert.ToUInt32(primRow["NextOwnerMask"]);
1588 prim.GroupMask = Convert.ToUInt32(primRow["GroupMask"]);
1589 prim.EveryoneMask = Convert.ToUInt32(primRow["EveryoneMask"]);
1590 prim.BaseMask = Convert.ToUInt32(primRow["BaseMask"]);
1591 // vectors
1592 prim.OffsetPosition = new Vector3(
1593 Convert.ToSingle(primRow["PositionX"]),
1594 Convert.ToSingle(primRow["PositionY"]),
1595 Convert.ToSingle(primRow["PositionZ"]));
1596
1597 prim.GroupPosition = new Vector3(
1598 Convert.ToSingle(primRow["GroupPositionX"]),
1599 Convert.ToSingle(primRow["GroupPositionY"]),
1600 Convert.ToSingle(primRow["GroupPositionZ"]));
1601
1602 prim.Velocity = new Vector3(
1603 Convert.ToSingle(primRow["VelocityX"]),
1604 Convert.ToSingle(primRow["VelocityY"]),
1605 Convert.ToSingle(primRow["VelocityZ"]));
1606
1607 prim.AngularVelocity = new Vector3(
1608 Convert.ToSingle(primRow["AngularVelocityX"]),
1609 Convert.ToSingle(primRow["AngularVelocityY"]),
1610 Convert.ToSingle(primRow["AngularVelocityZ"]));
1611
1612 prim.Acceleration = new Vector3(
1613 Convert.ToSingle(primRow["AccelerationX"]),
1614 Convert.ToSingle(primRow["AccelerationY"]),
1615 Convert.ToSingle(primRow["AccelerationZ"]));
1616
1617 // quaternions
1618 prim.RotationOffset = new Quaternion(
1619 Convert.ToSingle(primRow["RotationX"]),
1620 Convert.ToSingle(primRow["RotationY"]),
1621 Convert.ToSingle(primRow["RotationZ"]),
1622 Convert.ToSingle(primRow["RotationW"]));
1623
1624 prim.SitTargetPositionLL = new Vector3(
1625 Convert.ToSingle(primRow["SitTargetOffsetX"]),
1626 Convert.ToSingle(primRow["SitTargetOffsetY"]),
1627 Convert.ToSingle(primRow["SitTargetOffsetZ"]));
1628
1629 prim.SitTargetOrientationLL = new Quaternion(
1630 Convert.ToSingle(primRow["SitTargetOrientX"]),
1631 Convert.ToSingle(primRow["SitTargetOrientY"]),
1632 Convert.ToSingle(primRow["SitTargetOrientZ"]),
1633 Convert.ToSingle(primRow["SitTargetOrientW"]));
1634
1635 prim.PayPrice[0] = Convert.ToInt32(primRow["PayPrice"]);
1636 prim.PayPrice[1] = Convert.ToInt32(primRow["PayButton1"]);
1637 prim.PayPrice[2] = Convert.ToInt32(primRow["PayButton2"]);
1638 prim.PayPrice[3] = Convert.ToInt32(primRow["PayButton3"]);
1639 prim.PayPrice[4] = Convert.ToInt32(primRow["PayButton4"]);
1640
1641 prim.Sound = new UUID((Guid)primRow["LoopedSound"]);
1642 prim.SoundGain = Convert.ToSingle(primRow["LoopedSoundGain"]);
1643 prim.SoundFlags = 1; // If it's persisted at all, it's looped
1644
1645 if (!(primRow["TextureAnimation"] is DBNull))
1646 prim.TextureAnimation = (Byte[])primRow["TextureAnimation"];
1647 if (!(primRow["ParticleSystem"] is DBNull))
1648 prim.ParticleSystem = (Byte[])primRow["ParticleSystem"];
1649
1650 prim.AngularVelocity = new Vector3(
1651 Convert.ToSingle(primRow["OmegaX"]),
1652 Convert.ToSingle(primRow["OmegaY"]),
1653 Convert.ToSingle(primRow["OmegaZ"]));
1654
1655 prim.SetCameraEyeOffset(new Vector3(
1656 Convert.ToSingle(primRow["CameraEyeOffsetX"]),
1657 Convert.ToSingle(primRow["CameraEyeOffsetY"]),
1658 Convert.ToSingle(primRow["CameraEyeOffsetZ"])
1659 ));
1660
1661 prim.SetCameraAtOffset(new Vector3(
1662 Convert.ToSingle(primRow["CameraAtOffsetX"]),
1663 Convert.ToSingle(primRow["CameraAtOffsetY"]),
1664 Convert.ToSingle(primRow["CameraAtOffsetZ"])
1665 ));
1666
1667 if (Convert.ToInt16(primRow["ForceMouselook"]) != 0)
1668 prim.SetForceMouselook(true);
1669
1670 prim.ScriptAccessPin = Convert.ToInt32(primRow["ScriptAccessPin"]);
1671
1672 if (Convert.ToInt16(primRow["AllowedDrop"]) != 0)
1673 prim.AllowedDrop = true;
1674
1675 if (Convert.ToInt16(primRow["DieAtEdge"]) != 0)
1676 prim.DIE_AT_EDGE = true;
1677
1678 prim.SalePrice = Convert.ToInt32(primRow["SalePrice"]);
1679 prim.ObjectSaleType = Convert.ToByte(primRow["SaleType"]);
1680
1681 prim.Material = Convert.ToByte(primRow["Material"]);
1682
1683 if (!(primRow["ClickAction"] is DBNull))
1684 prim.ClickAction = Convert.ToByte(primRow["ClickAction"]);
1685
1686 prim.CollisionSound = new UUID((Guid)primRow["CollisionSound"]);
1687 prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]);
1688 if (Convert.ToInt16(primRow["PassTouches"]) != 0)
1689 prim.PassTouches = true;
1690 prim.LinkNum = Convert.ToInt32(primRow["LinkNumber"]);
1691
1692 if (!(primRow["MediaURL"] is System.DBNull))
1693 prim.MediaUrl = (string)primRow["MediaURL"];
1694
1695 return prim;
1696 }
1697
1698 /// <summary>
1699 /// Builds the prim shape from a datarecord.
1700 /// </summary>
1701 /// <param name="shapeRow">The row.</param>
1702 /// <returns></returns>
1703 private static PrimitiveBaseShape BuildShape(IDataRecord shapeRow)
1704 {
1705 PrimitiveBaseShape baseShape = new PrimitiveBaseShape();
1706
1707 baseShape.Scale = new Vector3(
1708 (float)Convert.ToDouble(shapeRow["ScaleX"]),
1709 (float)Convert.ToDouble(shapeRow["ScaleY"]),
1710 (float)Convert.ToDouble(shapeRow["ScaleZ"]));
1711
1712 // paths
1713 baseShape.PCode = Convert.ToByte(shapeRow["PCode"]);
1714 baseShape.PathBegin = Convert.ToUInt16(shapeRow["PathBegin"]);
1715 baseShape.PathEnd = Convert.ToUInt16(shapeRow["PathEnd"]);
1716 baseShape.PathScaleX = Convert.ToByte(shapeRow["PathScaleX"]);
1717 baseShape.PathScaleY = Convert.ToByte(shapeRow["PathScaleY"]);
1718 baseShape.PathShearX = Convert.ToByte(shapeRow["PathShearX"]);
1719 baseShape.PathShearY = Convert.ToByte(shapeRow["PathShearY"]);
1720 baseShape.PathSkew = Convert.ToSByte(shapeRow["PathSkew"]);
1721 baseShape.PathCurve = Convert.ToByte(shapeRow["PathCurve"]);
1722 baseShape.PathRadiusOffset = Convert.ToSByte(shapeRow["PathRadiusOffset"]);
1723 baseShape.PathRevolutions = Convert.ToByte(shapeRow["PathRevolutions"]);
1724 baseShape.PathTaperX = Convert.ToSByte(shapeRow["PathTaperX"]);
1725 baseShape.PathTaperY = Convert.ToSByte(shapeRow["PathTaperY"]);
1726 baseShape.PathTwist = Convert.ToSByte(shapeRow["PathTwist"]);
1727 baseShape.PathTwistBegin = Convert.ToSByte(shapeRow["PathTwistBegin"]);
1728 // profile
1729 baseShape.ProfileBegin = Convert.ToUInt16(shapeRow["ProfileBegin"]);
1730 baseShape.ProfileEnd = Convert.ToUInt16(shapeRow["ProfileEnd"]);
1731 baseShape.ProfileCurve = Convert.ToByte(shapeRow["ProfileCurve"]);
1732 baseShape.ProfileHollow = Convert.ToUInt16(shapeRow["ProfileHollow"]);
1733
1734 byte[] textureEntry = (byte[])shapeRow["Texture"];
1735 baseShape.TextureEntry = textureEntry;
1736
1737 baseShape.ExtraParams = (byte[])shapeRow["ExtraParams"];
1738
1739 try
1740 {
1741 baseShape.State = Convert.ToByte(shapeRow["State"]);
1742 }
1743 catch (InvalidCastException)
1744 {
1745 }
1746
1747 if (!(shapeRow["Media"] is System.DBNull))
1748 {
1749 baseShape.Media = PrimitiveBaseShape.MediaList.FromXml((string)shapeRow["Media"]);
1750 }
1751
1752
1753 return baseShape;
1754 }
1755
1756 /// <summary>
1757 /// Build a prim inventory item from the persisted data.
1758 /// </summary>
1759 /// <param name="inventoryRow"></param>
1760 /// <returns></returns>
1761 private static TaskInventoryItem BuildItem(IDataRecord inventoryRow)
1762 {
1763 TaskInventoryItem taskItem = new TaskInventoryItem();
1764
1765 taskItem.ItemID = new UUID((Guid)inventoryRow["itemID"]);
1766 taskItem.ParentPartID = new UUID((Guid)inventoryRow["primID"]);
1767 taskItem.AssetID = new UUID((Guid)inventoryRow["assetID"]);
1768 taskItem.ParentID = new UUID((Guid)inventoryRow["parentFolderID"]);
1769
1770 taskItem.InvType = Convert.ToInt32(inventoryRow["invType"]);
1771 taskItem.Type = Convert.ToInt32(inventoryRow["assetType"]);
1772
1773 taskItem.Name = (string)inventoryRow["name"];
1774 taskItem.Description = (string)inventoryRow["description"];
1775 taskItem.CreationDate = Convert.ToUInt32(inventoryRow["creationDate"]);
1776 //taskItem.CreatorID = new UUID((Guid)inventoryRow["creatorID"]);
1777 taskItem.CreatorIdentification = (string)inventoryRow["creatorID"];
1778 taskItem.OwnerID = new UUID((Guid)inventoryRow["ownerID"]);
1779 taskItem.LastOwnerID = new UUID((Guid)inventoryRow["lastOwnerID"]);
1780 taskItem.GroupID = new UUID((Guid)inventoryRow["groupID"]);
1781
1782 taskItem.NextPermissions = Convert.ToUInt32(inventoryRow["nextPermissions"]);
1783 taskItem.CurrentPermissions = Convert.ToUInt32(inventoryRow["currentPermissions"]);
1784 taskItem.BasePermissions = Convert.ToUInt32(inventoryRow["basePermissions"]);
1785 taskItem.EveryonePermissions = Convert.ToUInt32(inventoryRow["everyonePermissions"]);
1786 taskItem.GroupPermissions = Convert.ToUInt32(inventoryRow["groupPermissions"]);
1787 taskItem.Flags = Convert.ToUInt32(inventoryRow["flags"]);
1788
1789 return taskItem;
1790 }
1791
1792 #endregion
1793
1794 #region Create parameters methods
1795
1796 /// <summary>
1797 /// Creates the prim inventory parameters.
1798 /// </summary>
1799 /// <param name="taskItem">item in inventory.</param>
1800 /// <returns></returns>
1801 private SqlParameter[] CreatePrimInventoryParameters(TaskInventoryItem taskItem)
1802 {
1803 List<SqlParameter> parameters = new List<SqlParameter>();
1804
1805 parameters.Add(_Database.CreateParameter("itemID", taskItem.ItemID));
1806 parameters.Add(_Database.CreateParameter("primID", taskItem.ParentPartID));
1807 parameters.Add(_Database.CreateParameter("assetID", taskItem.AssetID));
1808 parameters.Add(_Database.CreateParameter("parentFolderID", taskItem.ParentID));
1809 parameters.Add(_Database.CreateParameter("invType", taskItem.InvType));
1810 parameters.Add(_Database.CreateParameter("assetType", taskItem.Type));
1811
1812 parameters.Add(_Database.CreateParameter("name", taskItem.Name));
1813 parameters.Add(_Database.CreateParameter("description", taskItem.Description));
1814 parameters.Add(_Database.CreateParameter("creationDate", taskItem.CreationDate));
1815 parameters.Add(_Database.CreateParameter("creatorID", taskItem.CreatorID));
1816 parameters.Add(_Database.CreateParameter("ownerID", taskItem.OwnerID));
1817 parameters.Add(_Database.CreateParameter("lastOwnerID", taskItem.LastOwnerID));
1818 parameters.Add(_Database.CreateParameter("groupID", taskItem.GroupID));
1819 parameters.Add(_Database.CreateParameter("nextPermissions", taskItem.NextPermissions));
1820 parameters.Add(_Database.CreateParameter("currentPermissions", taskItem.CurrentPermissions));
1821 parameters.Add(_Database.CreateParameter("basePermissions", taskItem.BasePermissions));
1822 parameters.Add(_Database.CreateParameter("everyonePermissions", taskItem.EveryonePermissions));
1823 parameters.Add(_Database.CreateParameter("groupPermissions", taskItem.GroupPermissions));
1824 parameters.Add(_Database.CreateParameter("flags", taskItem.Flags));
1825
1826 return parameters.ToArray();
1827 }
1828
1829 /// <summary>
1830 /// Creates the region setting parameters.
1831 /// </summary>
1832 /// <param name="settings">regionsettings.</param>
1833 /// <returns></returns>
1834 private SqlParameter[] CreateRegionSettingParameters(RegionSettings settings)
1835 {
1836 List<SqlParameter> parameters = new List<SqlParameter>();
1837
1838 parameters.Add(_Database.CreateParameter("regionUUID", settings.RegionUUID));
1839 parameters.Add(_Database.CreateParameter("block_terraform", settings.BlockTerraform));
1840 parameters.Add(_Database.CreateParameter("block_fly", settings.BlockFly));
1841 parameters.Add(_Database.CreateParameter("allow_damage", settings.AllowDamage));
1842 parameters.Add(_Database.CreateParameter("restrict_pushing", settings.RestrictPushing));
1843 parameters.Add(_Database.CreateParameter("allow_land_resell", settings.AllowLandResell));
1844 parameters.Add(_Database.CreateParameter("allow_land_join_divide", settings.AllowLandJoinDivide));
1845 parameters.Add(_Database.CreateParameter("block_show_in_search", settings.BlockShowInSearch));
1846 parameters.Add(_Database.CreateParameter("agent_limit", settings.AgentLimit));
1847 parameters.Add(_Database.CreateParameter("object_bonus", settings.ObjectBonus));
1848 parameters.Add(_Database.CreateParameter("maturity", settings.Maturity));
1849 parameters.Add(_Database.CreateParameter("disable_scripts", settings.DisableScripts));
1850 parameters.Add(_Database.CreateParameter("disable_collisions", settings.DisableCollisions));
1851 parameters.Add(_Database.CreateParameter("disable_physics", settings.DisablePhysics));
1852 parameters.Add(_Database.CreateParameter("terrain_texture_1", settings.TerrainTexture1));
1853 parameters.Add(_Database.CreateParameter("terrain_texture_2", settings.TerrainTexture2));
1854 parameters.Add(_Database.CreateParameter("terrain_texture_3", settings.TerrainTexture3));
1855 parameters.Add(_Database.CreateParameter("terrain_texture_4", settings.TerrainTexture4));
1856 parameters.Add(_Database.CreateParameter("elevation_1_nw", settings.Elevation1NW));
1857 parameters.Add(_Database.CreateParameter("elevation_2_nw", settings.Elevation2NW));
1858 parameters.Add(_Database.CreateParameter("elevation_1_ne", settings.Elevation1NE));
1859 parameters.Add(_Database.CreateParameter("elevation_2_ne", settings.Elevation2NE));
1860 parameters.Add(_Database.CreateParameter("elevation_1_se", settings.Elevation1SE));
1861 parameters.Add(_Database.CreateParameter("elevation_2_se", settings.Elevation2SE));
1862 parameters.Add(_Database.CreateParameter("elevation_1_sw", settings.Elevation1SW));
1863 parameters.Add(_Database.CreateParameter("elevation_2_sw", settings.Elevation2SW));
1864 parameters.Add(_Database.CreateParameter("water_height", settings.WaterHeight));
1865 parameters.Add(_Database.CreateParameter("terrain_raise_limit", settings.TerrainRaiseLimit));
1866 parameters.Add(_Database.CreateParameter("terrain_lower_limit", settings.TerrainLowerLimit));
1867 parameters.Add(_Database.CreateParameter("use_estate_sun", settings.UseEstateSun));
1868 parameters.Add(_Database.CreateParameter("Sandbox", settings.Sandbox));
1869 parameters.Add(_Database.CreateParameter("fixed_sun", settings.FixedSun));
1870 parameters.Add(_Database.CreateParameter("sun_position", settings.SunPosition));
1871 parameters.Add(_Database.CreateParameter("sunvectorx", settings.SunVector.X));
1872 parameters.Add(_Database.CreateParameter("sunvectory", settings.SunVector.Y));
1873 parameters.Add(_Database.CreateParameter("sunvectorz", settings.SunVector.Z));
1874 parameters.Add(_Database.CreateParameter("covenant", settings.Covenant));
1875 parameters.Add(_Database.CreateParameter("covenant_datetime", settings.CovenantChangedDateTime));
1876 parameters.Add(_Database.CreateParameter("Loaded_Creation_DateTime", settings.LoadedCreationDateTime));
1877 parameters.Add(_Database.CreateParameter("Loaded_Creation_ID", settings.LoadedCreationID));
1878 parameters.Add(_Database.CreateParameter("TerrainImageID", settings.TerrainImageID));
1879 parameters.Add(_Database.CreateParameter("ParcelImageID", settings.ParcelImageID));
1880 parameters.Add(_Database.CreateParameter("TelehubObject", settings.TelehubObject));
1881
1882 return parameters.ToArray();
1883 }
1884
1885 /// <summary>
1886 /// Creates the land parameters.
1887 /// </summary>
1888 /// <param name="land">land parameters.</param>
1889 /// <param name="regionUUID">region UUID.</param>
1890 /// <returns></returns>
1891 private SqlParameter[] CreateLandParameters(LandData land, UUID regionUUID)
1892 {
1893 List<SqlParameter> parameters = new List<SqlParameter>();
1894
1895 parameters.Add(_Database.CreateParameter("UUID", land.GlobalID));
1896 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
1897 parameters.Add(_Database.CreateParameter("LocalLandID", land.LocalID));
1898
1899 // Bitmap is a byte[512]
1900 parameters.Add(_Database.CreateParameter("Bitmap", land.Bitmap));
1901
1902 parameters.Add(_Database.CreateParameter("Name", land.Name));
1903 parameters.Add(_Database.CreateParameter("Description", land.Description));
1904 parameters.Add(_Database.CreateParameter("OwnerUUID", land.OwnerID));
1905 parameters.Add(_Database.CreateParameter("IsGroupOwned", land.IsGroupOwned));
1906 parameters.Add(_Database.CreateParameter("Area", land.Area));
1907 parameters.Add(_Database.CreateParameter("AuctionID", land.AuctionID)); //Unemplemented
1908 parameters.Add(_Database.CreateParameter("Category", (int)land.Category)); //Enum libsecondlife.Parcel.ParcelCategory
1909 parameters.Add(_Database.CreateParameter("ClaimDate", land.ClaimDate));
1910 parameters.Add(_Database.CreateParameter("ClaimPrice", land.ClaimPrice));
1911 parameters.Add(_Database.CreateParameter("GroupUUID", land.GroupID));
1912 parameters.Add(_Database.CreateParameter("SalePrice", land.SalePrice));
1913 parameters.Add(_Database.CreateParameter("LandStatus", (int)land.Status)); //Enum. libsecondlife.Parcel.ParcelStatus
1914 parameters.Add(_Database.CreateParameter("LandFlags", land.Flags));
1915 parameters.Add(_Database.CreateParameter("LandingType", land.LandingType));
1916 parameters.Add(_Database.CreateParameter("MediaAutoScale", land.MediaAutoScale));
1917 parameters.Add(_Database.CreateParameter("MediaTextureUUID", land.MediaID));
1918 parameters.Add(_Database.CreateParameter("MediaURL", land.MediaURL));
1919 parameters.Add(_Database.CreateParameter("MusicURL", land.MusicURL));
1920 parameters.Add(_Database.CreateParameter("PassHours", land.PassHours));
1921 parameters.Add(_Database.CreateParameter("PassPrice", land.PassPrice));
1922 parameters.Add(_Database.CreateParameter("SnapshotUUID", land.SnapshotID));
1923 parameters.Add(_Database.CreateParameter("UserLocationX", land.UserLocation.X));
1924 parameters.Add(_Database.CreateParameter("UserLocationY", land.UserLocation.Y));
1925 parameters.Add(_Database.CreateParameter("UserLocationZ", land.UserLocation.Z));
1926 parameters.Add(_Database.CreateParameter("UserLookAtX", land.UserLookAt.X));
1927 parameters.Add(_Database.CreateParameter("UserLookAtY", land.UserLookAt.Y));
1928 parameters.Add(_Database.CreateParameter("UserLookAtZ", land.UserLookAt.Z));
1929 parameters.Add(_Database.CreateParameter("AuthBuyerID", land.AuthBuyerID));
1930 parameters.Add(_Database.CreateParameter("OtherCleanTime", land.OtherCleanTime));
1931
1932 return parameters.ToArray();
1933 }
1934
1935 /// <summary>
1936 /// Creates the land access parameters.
1937 /// </summary>
1938 /// <param name="parcelAccessEntry">parcel access entry.</param>
1939 /// <param name="parcelID">parcel ID.</param>
1940 /// <returns></returns>
1941 private SqlParameter[] CreateLandAccessParameters(LandAccessEntry parcelAccessEntry, UUID parcelID)
1942 {
1943 List<SqlParameter> parameters = new List<SqlParameter>();
1944
1945 parameters.Add(_Database.CreateParameter("LandUUID", parcelID));
1946 parameters.Add(_Database.CreateParameter("AccessUUID", parcelAccessEntry.AgentID));
1947 parameters.Add(_Database.CreateParameter("Flags", parcelAccessEntry.Flags));
1948 parameters.Add(_Database.CreateParameter("Expires", parcelAccessEntry.Expires));
1949
1950 return parameters.ToArray();
1951 }
1952
1953 /// <summary>
1954 /// Creates the prim parameters for storing in DB.
1955 /// </summary>
1956 /// <param name="prim">Basic data of SceneObjectpart prim.</param>
1957 /// <param name="sceneGroupID">The scenegroup ID.</param>
1958 /// <param name="regionUUID">The region ID.</param>
1959 /// <returns></returns>
1960 private SqlParameter[] CreatePrimParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1961 {
1962 List<SqlParameter> parameters = new List<SqlParameter>();
1963
1964 parameters.Add(_Database.CreateParameter("UUID", prim.UUID));
1965 parameters.Add(_Database.CreateParameter("RegionUUID", regionUUID));
1966 parameters.Add(_Database.CreateParameter("CreationDate", prim.CreationDate));
1967 parameters.Add(_Database.CreateParameter("Name", prim.Name));
1968 parameters.Add(_Database.CreateParameter("SceneGroupID", sceneGroupID));
1969 // the UUID of the root part for this SceneObjectGroup
1970 // various text fields
1971 parameters.Add(_Database.CreateParameter("Text", prim.Text));
1972 parameters.Add(_Database.CreateParameter("ColorR", prim.Color.R));
1973 parameters.Add(_Database.CreateParameter("ColorG", prim.Color.G));
1974 parameters.Add(_Database.CreateParameter("ColorB", prim.Color.B));
1975 parameters.Add(_Database.CreateParameter("ColorA", prim.Color.A));
1976 parameters.Add(_Database.CreateParameter("Description", prim.Description));
1977 parameters.Add(_Database.CreateParameter("SitName", prim.SitName));
1978 parameters.Add(_Database.CreateParameter("TouchName", prim.TouchName));
1979 // permissions
1980 parameters.Add(_Database.CreateParameter("ObjectFlags", (uint)prim.Flags));
1981 parameters.Add(_Database.CreateParameter("CreatorID", prim.CreatorID));
1982 parameters.Add(_Database.CreateParameter("OwnerID", prim.OwnerID));
1983 parameters.Add(_Database.CreateParameter("GroupID", prim.GroupID));
1984 parameters.Add(_Database.CreateParameter("LastOwnerID", prim.LastOwnerID));
1985 parameters.Add(_Database.CreateParameter("OwnerMask", prim.OwnerMask));
1986 parameters.Add(_Database.CreateParameter("NextOwnerMask", prim.NextOwnerMask));
1987 parameters.Add(_Database.CreateParameter("GroupMask", prim.GroupMask));
1988 parameters.Add(_Database.CreateParameter("EveryoneMask", prim.EveryoneMask));
1989 parameters.Add(_Database.CreateParameter("BaseMask", prim.BaseMask));
1990 // vectors
1991 parameters.Add(_Database.CreateParameter("PositionX", prim.OffsetPosition.X));
1992 parameters.Add(_Database.CreateParameter("PositionY", prim.OffsetPosition.Y));
1993 parameters.Add(_Database.CreateParameter("PositionZ", prim.OffsetPosition.Z));
1994 parameters.Add(_Database.CreateParameter("GroupPositionX", prim.GroupPosition.X));
1995 parameters.Add(_Database.CreateParameter("GroupPositionY", prim.GroupPosition.Y));
1996 parameters.Add(_Database.CreateParameter("GroupPositionZ", prim.GroupPosition.Z));
1997 parameters.Add(_Database.CreateParameter("VelocityX", prim.Velocity.X));
1998 parameters.Add(_Database.CreateParameter("VelocityY", prim.Velocity.Y));
1999 parameters.Add(_Database.CreateParameter("VelocityZ", prim.Velocity.Z));
2000 parameters.Add(_Database.CreateParameter("AngularVelocityX", prim.AngularVelocity.X));
2001 parameters.Add(_Database.CreateParameter("AngularVelocityY", prim.AngularVelocity.Y));
2002 parameters.Add(_Database.CreateParameter("AngularVelocityZ", prim.AngularVelocity.Z));
2003 parameters.Add(_Database.CreateParameter("AccelerationX", prim.Acceleration.X));
2004 parameters.Add(_Database.CreateParameter("AccelerationY", prim.Acceleration.Y));
2005 parameters.Add(_Database.CreateParameter("AccelerationZ", prim.Acceleration.Z));
2006 // quaternions
2007 parameters.Add(_Database.CreateParameter("RotationX", prim.RotationOffset.X));
2008 parameters.Add(_Database.CreateParameter("RotationY", prim.RotationOffset.Y));
2009 parameters.Add(_Database.CreateParameter("RotationZ", prim.RotationOffset.Z));
2010 parameters.Add(_Database.CreateParameter("RotationW", prim.RotationOffset.W));
2011
2012 // Sit target
2013 Vector3 sitTargetPos = prim.SitTargetPositionLL;
2014 parameters.Add(_Database.CreateParameter("SitTargetOffsetX", sitTargetPos.X));
2015 parameters.Add(_Database.CreateParameter("SitTargetOffsetY", sitTargetPos.Y));
2016 parameters.Add(_Database.CreateParameter("SitTargetOffsetZ", sitTargetPos.Z));
2017
2018 Quaternion sitTargetOrient = prim.SitTargetOrientationLL;
2019 parameters.Add(_Database.CreateParameter("SitTargetOrientW", sitTargetOrient.W));
2020 parameters.Add(_Database.CreateParameter("SitTargetOrientX", sitTargetOrient.X));
2021 parameters.Add(_Database.CreateParameter("SitTargetOrientY", sitTargetOrient.Y));
2022 parameters.Add(_Database.CreateParameter("SitTargetOrientZ", sitTargetOrient.Z));
2023
2024 parameters.Add(_Database.CreateParameter("PayPrice", prim.PayPrice[0]));
2025 parameters.Add(_Database.CreateParameter("PayButton1", prim.PayPrice[1]));
2026 parameters.Add(_Database.CreateParameter("PayButton2", prim.PayPrice[2]));
2027 parameters.Add(_Database.CreateParameter("PayButton3", prim.PayPrice[3]));
2028 parameters.Add(_Database.CreateParameter("PayButton4", prim.PayPrice[4]));
2029
2030 if ((prim.SoundFlags & 1) != 0) // Looped
2031 {
2032 parameters.Add(_Database.CreateParameter("LoopedSound", prim.Sound));
2033 parameters.Add(_Database.CreateParameter("LoopedSoundGain", prim.SoundGain));
2034 }
2035 else
2036 {
2037 parameters.Add(_Database.CreateParameter("LoopedSound", UUID.Zero));
2038 parameters.Add(_Database.CreateParameter("LoopedSoundGain", 0.0f));
2039 }
2040
2041 parameters.Add(_Database.CreateParameter("TextureAnimation", prim.TextureAnimation));
2042 parameters.Add(_Database.CreateParameter("ParticleSystem", prim.ParticleSystem));
2043
2044 parameters.Add(_Database.CreateParameter("OmegaX", prim.AngularVelocity.X));
2045 parameters.Add(_Database.CreateParameter("OmegaY", prim.AngularVelocity.Y));
2046 parameters.Add(_Database.CreateParameter("OmegaZ", prim.AngularVelocity.Z));
2047
2048 parameters.Add(_Database.CreateParameter("CameraEyeOffsetX", prim.GetCameraEyeOffset().X));
2049 parameters.Add(_Database.CreateParameter("CameraEyeOffsetY", prim.GetCameraEyeOffset().Y));
2050 parameters.Add(_Database.CreateParameter("CameraEyeOffsetZ", prim.GetCameraEyeOffset().Z));
2051
2052 parameters.Add(_Database.CreateParameter("CameraAtOffsetX", prim.GetCameraAtOffset().X));
2053 parameters.Add(_Database.CreateParameter("CameraAtOffsetY", prim.GetCameraAtOffset().Y));
2054 parameters.Add(_Database.CreateParameter("CameraAtOffsetZ", prim.GetCameraAtOffset().Z));
2055
2056 if (prim.GetForceMouselook())
2057 parameters.Add(_Database.CreateParameter("ForceMouselook", 1));
2058 else
2059 parameters.Add(_Database.CreateParameter("ForceMouselook", 0));
2060
2061 parameters.Add(_Database.CreateParameter("ScriptAccessPin", prim.ScriptAccessPin));
2062
2063 if (prim.AllowedDrop)
2064 parameters.Add(_Database.CreateParameter("AllowedDrop", 1));
2065 else
2066 parameters.Add(_Database.CreateParameter("AllowedDrop", 0));
2067
2068 if (prim.DIE_AT_EDGE)
2069 parameters.Add(_Database.CreateParameter("DieAtEdge", 1));
2070 else
2071 parameters.Add(_Database.CreateParameter("DieAtEdge", 0));
2072
2073 parameters.Add(_Database.CreateParameter("SalePrice", prim.SalePrice));
2074 parameters.Add(_Database.CreateParameter("SaleType", prim.ObjectSaleType));
2075
2076 byte clickAction = prim.ClickAction;
2077 parameters.Add(_Database.CreateParameter("ClickAction", clickAction));
2078
2079 parameters.Add(_Database.CreateParameter("Material", prim.Material));
2080
2081 parameters.Add(_Database.CreateParameter("CollisionSound", prim.CollisionSound));
2082 parameters.Add(_Database.CreateParameter("CollisionSoundVolume", prim.CollisionSoundVolume));
2083 if (prim.PassTouches)
2084 parameters.Add(_Database.CreateParameter("PassTouches", 1));
2085 else
2086 parameters.Add(_Database.CreateParameter("PassTouches", 0));
2087 parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum));
2088 parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl));
2089
2090 return parameters.ToArray();
2091 }
2092
2093 /// <summary>
2094 /// Creates the primshape parameters for stroing in DB.
2095 /// </summary>
2096 /// <param name="prim">Basic data of SceneObjectpart prim.</param>
2097 /// <param name="sceneGroupID">The scene group ID.</param>
2098 /// <param name="regionUUID">The region UUID.</param>
2099 /// <returns></returns>
2100 private SqlParameter[] CreatePrimShapeParameters(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
2101 {
2102 List<SqlParameter> parameters = new List<SqlParameter>();
2103
2104 PrimitiveBaseShape s = prim.Shape;
2105 parameters.Add(_Database.CreateParameter("UUID", prim.UUID));
2106 // shape is an enum
2107 parameters.Add(_Database.CreateParameter("Shape", 0));
2108 // vectors
2109 parameters.Add(_Database.CreateParameter("ScaleX", s.Scale.X));
2110 parameters.Add(_Database.CreateParameter("ScaleY", s.Scale.Y));
2111 parameters.Add(_Database.CreateParameter("ScaleZ", s.Scale.Z));
2112 // paths
2113 parameters.Add(_Database.CreateParameter("PCode", s.PCode));
2114 parameters.Add(_Database.CreateParameter("PathBegin", s.PathBegin));
2115 parameters.Add(_Database.CreateParameter("PathEnd", s.PathEnd));
2116 parameters.Add(_Database.CreateParameter("PathScaleX", s.PathScaleX));
2117 parameters.Add(_Database.CreateParameter("PathScaleY", s.PathScaleY));
2118 parameters.Add(_Database.CreateParameter("PathShearX", s.PathShearX));
2119 parameters.Add(_Database.CreateParameter("PathShearY", s.PathShearY));
2120 parameters.Add(_Database.CreateParameter("PathSkew", s.PathSkew));
2121 parameters.Add(_Database.CreateParameter("PathCurve", s.PathCurve));
2122 parameters.Add(_Database.CreateParameter("PathRadiusOffset", s.PathRadiusOffset));
2123 parameters.Add(_Database.CreateParameter("PathRevolutions", s.PathRevolutions));
2124 parameters.Add(_Database.CreateParameter("PathTaperX", s.PathTaperX));
2125 parameters.Add(_Database.CreateParameter("PathTaperY", s.PathTaperY));
2126 parameters.Add(_Database.CreateParameter("PathTwist", s.PathTwist));
2127 parameters.Add(_Database.CreateParameter("PathTwistBegin", s.PathTwistBegin));
2128 // profile
2129 parameters.Add(_Database.CreateParameter("ProfileBegin", s.ProfileBegin));
2130 parameters.Add(_Database.CreateParameter("ProfileEnd", s.ProfileEnd));
2131 parameters.Add(_Database.CreateParameter("ProfileCurve", s.ProfileCurve));
2132 parameters.Add(_Database.CreateParameter("ProfileHollow", s.ProfileHollow));
2133 parameters.Add(_Database.CreateParameter("Texture", s.TextureEntry));
2134 parameters.Add(_Database.CreateParameter("ExtraParams", s.ExtraParams));
2135 parameters.Add(_Database.CreateParameter("State", s.State));
2136
2137 if (null == s.Media)
2138 {
2139 parameters.Add(_Database.CreateParameter("Media", DBNull.Value));
2140 }
2141 else
2142 {
2143 parameters.Add(_Database.CreateParameter("Media", s.Media.ToXml()));
2144 }
2145
2146
2147 return parameters.ToArray();
2148 }
2149
2150 #endregion
2151
2152 #endregion
2153
2154 private void LoadSpawnPoints(RegionSettings rs)
2155 {
2156 rs.ClearSpawnPoints();
2157
2158 string sql = "SELECT Yaw, Pitch, Distance FROM spawn_points WHERE RegionUUID = @RegionUUID";
2159 using (SqlConnection conn = new SqlConnection(m_connectionString))
2160 using (SqlCommand cmd = new SqlCommand(sql, conn))
2161 {
2162 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID.ToString()));
2163 conn.Open();
2164 using (SqlDataReader reader = cmd.ExecuteReader())
2165 {
2166 if (reader.Read())
2167 {
2168 SpawnPoint sp = new SpawnPoint();
2169
2170 sp.Yaw = (float)reader["Yaw"];
2171 sp.Pitch = (float)reader["Pitch"];
2172 sp.Distance = (float)reader["Distance"];
2173
2174 rs.AddSpawnPoint(sp);
2175 }
2176 }
2177 }
2178 }
2179
2180 private void SaveSpawnPoints(RegionSettings rs)
2181 {
2182 string sql = "DELETE FROM spawn_points WHERE RegionUUID = @RegionUUID";
2183 using (SqlConnection conn = new SqlConnection(m_connectionString))
2184 using (SqlCommand cmd = new SqlCommand(sql, conn))
2185 {
2186 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID));
2187 conn.Open();
2188 cmd.ExecuteNonQuery();
2189 }
2190 foreach (SpawnPoint p in rs.SpawnPoints())
2191 {
2192 sql = "INSERT INTO spawn_points (RegionUUID, Yaw, Pitch, Distance) VALUES (@RegionUUID, @Yaw, @Pitch, @Distance)";
2193 using (SqlConnection conn = new SqlConnection(m_connectionString))
2194 using (SqlCommand cmd = new SqlCommand(sql, conn))
2195 {
2196 cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", rs.RegionUUID));
2197 cmd.Parameters.Add(_Database.CreateParameter("@Yaw", p.Yaw));
2198 cmd.Parameters.Add(_Database.CreateParameter("@Pitch", p.Pitch));
2199 cmd.Parameters.Add(_Database.CreateParameter("@Distance", p.Distance));
2200 conn.Open();
2201 cmd.ExecuteNonQuery();
2202 }
2203 }
2204 }
2205
2206 public void SaveExtra(UUID regionID, string name, string value)
2207 {
2208 }
2209
2210 public void RemoveExtra(UUID regionID, string name)
2211 {
2212 }
2213
2214 public Dictionary<string, string> GetExtra(UUID regionID)
2215 {
2216 return null;
2217 }
2218 }
2219}
diff --git a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs
deleted file mode 100644
index 7feec91..0000000
--- a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs
+++ /dev/null
@@ -1,246 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using System.Data.SqlClient;
35using System.Text;
36
37namespace OpenSim.Data.MSSQL
38{
39 public class MSSQLUserAccountData : MSSQLGenericTableHandler<UserAccountData>,IUserAccountData
40 {
41 public MSSQLUserAccountData(string connectionString, string realm) :
42 base(connectionString, realm, "UserAccount")
43 {
44 }
45 //private string m_Realm;
46 //private List<string> m_ColumnNames = null;
47 //private MSSQLManager m_database;
48
49 //public MSSQLUserAccountData(string connectionString, string realm)
50 //{
51 // m_Realm = realm;
52 // m_ConnectionString = connectionString;
53 // m_database = new MSSQLManager(connectionString);
54
55 // using (SqlConnection conn = new SqlConnection(m_ConnectionString))
56 // {
57 // conn.Open();
58 // Migration m = new Migration(conn, GetType().Assembly, "UserStore");
59 // m.Update();
60 // }
61 //}
62
63 //public List<UserAccountData> Query(UUID principalID, UUID scopeID, string query)
64 //{
65 // return null;
66 //}
67
68 //public UserAccountData Get(UUID principalID, UUID scopeID)
69 //{
70 // UserAccountData ret = new UserAccountData();
71 // ret.Data = new Dictionary<string, string>();
72
73 // string sql = string.Format("select * from {0} where UUID = @principalID", m_Realm);
74 // if (scopeID != UUID.Zero)
75 // sql += " and ScopeID = @scopeID";
76
77 // using (SqlConnection conn = new SqlConnection(m_ConnectionString))
78 // using (SqlCommand cmd = new SqlCommand(sql, conn))
79 // {
80 // cmd.Parameters.Add(m_database.CreateParameter("@principalID", principalID));
81 // cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
82
83 // conn.Open();
84 // using (SqlDataReader result = cmd.ExecuteReader())
85 // {
86 // if (result.Read())
87 // {
88 // ret.PrincipalID = principalID;
89 // UUID scope;
90 // UUID.TryParse(result["ScopeID"].ToString(), out scope);
91 // ret.ScopeID = scope;
92
93 // if (m_ColumnNames == null)
94 // {
95 // m_ColumnNames = new List<string>();
96
97 // DataTable schemaTable = result.GetSchemaTable();
98 // foreach (DataRow row in schemaTable.Rows)
99 // m_ColumnNames.Add(row["ColumnName"].ToString());
100 // }
101
102 // foreach (string s in m_ColumnNames)
103 // {
104 // if (s == "UUID")
105 // continue;
106 // if (s == "ScopeID")
107 // continue;
108
109 // ret.Data[s] = result[s].ToString();
110 // }
111 // return ret;
112 // }
113 // }
114 // }
115 // return null;
116 //}
117
118 //public bool Store(UserAccountData data)
119 //{
120 // if (data.Data.ContainsKey("UUID"))
121 // data.Data.Remove("UUID");
122 // if (data.Data.ContainsKey("ScopeID"))
123 // data.Data.Remove("ScopeID");
124
125 // string[] fields = new List<string>(data.Data.Keys).ToArray();
126
127 // using (SqlConnection conn = new SqlConnection(m_ConnectionString))
128 // using (SqlCommand cmd = new SqlCommand())
129 // {
130 // StringBuilder updateBuilder = new StringBuilder();
131 // updateBuilder.AppendFormat("update {0} set ", m_Realm);
132 // bool first = true;
133 // foreach (string field in fields)
134 // {
135 // if (!first)
136 // updateBuilder.Append(", ");
137 // updateBuilder.AppendFormat("{0} = @{0}", field);
138
139 // first = false;
140 // cmd.Parameters.Add(m_database.CreateParameter("@" + field, data.Data[field]));
141 // }
142
143 // updateBuilder.Append(" where UUID = @principalID");
144
145 // if (data.ScopeID != UUID.Zero)
146 // updateBuilder.Append(" and ScopeID = @scopeID");
147
148 // cmd.CommandText = updateBuilder.ToString();
149 // cmd.Connection = conn;
150 // cmd.Parameters.Add(m_database.CreateParameter("@principalID", data.PrincipalID));
151 // cmd.Parameters.Add(m_database.CreateParameter("@scopeID", data.ScopeID));
152 // conn.Open();
153
154 // if (cmd.ExecuteNonQuery() < 1)
155 // {
156 // StringBuilder insertBuilder = new StringBuilder();
157 // insertBuilder.AppendFormat("insert into {0} (UUID, ScopeID, ", m_Realm);
158 // insertBuilder.Append(String.Join(", ", fields));
159 // insertBuilder.Append(") values (@principalID, @scopeID, @");
160 // insertBuilder.Append(String.Join(", @", fields));
161 // insertBuilder.Append(")");
162
163 // cmd.CommandText = insertBuilder.ToString();
164
165 // if (cmd.ExecuteNonQuery() < 1)
166 // {
167 // return false;
168 // }
169 // }
170 // }
171 // return true;
172 //}
173
174 //public bool Store(UserAccountData data, UUID principalID, string token)
175 //{
176 // return false;
177 //}
178
179 //public bool SetDataItem(UUID principalID, string item, string value)
180 //{
181 // string sql = string.Format("update {0} set {1} = @{1} where UUID = @UUID", m_Realm, item);
182 // using (SqlConnection conn = new SqlConnection(m_ConnectionString))
183 // using (SqlCommand cmd = new SqlCommand(sql, conn))
184 // {
185 // cmd.Parameters.Add(m_database.CreateParameter("@" + item, value));
186 // cmd.Parameters.Add(m_database.CreateParameter("@UUID", principalID));
187
188 // conn.Open();
189
190 // if (cmd.ExecuteNonQuery() > 0)
191 // return true;
192 // }
193 // return false;
194 //}
195
196 //public UserAccountData[] Get(string[] keys, string[] vals)
197 //{
198 // return null;
199 //}
200
201 public UserAccountData[] GetUsers(UUID scopeID, string query)
202 {
203 string[] words = query.Split(new char[] { ' ' });
204
205 for (int i = 0; i < words.Length; i++)
206 {
207 if (words[i].Length < 3)
208 {
209 if (i != words.Length - 1)
210 Array.Copy(words, i + 1, words, i, words.Length - i - 1);
211 Array.Resize(ref words, words.Length - 1);
212 }
213 }
214
215 if (words.Length == 0)
216 return new UserAccountData[0];
217
218 if (words.Length > 2)
219 return new UserAccountData[0];
220
221 string sql = "";
222
223 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
224 using (SqlCommand cmd = new SqlCommand())
225 {
226 if (words.Length == 1)
227 {
228 sql = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @search or [LastName] like @search)", m_Realm);
229 cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID));
230 cmd.Parameters.Add(m_database.CreateParameter("@search", "%" + words[0] + "%"));
231 }
232 else
233 {
234 sql = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @searchFirst or [LastName] like @searchLast)", m_Realm);
235 cmd.Parameters.Add(m_database.CreateParameter("@searchFirst", "%" + words[0] + "%"));
236 cmd.Parameters.Add(m_database.CreateParameter("@searchLast", "%" + words[1] + "%"));
237 cmd.Parameters.Add(m_database.CreateParameter("@ScopeID", scopeID.ToString()));
238 }
239 cmd.Connection = conn;
240 cmd.CommandText = sql;
241 conn.Open();
242 return DoQuery(cmd);
243 }
244 }
245 }
246}
diff --git a/OpenSim/Data/MSSQL/MSSQLXInventoryData.cs b/OpenSim/Data/MSSQL/MSSQLXInventoryData.cs
deleted file mode 100644
index 9164ffe..0000000
--- a/OpenSim/Data/MSSQL/MSSQLXInventoryData.cs
+++ /dev/null
@@ -1,305 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using System.Data.SqlClient;
35using System.Reflection;
36using System.Text;
37using log4net;
38
39namespace OpenSim.Data.MSSQL
40{
41 public class MSSQLXInventoryData : IXInventoryData
42 {
43// private static readonly ILog m_log = LogManager.GetLogger(
44// MethodBase.GetCurrentMethod().DeclaringType);
45
46 private MSSQLFolderHandler m_Folders;
47 private MSSQLItemHandler m_Items;
48
49 public MSSQLXInventoryData(string conn, string realm)
50 {
51 m_Folders = new MSSQLFolderHandler(
52 conn, "inventoryfolders", "InventoryStore");
53 m_Items = new MSSQLItemHandler(
54 conn, "inventoryitems", String.Empty);
55 }
56
57 public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
58 {
59 return m_Folders.Get(fields, vals);
60 }
61
62 public XInventoryItem[] GetItems(string[] fields, string[] vals)
63 {
64 return m_Items.Get(fields, vals);
65 }
66
67 public bool StoreFolder(XInventoryFolder folder)
68 {
69 if (folder.folderName.Length > 64)
70 folder.folderName = folder.folderName.Substring(0, 64);
71 return m_Folders.Store(folder);
72 }
73
74 public bool StoreItem(XInventoryItem item)
75 {
76 if (item.inventoryName.Length > 64)
77 item.inventoryName = item.inventoryName.Substring(0, 64);
78 if (item.inventoryDescription.Length > 128)
79 item.inventoryDescription = item.inventoryDescription.Substring(0, 128);
80
81 return m_Items.Store(item);
82 }
83
84 public bool DeleteFolders(string field, string val)
85 {
86 return m_Folders.Delete(field, val);
87 }
88
89 public bool DeleteFolders(string[] fields, string[] vals)
90 {
91 return m_Folders.Delete(fields, vals);
92 }
93
94 public bool DeleteItems(string field, string val)
95 {
96 return m_Items.Delete(field, val);
97 }
98
99 public bool DeleteItems(string[] fields, string[] vals)
100 {
101 return m_Items.Delete(fields, vals);
102 }
103
104 public bool MoveItem(string id, string newParent)
105 {
106 return m_Items.MoveItem(id, newParent);
107 }
108
109 public bool MoveFolder(string id, string newParent)
110 {
111 return m_Folders.MoveFolder(id, newParent);
112 }
113
114 public XInventoryItem[] GetActiveGestures(UUID principalID)
115 {
116 return m_Items.GetActiveGestures(principalID);
117 }
118
119 public int GetAssetPermissions(UUID principalID, UUID assetID)
120 {
121 return m_Items.GetAssetPermissions(principalID, assetID);
122 }
123 }
124
125 public class MSSQLItemHandler : MSSQLInventoryHandler<XInventoryItem>
126 {
127 public MSSQLItemHandler(string c, string t, string m) :
128 base(c, t, m)
129 {
130 }
131
132 public bool MoveItem(string id, string newParent)
133 {
134 XInventoryItem[] retrievedItems = Get(new string[] { "inventoryID" }, new string[] { id });
135 if (retrievedItems.Length == 0)
136 return false;
137
138 UUID oldParent = retrievedItems[0].parentFolderID;
139
140 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
141 {
142 using (SqlCommand cmd = new SqlCommand())
143 {
144
145 cmd.CommandText = String.Format("update {0} set parentFolderID = @ParentFolderID where inventoryID = @InventoryID", m_Realm);
146 cmd.Parameters.Add(m_database.CreateParameter("@ParentFolderID", newParent));
147 cmd.Parameters.Add(m_database.CreateParameter("@InventoryID", id));
148 cmd.Connection = conn;
149 conn.Open();
150
151 if (cmd.ExecuteNonQuery() == 0)
152 return false;
153 }
154 }
155
156 IncrementFolderVersion(oldParent);
157 IncrementFolderVersion(newParent);
158
159 return true;
160 }
161
162 public XInventoryItem[] GetActiveGestures(UUID principalID)
163 {
164 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
165 {
166 using (SqlCommand cmd = new SqlCommand())
167 {
168 cmd.CommandText = String.Format("select * from inventoryitems where avatarId = @uuid and assetType = @type and flags = 1", m_Realm);
169
170 cmd.Parameters.Add(m_database.CreateParameter("@uuid", principalID.ToString()));
171 cmd.Parameters.Add(m_database.CreateParameter("@type", (int)AssetType.Gesture));
172 cmd.Connection = conn;
173 conn.Open();
174 return DoQuery(cmd);
175 }
176 }
177 }
178
179 public int GetAssetPermissions(UUID principalID, UUID assetID)
180 {
181 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
182 {
183 using (SqlCommand cmd = new SqlCommand())
184 {
185 cmd.CommandText = String.Format("select bit_or(inventoryCurrentPermissions) as inventoryCurrentPermissions from inventoryitems where avatarID = @PrincipalID and assetID = @AssetID group by assetID", m_Realm);
186 cmd.Parameters.Add(m_database.CreateParameter("@PrincipalID", principalID.ToString()));
187 cmd.Parameters.Add(m_database.CreateParameter("@AssetID", assetID.ToString()));
188 cmd.Connection = conn;
189 conn.Open();
190 using (SqlDataReader reader = cmd.ExecuteReader())
191 {
192
193 int perms = 0;
194
195 if (reader.Read())
196 {
197 perms = Convert.ToInt32(reader["inventoryCurrentPermissions"]);
198 }
199
200 return perms;
201 }
202
203 }
204 }
205 }
206
207 public override bool Store(XInventoryItem item)
208 {
209 if (!base.Store(item))
210 return false;
211
212 IncrementFolderVersion(item.parentFolderID);
213
214 return true;
215 }
216 }
217
218 public class MSSQLFolderHandler : MSSQLInventoryHandler<XInventoryFolder>
219 {
220 public MSSQLFolderHandler(string c, string t, string m) :
221 base(c, t, m)
222 {
223 }
224
225 public bool MoveFolder(string id, string newParentFolderID)
226 {
227 XInventoryFolder[] folders = Get(new string[] { "folderID" }, new string[] { id });
228
229 if (folders.Length == 0)
230 return false;
231
232 UUID oldParentFolderUUID = folders[0].parentFolderID;
233
234 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
235 {
236 using (SqlCommand cmd = new SqlCommand())
237 {
238
239 cmd.CommandText = String.Format("update {0} set parentFolderID = @ParentFolderID where folderID = @folderID", m_Realm);
240 cmd.Parameters.Add(m_database.CreateParameter("@ParentFolderID", newParentFolderID));
241 cmd.Parameters.Add(m_database.CreateParameter("@folderID", id));
242 cmd.Connection = conn;
243 conn.Open();
244
245 if (cmd.ExecuteNonQuery() == 0)
246 return false;
247 }
248 }
249
250 IncrementFolderVersion(oldParentFolderUUID);
251 IncrementFolderVersion(newParentFolderID);
252
253 return true;
254 }
255
256 public override bool Store(XInventoryFolder folder)
257 {
258 if (!base.Store(folder))
259 return false;
260
261 IncrementFolderVersion(folder.parentFolderID);
262
263 return true;
264 }
265 }
266
267 public class MSSQLInventoryHandler<T> : MSSQLGenericTableHandler<T> where T: class, new()
268 {
269 public MSSQLInventoryHandler(string c, string t, string m) : base(c, t, m) {}
270
271 protected bool IncrementFolderVersion(UUID folderID)
272 {
273 return IncrementFolderVersion(folderID.ToString());
274 }
275
276 protected bool IncrementFolderVersion(string folderID)
277 {
278// m_log.DebugFormat("[MYSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID);
279// Util.PrintCallStack();
280
281 string sql = "update inventoryfolders set version=version+1 where folderID = ?folderID";
282
283 using (SqlConnection conn = new SqlConnection(m_ConnectionString))
284 {
285 using (SqlCommand cmd = new SqlCommand(sql, conn))
286 {
287 conn.Open();
288
289 cmd.Parameters.AddWithValue("@folderID", folderID);
290
291 try
292 {
293 cmd.ExecuteNonQuery();
294 }
295 catch (Exception)
296 {
297 return false;
298 }
299 }
300 }
301
302 return true;
303 }
304 }
305} \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Properties/AssemblyInfo.cs b/OpenSim/Data/MSSQL/Properties/AssemblyInfo.cs
deleted file mode 100644
index 1a67e70..0000000
--- a/OpenSim/Data/MSSQL/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,65 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.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 OpenSimulator 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
28using System.Reflection;
29using System.Runtime.InteropServices;
30
31// General information about an assembly is controlled through the following
32// set of attributes. Change these attribute values to modify the information
33// associated with an assembly.
34
35[assembly : AssemblyTitle("OpenSim.Data.MSSQL")]
36[assembly : AssemblyDescription("")]
37[assembly : AssemblyConfiguration("")]
38[assembly : AssemblyCompany("http://opensimulator.org")]
39[assembly : AssemblyProduct("OpenSim.Data.MSSQL")]
40[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")]
41[assembly : AssemblyTrademark("")]
42[assembly : AssemblyCulture("")]
43
44// Setting ComVisible to false makes the types in this assembly not visible
45// to COM components. If you need to access a type in this assembly from
46// COM, set the ComVisible attribute to true on that type.
47
48[assembly : ComVisible(false)]
49
50// The following GUID is for the ID of the typelib if this project is exposed to COM
51
52[assembly : Guid("0e1c1ca4-2cf2-4315-b0e7-432c02feea8a")]
53
54// Version information for an assembly consists of the following four values:
55//
56// Major Version
57// Minor Version
58// Build Number
59// Revision
60//
61// You can specify all the values or you can default the Revision and Build Numbers
62// by using the '*' as shown below:
63
64[assembly : AssemblyVersion("0.7.5.*")]
65[assembly : AssemblyFileVersion("0.6.5.0")]
diff --git a/OpenSim/Data/MSSQL/Resources/AssetStore.migrations b/OpenSim/Data/MSSQL/Resources/AssetStore.migrations
deleted file mode 100644
index 8664ce9..0000000
--- a/OpenSim/Data/MSSQL/Resources/AssetStore.migrations
+++ /dev/null
@@ -1,106 +0,0 @@
1:VERSION 1
2
3CREATE TABLE [assets] (
4 [id] [varchar](36) NOT NULL,
5 [name] [varchar](64) NOT NULL,
6 [description] [varchar](64) NOT NULL,
7 [assetType] [tinyint] NOT NULL,
8 [local] [tinyint] NOT NULL,
9 [temporary] [tinyint] NOT NULL,
10 [data] [image] NOT NULL,
11PRIMARY KEY CLUSTERED
12(
13 [id] ASC
14)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
15) ON [PRIMARY]
16
17
18:VERSION 2
19
20BEGIN TRANSACTION
21
22CREATE TABLE Tmp_assets
23 (
24 id varchar(36) NOT NULL,
25 name varchar(64) NOT NULL,
26 description varchar(64) NOT NULL,
27 assetType tinyint NOT NULL,
28 local bit NOT NULL,
29 temporary bit NOT NULL,
30 data image NOT NULL
31 ) ON [PRIMARY]
32 TEXTIMAGE_ON [PRIMARY]
33
34IF EXISTS(SELECT * FROM assets)
35 EXEC('INSERT INTO Tmp_assets (id, name, description, assetType, local, temporary, data)
36 SELECT id, name, description, assetType, CONVERT(bit, local), CONVERT(bit, temporary), data FROM assets WITH (HOLDLOCK TABLOCKX)')
37
38DROP TABLE assets
39
40EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT'
41
42ALTER TABLE dbo.assets ADD CONSTRAINT
43 PK__assets__id PRIMARY KEY CLUSTERED
44 (
45 id
46 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
47
48COMMIT
49
50
51:VERSION 3
52
53BEGIN TRANSACTION
54
55ALTER TABLE assets add create_time integer default 0
56ALTER TABLE assets add access_time integer default 0
57
58COMMIT
59
60
61:VERSION 4
62
63BEGIN TRANSACTION
64
65CREATE TABLE dbo.Tmp_assets
66 (
67 id uniqueidentifier NOT NULL,
68 name varchar(64) NOT NULL,
69 description varchar(64) NOT NULL,
70 assetType tinyint NOT NULL,
71 local bit NOT NULL,
72 temporary bit NOT NULL,
73 data image NOT NULL,
74 create_time int NULL,
75 access_time int NULL
76 ) ON [PRIMARY]
77 TEXTIMAGE_ON [PRIMARY]
78
79IF EXISTS(SELECT * FROM dbo.assets)
80 EXEC('INSERT INTO dbo.Tmp_assets (id, name, description, assetType, local, temporary, data, create_time, access_time)
81 SELECT CONVERT(uniqueidentifier, id), name, description, assetType, local, temporary, data, create_time, access_time FROM dbo.assets WITH (HOLDLOCK TABLOCKX)')
82
83DROP TABLE assets
84
85EXECUTE sp_rename N'Tmp_assets', N'assets', 'OBJECT'
86
87ALTER TABLE dbo.assets ADD CONSTRAINT
88 PK__assets__id PRIMARY KEY CLUSTERED
89 (
90 id
91 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
92
93COMMIT
94
95
96:VERSION 5
97
98DELETE FROM assets WHERE id = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621';
99
100:VERSION 6
101
102ALTER TABLE assets ADD asset_flags INTEGER NOT NULL DEFAULT 0;
103
104:VERSION 7
105
106alter table assets add creatorid varchar(36) not null default '';
diff --git a/OpenSim/Data/MSSQL/Resources/AuthStore.migrations b/OpenSim/Data/MSSQL/Resources/AuthStore.migrations
deleted file mode 100644
index eb91296..0000000
--- a/OpenSim/Data/MSSQL/Resources/AuthStore.migrations
+++ /dev/null
@@ -1,32 +0,0 @@
1:VERSION 1
2
3BEGIN TRANSACTION
4
5CREATE TABLE [auth] (
6 [uuid] [uniqueidentifier] NOT NULL default '00000000-0000-0000-0000-000000000000',
7 [passwordHash] [varchar](32) NOT NULL,
8 [passwordSalt] [varchar](32) NOT NULL,
9 [webLoginKey] [varchar](255) NOT NULL,
10 [accountType] VARCHAR(32) NOT NULL DEFAULT 'UserAccount',
11) ON [PRIMARY]
12
13CREATE TABLE [tokens] (
14 [uuid] [uniqueidentifier] NOT NULL default '00000000-0000-0000-0000-000000000000',
15 [token] [varchar](255) NOT NULL,
16 [validity] [datetime] NOT NULL )
17 ON [PRIMARY]
18
19COMMIT
20
21:VERSION 2
22
23BEGIN TRANSACTION
24
25IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[users]') AND type in (N'U'))
26 INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey, accountType) SELECT [UUID] AS UUID, [passwordHash] AS passwordHash, [passwordSalt] AS passwordSalt, [webLoginKey] AS webLoginKey, 'UserAccount' as [accountType] FROM users;
27
28COMMIT
29
30
31
32
diff --git a/OpenSim/Data/MSSQL/Resources/Avatar.migrations b/OpenSim/Data/MSSQL/Resources/Avatar.migrations
deleted file mode 100644
index 61f7b56..0000000
--- a/OpenSim/Data/MSSQL/Resources/Avatar.migrations
+++ /dev/null
@@ -1,64 +0,0 @@
1:VERSION 1
2
3BEGIN TRANSACTION
4
5CREATE TABLE [Avatars] (
6[PrincipalID] uniqueidentifier NOT NULL,
7[Name] varchar(32) NOT NULL,
8[Value] varchar(255) NOT NULL DEFAULT '',
9PRIMARY KEY CLUSTERED
10(
11 [PrincipalID] ASC, [Name] ASC
12)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
13) ON [PRIMARY]
14
15
16COMMIT
17
18:VERSION 2
19
20BEGIN TRANSACTION
21
22CREATE TABLE dbo.Tmp_Avatars
23 (
24 PrincipalID uniqueidentifier NOT NULL,
25 [Name] varchar(32) NOT NULL,
26 Value text NOT NULL DEFAULT '',
27 ) ON [PRIMARY]
28 TEXTIMAGE_ON [PRIMARY]
29
30IF EXISTS(SELECT * FROM dbo.Avatars)
31 EXEC('INSERT INTO dbo.Tmp_Avatars (PrincipalID, Name, Value)
32 SELECT PrincipalID, CONVERT(text, Name), Value FROM dbo.Avatars WITH (HOLDLOCK TABLOCKX)')
33
34DROP TABLE dbo.Avatars
35
36EXECUTE sp_rename N'dbo.Tmp_Avatars', N'Avatars', 'OBJECT'
37
38COMMIT
39
40:VERSION 3
41
42BEGIN TRANSACTION
43
44CREATE TABLE dbo.Tmp_Avatars
45 (
46 PrincipalID uniqueidentifier NOT NULL,
47 [Name] varchar(32) NOT NULL,
48 Value text NOT NULL DEFAULT '',
49 PRIMARY KEY CLUSTERED
50(
51 [PrincipalID] ASC, [Name] ASC
52)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
53) ON [PRIMARY]
54 TEXTIMAGE_ON [PRIMARY]
55
56IF EXISTS(SELECT * FROM dbo.Avatars)
57 EXEC('INSERT INTO dbo.Tmp_Avatars (PrincipalID, Name, Value)
58 SELECT PrincipalID, CONVERT(text, Name), Value FROM dbo.Avatars WITH (HOLDLOCK TABLOCKX)')
59
60DROP TABLE dbo.Avatars
61
62EXECUTE sp_rename N'dbo.Tmp_Avatars', N'Avatars', 'OBJECT'
63COMMIT
64
diff --git a/OpenSim/Data/MSSQL/Resources/EstateStore.migrations b/OpenSim/Data/MSSQL/Resources/EstateStore.migrations
deleted file mode 100644
index 64b2d2b..0000000
--- a/OpenSim/Data/MSSQL/Resources/EstateStore.migrations
+++ /dev/null
@@ -1,334 +0,0 @@
1:VERSION 1
2
3BEGIN TRANSACTION
4
5CREATE TABLE [dbo].[estate_managers](
6 [EstateID] [int] NOT NULL,
7 [uuid] [varchar](36) NOT NULL,
8 CONSTRAINT [PK_estate_managers] PRIMARY KEY CLUSTERED
9(
10 [EstateID] ASC
11)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
12) ON [PRIMARY];
13
14CREATE TABLE [dbo].[estate_groups](
15 [EstateID] [int] NOT NULL,
16 [uuid] [varchar](36) NOT NULL,
17 CONSTRAINT [PK_estate_groups] PRIMARY KEY CLUSTERED
18(
19 [EstateID] ASC
20)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
21) ON [PRIMARY];
22
23
24CREATE TABLE [dbo].[estate_users](
25 [EstateID] [int] NOT NULL,
26 [uuid] [varchar](36) NOT NULL,
27 CONSTRAINT [PK_estate_users] PRIMARY KEY CLUSTERED
28(
29 [EstateID] ASC
30)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
31) ON [PRIMARY];
32
33
34CREATE TABLE [dbo].[estateban](
35 [EstateID] [int] NOT NULL,
36 [bannedUUID] [varchar](36) NOT NULL,
37 [bannedIp] [varchar](16) NOT NULL,
38 [bannedIpHostMask] [varchar](16) NOT NULL,
39 [bannedNameMask] [varchar](64) NULL DEFAULT (NULL),
40 CONSTRAINT [PK_estateban] PRIMARY KEY CLUSTERED
41(
42 [EstateID] ASC
43)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
44) ON [PRIMARY];
45
46CREATE TABLE [dbo].[estate_settings](
47 [EstateID] [int] IDENTITY(1,100) NOT NULL,
48 [EstateName] [varchar](64) NULL DEFAULT (NULL),
49 [AbuseEmailToEstateOwner] [bit] NOT NULL,
50 [DenyAnonymous] [bit] NOT NULL,
51 [ResetHomeOnTeleport] [bit] NOT NULL,
52 [FixedSun] [bit] NOT NULL,
53 [DenyTransacted] [bit] NOT NULL,
54 [BlockDwell] [bit] NOT NULL,
55 [DenyIdentified] [bit] NOT NULL,
56 [AllowVoice] [bit] NOT NULL,
57 [UseGlobalTime] [bit] NOT NULL,
58 [PricePerMeter] [int] NOT NULL,
59 [TaxFree] [bit] NOT NULL,
60 [AllowDirectTeleport] [bit] NOT NULL,
61 [RedirectGridX] [int] NOT NULL,
62 [RedirectGridY] [int] NOT NULL,
63 [ParentEstateID] [int] NOT NULL,
64 [SunPosition] [float] NOT NULL,
65 [EstateSkipScripts] [bit] NOT NULL,
66 [BillableFactor] [float] NOT NULL,
67 [PublicAccess] [bit] NOT NULL,
68 [AbuseEmail] [varchar](255) NOT NULL,
69 [EstateOwner] [varchar](36) NOT NULL,
70 [DenyMinors] [bit] NOT NULL,
71 CONSTRAINT [PK_estate_settings] PRIMARY KEY CLUSTERED
72(
73 [EstateID] ASC
74)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
75) ON [PRIMARY];
76
77
78CREATE TABLE [dbo].[estate_map](
79 [RegionID] [varchar](36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
80 [EstateID] [int] NOT NULL,
81 CONSTRAINT [PK_estate_map] PRIMARY KEY CLUSTERED
82(
83 [RegionID] ASC
84)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
85) ON [PRIMARY];
86
87COMMIT
88
89:VERSION 2
90
91BEGIN TRANSACTION
92
93ALTER TABLE dbo.estate_managers DROP CONSTRAINT PK_estate_managers
94
95CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers
96 (
97 EstateID
98 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
99
100ALTER TABLE dbo.estate_groups DROP CONSTRAINT PK_estate_groups
101
102CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups
103 (
104 EstateID
105 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
106
107
108ALTER TABLE dbo.estate_users DROP CONSTRAINT PK_estate_users
109
110CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users
111 (
112 EstateID
113 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
114
115COMMIT
116
117
118:VERSION 3
119
120BEGIN TRANSACTION
121
122CREATE TABLE dbo.Tmp_estateban
123 (
124 EstateID int NOT NULL,
125 bannedUUID varchar(36) NOT NULL,
126 bannedIp varchar(16) NULL,
127 bannedIpHostMask varchar(16) NULL,
128 bannedNameMask varchar(64) NULL
129 ) ON [PRIMARY]
130
131IF EXISTS(SELECT * FROM dbo.estateban)
132 EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask)
133 SELECT EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban')
134
135DROP TABLE dbo.estateban
136
137EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT'
138
139CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban
140 (
141 EstateID
142 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
143
144COMMIT
145
146
147:VERSION 4
148
149BEGIN TRANSACTION
150
151CREATE TABLE dbo.Tmp_estate_managers
152 (
153 EstateID int NOT NULL,
154 uuid uniqueidentifier NOT NULL
155 ) ON [PRIMARY]
156
157IF EXISTS(SELECT * FROM dbo.estate_managers)
158 EXEC('INSERT INTO dbo.Tmp_estate_managers (EstateID, uuid)
159 SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_managers WITH (HOLDLOCK TABLOCKX)')
160
161DROP TABLE dbo.estate_managers
162
163EXECUTE sp_rename N'dbo.Tmp_estate_managers', N'estate_managers', 'OBJECT'
164
165CREATE NONCLUSTERED INDEX IX_estate_managers ON dbo.estate_managers
166 (
167 EstateID
168 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
169
170COMMIT
171
172
173:VERSION 5
174
175BEGIN TRANSACTION
176
177CREATE TABLE dbo.Tmp_estate_groups
178 (
179 EstateID int NOT NULL,
180 uuid uniqueidentifier NOT NULL
181 ) ON [PRIMARY]
182
183IF EXISTS(SELECT * FROM dbo.estate_groups)
184 EXEC('INSERT INTO dbo.Tmp_estate_groups (EstateID, uuid)
185 SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_groups WITH (HOLDLOCK TABLOCKX)')
186
187DROP TABLE dbo.estate_groups
188
189EXECUTE sp_rename N'dbo.Tmp_estate_groups', N'estate_groups', 'OBJECT'
190
191CREATE NONCLUSTERED INDEX IX_estate_groups ON dbo.estate_groups
192 (
193 EstateID
194 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
195
196COMMIT
197
198
199:VERSION 6
200
201BEGIN TRANSACTION
202
203CREATE TABLE dbo.Tmp_estate_users
204 (
205 EstateID int NOT NULL,
206 uuid uniqueidentifier NOT NULL
207 ) ON [PRIMARY]
208
209IF EXISTS(SELECT * FROM dbo.estate_users)
210 EXEC('INSERT INTO dbo.Tmp_estate_users (EstateID, uuid)
211 SELECT EstateID, CONVERT(uniqueidentifier, uuid) FROM dbo.estate_users WITH (HOLDLOCK TABLOCKX)')
212
213DROP TABLE dbo.estate_users
214
215EXECUTE sp_rename N'dbo.Tmp_estate_users', N'estate_users', 'OBJECT'
216
217CREATE NONCLUSTERED INDEX IX_estate_users ON dbo.estate_users
218 (
219 EstateID
220 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
221
222COMMIT
223
224
225:VERSION 7
226
227BEGIN TRANSACTION
228
229CREATE TABLE dbo.Tmp_estateban
230 (
231 EstateID int NOT NULL,
232 bannedUUID uniqueidentifier NOT NULL,
233 bannedIp varchar(16) NULL,
234 bannedIpHostMask varchar(16) NULL,
235 bannedNameMask varchar(64) NULL
236 ) ON [PRIMARY]
237
238IF EXISTS(SELECT * FROM dbo.estateban)
239 EXEC('INSERT INTO dbo.Tmp_estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask)
240 SELECT EstateID, CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask, bannedNameMask FROM dbo.estateban WITH (HOLDLOCK TABLOCKX)')
241
242DROP TABLE dbo.estateban
243
244EXECUTE sp_rename N'dbo.Tmp_estateban', N'estateban', 'OBJECT'
245
246CREATE NONCLUSTERED INDEX IX_estateban ON dbo.estateban
247 (
248 EstateID
249 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
250
251COMMIT
252
253
254:VERSION 8
255
256BEGIN TRANSACTION
257
258CREATE TABLE dbo.Tmp_estate_settings
259 (
260 EstateID int NOT NULL IDENTITY (1, 100),
261 EstateName varchar(64) NULL DEFAULT (NULL),
262 AbuseEmailToEstateOwner bit NOT NULL,
263 DenyAnonymous bit NOT NULL,
264 ResetHomeOnTeleport bit NOT NULL,
265 FixedSun bit NOT NULL,
266 DenyTransacted bit NOT NULL,
267 BlockDwell bit NOT NULL,
268 DenyIdentified bit NOT NULL,
269 AllowVoice bit NOT NULL,
270 UseGlobalTime bit NOT NULL,
271 PricePerMeter int NOT NULL,
272 TaxFree bit NOT NULL,
273 AllowDirectTeleport bit NOT NULL,
274 RedirectGridX int NOT NULL,
275 RedirectGridY int NOT NULL,
276 ParentEstateID int NOT NULL,
277 SunPosition float(53) NOT NULL,
278 EstateSkipScripts bit NOT NULL,
279 BillableFactor float(53) NOT NULL,
280 PublicAccess bit NOT NULL,
281 AbuseEmail varchar(255) NOT NULL,
282 EstateOwner uniqueidentifier NOT NULL,
283 DenyMinors bit NOT NULL
284 ) ON [PRIMARY]
285
286SET IDENTITY_INSERT dbo.Tmp_estate_settings ON
287
288IF EXISTS(SELECT * FROM dbo.estate_settings)
289 EXEC('INSERT INTO dbo.Tmp_estate_settings (EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, EstateOwner, DenyMinors)
290 SELECT EstateID, EstateName, AbuseEmailToEstateOwner, DenyAnonymous, ResetHomeOnTeleport, FixedSun, DenyTransacted, BlockDwell, DenyIdentified, AllowVoice, UseGlobalTime, PricePerMeter, TaxFree, AllowDirectTeleport, RedirectGridX, RedirectGridY, ParentEstateID, SunPosition, EstateSkipScripts, BillableFactor, PublicAccess, AbuseEmail, CONVERT(uniqueidentifier, EstateOwner), DenyMinors FROM dbo.estate_settings WITH (HOLDLOCK TABLOCKX)')
291
292SET IDENTITY_INSERT dbo.Tmp_estate_settings OFF
293
294DROP TABLE dbo.estate_settings
295
296EXECUTE sp_rename N'dbo.Tmp_estate_settings', N'estate_settings', 'OBJECT'
297
298ALTER TABLE dbo.estate_settings ADD CONSTRAINT
299 PK_estate_settings PRIMARY KEY CLUSTERED
300 (
301 EstateID
302 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
303
304COMMIT
305
306
307:VERSION 9
308
309BEGIN TRANSACTION
310
311CREATE TABLE dbo.Tmp_estate_map
312 (
313 RegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
314 EstateID int NOT NULL
315 ) ON [PRIMARY]
316
317IF EXISTS(SELECT * FROM dbo.estate_map)
318 EXEC('INSERT INTO dbo.Tmp_estate_map (RegionID, EstateID)
319 SELECT CONVERT(uniqueidentifier, RegionID), EstateID FROM dbo.estate_map WITH (HOLDLOCK TABLOCKX)')
320
321DROP TABLE dbo.estate_map
322
323EXECUTE sp_rename N'dbo.Tmp_estate_map', N'estate_map', 'OBJECT'
324
325ALTER TABLE dbo.estate_map ADD CONSTRAINT
326 PK_estate_map PRIMARY KEY CLUSTERED
327 (
328 RegionID
329 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
330
331
332COMMIT
333
334
diff --git a/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations
deleted file mode 100644
index cc94c4e..0000000
--- a/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations
+++ /dev/null
@@ -1,50 +0,0 @@
1:VERSION 1
2
3BEGIN TRANSACTION
4
5CREATE TABLE [Friends] (
6[PrincipalID] uniqueidentifier NOT NULL,
7[Friend] varchar(255) NOT NULL,
8[Flags] char(16) NOT NULL DEFAULT '0',
9[Offered] varchar(32) NOT NULL DEFAULT 0)
10 ON [PRIMARY]
11
12COMMIT
13
14:VERSION 2
15
16BEGIN TRANSACTION
17
18IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[userfriends]') AND type in (N'U'))
19INSERT INTO Friends (PrincipalID, Friend, Flags, Offered)
20SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends;
21
22COMMIT
23
24:VERSION 3
25
26BEGIN TRANSACTION
27
28CREATE TABLE [Tmp_Friends]
29 ([PrincipalID] varchar(255) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
30[Friend] varchar(255) NOT NULL,
31[Flags] char(16) NOT NULL DEFAULT '0',
32[Offered] varchar(32) NOT NULL DEFAULT 0)
33ON [PRIMARY]
34
35
36IF EXISTS(SELECT * FROM dbo.Friends)
37 EXEC('INSERT INTO dbo.Tmp_Friends (PrincipalID, Friend, Flags, Offered)
38 SELECT CONVERT(varchar(255),PrincipalID), Friend, Flags, Offered FROM dbo.Friends WITH (HOLDLOCK TABLOCKX)')
39
40DROP TABLE dbo.Friends
41
42EXECUTE sp_rename N'dbo.Tmp_Friends', N'Friends', 'OBJECT'
43
44ALTER TABLE dbo.Friends ADD
45 PRIMARY KEY CLUSTERED
46(
47 [PrincipalID] ASC, [Friend] ASC
48)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
49
50COMMIT \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/GridStore.migrations b/OpenSim/Data/MSSQL/Resources/GridStore.migrations
deleted file mode 100644
index de0cea7..0000000
--- a/OpenSim/Data/MSSQL/Resources/GridStore.migrations
+++ /dev/null
@@ -1,245 +0,0 @@
1:VERSION 1
2
3BEGIN TRANSACTION
4
5CREATE TABLE [dbo].[regions](
6 [regionHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
7 [regionName] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
8 [uuid] [varchar](255) COLLATE Latin1_General_CI_AS NOT NULL,
9 [regionRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
10 [regionSecret] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
11 [regionSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
12 [regionDataURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
13 [serverIP] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
14 [serverPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
15 [serverURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
16 [locX] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
17 [locY] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
18 [locZ] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
19 [eastOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
20 [westOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
21 [southOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
22 [northOverrideHandle] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
23 [regionAssetURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
24 [regionAssetRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
25 [regionAssetSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
26 [regionUserURI] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
27 [regionUserRecvKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
28 [regionUserSendKey] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
29 [regionMapTexture] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
30 [serverHttpPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
31 [serverRemotingPort] [varchar](255) COLLATE Latin1_General_CI_AS NULL,
32 [owner_uuid] [varchar](36) COLLATE Latin1_General_CI_AS NULL,
33PRIMARY KEY CLUSTERED
34(
35 [uuid] ASC
36)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
37) ON [PRIMARY]
38
39COMMIT
40
41
42:VERSION 2
43
44BEGIN TRANSACTION
45
46CREATE TABLE Tmp_regions
47 (
48 uuid varchar(36) COLLATE Latin1_General_CI_AS NOT NULL,
49 regionHandle bigint NULL,
50 regionName varchar(20) NULL,
51 regionRecvKey varchar(128) NULL,
52 regionSendKey varchar(128) NULL,
53 regionSecret varchar(128) NULL,
54 regionDataURI varchar(128) NULL,
55 serverIP varchar(64) NULL,
56 serverPort int NULL,
57 serverURI varchar(255) NULL,
58 locX int NULL,
59 locY int NULL,
60 locZ int NULL,
61 eastOverrideHandle bigint NULL,
62 westOverrideHandle bigint NULL,
63 southOverrideHandle bigint NULL,
64 northOverrideHandle bigint NULL,
65 regionAssetURI varchar(255) NULL,
66 regionAssetRecvKey varchar(128) NULL,
67 regionAssetSendKey varchar(128) NULL,
68 regionUserURI varchar(255) NULL,
69 regionUserRecvKey varchar(128) NULL,
70 regionUserSendKey varchar(128) NULL,
71 regionMapTexture varchar(36) NULL,
72 serverHttpPort int NULL,
73 serverRemotingPort int NULL,
74 owner_uuid varchar(36) NULL,
75 originUUID varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000')
76 ) ON [PRIMARY]
77
78IF EXISTS(SELECT * FROM regions)
79 EXEC('INSERT INTO Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid)
80 SELECT CONVERT(varchar(36), uuid), CONVERT(bigint, regionHandle), CONVERT(varchar(20), regionName), CONVERT(varchar(128), regionRecvKey), CONVERT(varchar(128), regionSendKey), CONVERT(varchar(128), regionSecret), CONVERT(varchar(128), regionDataURI), CONVERT(varchar(64), serverIP), CONVERT(int, serverPort), serverURI, CONVERT(int, locX), CONVERT(int, locY), CONVERT(int, locZ), CONVERT(bigint, eastOverrideHandle), CONVERT(bigint, westOverrideHandle), CONVERT(bigint, southOverrideHandle), CONVERT(bigint, northOverrideHandle), regionAssetURI, CONVERT(varchar(128), regionAssetRecvKey), CONVERT(varchar(128), regionAssetSendKey), regionUserURI, CONVERT(varchar(128), regionUserRecvKey), CONVERT(varchar(128), regionUserSendKey), CONVERT(varchar(36), regionMapTexture), CONVERT(int, serverHttpPort), CONVERT(int, serverRemotingPort), owner_uuid FROM regions')
81
82DROP TABLE regions
83
84EXECUTE sp_rename N'Tmp_regions', N'regions', 'OBJECT'
85
86ALTER TABLE regions ADD CONSTRAINT
87 PK__regions__uuid PRIMARY KEY CLUSTERED
88 (
89 uuid
90 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
91
92COMMIT
93
94:VERSION 3
95
96BEGIN TRANSACTION
97
98CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions
99 (
100 regionName
101 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
102
103CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions
104 (
105 regionHandle
106 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
107
108
109CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions
110 (
111 eastOverrideHandle,
112 westOverrideHandle,
113 southOverrideHandle,
114 northOverrideHandle
115 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
116
117COMMIT
118
119
120:VERSION 4
121
122/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
123BEGIN TRANSACTION
124
125CREATE TABLE dbo.Tmp_regions
126 (
127 uuid uniqueidentifier NOT NULL,
128 regionHandle bigint NULL,
129 regionName varchar(20) NULL,
130 regionRecvKey varchar(128) NULL,
131 regionSendKey varchar(128) NULL,
132 regionSecret varchar(128) NULL,
133 regionDataURI varchar(128) NULL,
134 serverIP varchar(64) NULL,
135 serverPort int NULL,
136 serverURI varchar(255) NULL,
137 locX int NULL,
138 locY int NULL,
139 locZ int NULL,
140 eastOverrideHandle bigint NULL,
141 westOverrideHandle bigint NULL,
142 southOverrideHandle bigint NULL,
143 northOverrideHandle bigint NULL,
144 regionAssetURI varchar(255) NULL,
145 regionAssetRecvKey varchar(128) NULL,
146 regionAssetSendKey varchar(128) NULL,
147 regionUserURI varchar(255) NULL,
148 regionUserRecvKey varchar(128) NULL,
149 regionUserSendKey varchar(128) NULL,
150 regionMapTexture uniqueidentifier NULL,
151 serverHttpPort int NULL,
152 serverRemotingPort int NULL,
153 owner_uuid uniqueidentifier NOT NULL,
154 originUUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000')
155 ) ON [PRIMARY]
156
157IF EXISTS(SELECT * FROM dbo.regions)
158 EXEC('INSERT INTO dbo.Tmp_regions (uuid, regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid, originUUID)
159 SELECT CONVERT(uniqueidentifier, uuid), regionHandle, regionName, regionRecvKey, regionSendKey, regionSecret, regionDataURI, serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, CONVERT(uniqueidentifier, regionMapTexture), serverHttpPort, serverRemotingPort, CONVERT(uniqueidentifier, owner_uuid), CONVERT(uniqueidentifier, originUUID) FROM dbo.regions WITH (HOLDLOCK TABLOCKX)')
160
161DROP TABLE dbo.regions
162
163EXECUTE sp_rename N'dbo.Tmp_regions', N'regions', 'OBJECT'
164
165ALTER TABLE dbo.regions ADD CONSTRAINT
166 PK__regions__uuid PRIMARY KEY CLUSTERED
167 (
168 uuid
169 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
170
171CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions
172 (
173 regionName
174 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
175
176CREATE NONCLUSTERED INDEX IX_regions_handle ON dbo.regions
177 (
178 regionHandle
179 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
180
181CREATE NONCLUSTERED INDEX IX_regions_override ON dbo.regions
182 (
183 eastOverrideHandle,
184 westOverrideHandle,
185 southOverrideHandle,
186 northOverrideHandle
187 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
188
189COMMIT
190
191
192:VERSION 5
193
194BEGIN TRANSACTION
195
196ALTER TABLE regions ADD access int default 0;
197
198COMMIT
199
200
201:VERSION 6
202
203BEGIN TRANSACTION
204
205ALTER TABLE regions ADD scopeid uniqueidentifier default '00000000-0000-0000-0000-000000000000';
206ALTER TABLE regions ADD DEFAULT ('00000000-0000-0000-0000-000000000000') FOR [owner_uuid];
207ALTER TABLE regions ADD sizeX integer not null default 0;
208ALTER TABLE regions ADD sizeY integer not null default 0;
209
210COMMIT
211
212
213:VERSION 7
214
215BEGIN TRANSACTION
216
217ALTER TABLE regions ADD [flags] integer NOT NULL DEFAULT 0;
218CREATE INDEX [flags] ON regions(flags);
219ALTER TABLE [regions] ADD [last_seen] integer NOT NULL DEFAULT 0;
220ALTER TABLE [regions] ADD [PrincipalID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
221ALTER TABLE [regions] ADD [Token] varchar(255) NOT NULL DEFAULT 0;
222
223COMMIT
224
225:VERSION 8
226
227BEGIN TRANSACTION
228ALTER TABLE regions ALTER COLUMN regionName VarChar(128)
229
230DROP INDEX IX_regions_name ON dbo.regions
231ALTER TABLE regions ALTER COLUMN regionName VarChar(128) null
232
233CREATE NONCLUSTERED INDEX IX_regions_name ON dbo.regions
234 (
235 regionName
236 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
237
238COMMIT
239
240:VERSION 9
241
242BEGIN TRANSACTION
243ALTER TABLE regions ADD parcelMapTexture uniqueidentifier NULL;
244
245COMMIT
diff --git a/OpenSim/Data/MSSQL/Resources/GridUserStore.migrations b/OpenSim/Data/MSSQL/Resources/GridUserStore.migrations
deleted file mode 100644
index ecd3f4d..0000000
--- a/OpenSim/Data/MSSQL/Resources/GridUserStore.migrations
+++ /dev/null
@@ -1,65 +0,0 @@
1:VERSION 1 # --------------------------
2
3BEGIN TRANSACTION
4
5CREATE TABLE "GridUser" (
6 "UserID" VARCHAR(255) NOT NULL,
7 "HomeRegionID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
8 "HomePosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
9 "HomeLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
10 "LastRegionID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
11 "LastPosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
12 "LastLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
13 "Online" CHAR(5) NOT NULL DEFAULT 'false',
14 "Login" CHAR(16) NOT NULL DEFAULT '0',
15 "Logout" CHAR(16) NOT NULL DEFAULT '0',
16 PRIMARY KEY ("UserID")
17)
18
19COMMIT
20
21:VERSION 2 # --------------------------
22
23BEGIN TRANSACTION
24
25CREATE TABLE [GridUser_tmp] (
26 [UserID] VARCHAR(255) NOT NULL,
27 [HomeRegionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
28 [HomePosition] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
29 [HomeLookAt] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
30 [LastRegionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
31 [LastPosition] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
32 [LastLookAt] CHAR(64) NOT NULL DEFAULT '<0,0,0>',
33 [Online] CHAR(5) NOT NULL DEFAULT 'false',
34 [Login] CHAR(16) NOT NULL DEFAULT '0',
35 [Logout] CHAR(16) NOT NULL DEFAULT '0',
36
37 PRIMARY KEY CLUSTERED
38 (
39 [UserID] ASC
40 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
41 ) ON [PRIMARY]
42
43COMMIT
44
45IF EXISTS(SELECT * FROM dbo.GridUser)
46 EXEC('INSERT INTO dbo.GridUser_tmp ([UserID]
47 ,[HomeRegionID]
48 ,[HomePosition]
49 ,[HomeLookAt]
50 ,[LastRegionID]
51 ,[LastPosition]
52 ,[LastLookAt]
53 ,[Online]
54 ,[Login]
55 ,[Logout])
56 SELECT CONVERT(varchar(36), [HomeRegionID]), [HomePosition] ,[HomeLookAt] , CONVERT(varchar(36),[LastRegionID])
57 ,[LastPosition]
58 ,[LastLookAt]
59 ,[Online]
60 ,[Login]
61 ,[Logout] FROM dbo.GridUser WITH (HOLDLOCK TABLOCKX)')
62
63DROP TABLE dbo.GridUser
64
65EXECUTE sp_rename N'dbo.GridUser_tmp', N'GridUser', 'OBJECT' \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations
deleted file mode 100644
index 4e43653..0000000
--- a/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations
+++ /dev/null
@@ -1,279 +0,0 @@
1:VERSION 1
2
3BEGIN TRANSACTION
4
5CREATE TABLE [inventoryfolders] (
6 [folderID] [varchar](36) NOT NULL default '',
7 [agentID] [varchar](36) default NULL,
8 [parentFolderID] [varchar](36) default NULL,
9 [folderName] [varchar](64) default NULL,
10 [type] [smallint] NOT NULL default 0,
11 [version] [int] NOT NULL default 0,
12 PRIMARY KEY CLUSTERED
13(
14 [folderID] ASC
15)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
16) ON [PRIMARY]
17
18CREATE NONCLUSTERED INDEX [owner] ON [inventoryfolders]
19(
20 [agentID] ASC
21)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
22
23CREATE NONCLUSTERED INDEX [parent] ON [inventoryfolders]
24(
25 [parentFolderID] ASC
26)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
27
28
29CREATE TABLE [inventoryitems] (
30 [inventoryID] [varchar](36) NOT NULL default '',
31 [assetID] [varchar](36) default NULL,
32 [assetType] [int] default NULL,
33 [parentFolderID] [varchar](36) default NULL,
34 [avatarID] [varchar](36) default NULL,
35 [inventoryName] [varchar](64) default NULL,
36 [inventoryDescription] [varchar](128) default NULL,
37 [inventoryNextPermissions] [int] default NULL,
38 [inventoryCurrentPermissions] [int] default NULL,
39 [invType] [int] default NULL,
40 [creatorID] [varchar](36) default NULL,
41 [inventoryBasePermissions] [int] NOT NULL default 0,
42 [inventoryEveryOnePermissions] [int] NOT NULL default 0,
43 [salePrice] [int] default NULL,
44 [saleType] [tinyint] default NULL,
45 [creationDate] [int] default NULL,
46 [groupID] [varchar](36) default NULL,
47 [groupOwned] [bit] default NULL,
48 [flags] [int] default NULL,
49 PRIMARY KEY CLUSTERED
50(
51 [inventoryID] ASC
52)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
53) ON [PRIMARY]
54
55
56CREATE NONCLUSTERED INDEX [owner] ON [inventoryitems]
57(
58 [avatarID] ASC
59)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
60
61CREATE NONCLUSTERED INDEX [folder] ON [inventoryitems]
62(
63 [parentFolderID] ASC
64)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
65
66COMMIT
67
68
69:VERSION 2
70
71BEGIN TRANSACTION
72
73ALTER TABLE inventoryitems ADD inventoryGroupPermissions INTEGER NOT NULL default 0
74
75COMMIT
76
77:VERSION 3
78
79/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
80BEGIN TRANSACTION
81
82CREATE TABLE dbo.Tmp_inventoryfolders
83 (
84 folderID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
85 agentID uniqueidentifier NULL DEFAULT (NULL),
86 parentFolderID uniqueidentifier NULL DEFAULT (NULL),
87 folderName varchar(64) NULL DEFAULT (NULL),
88 type smallint NOT NULL DEFAULT ((0)),
89 version int NOT NULL DEFAULT ((0))
90 ) ON [PRIMARY]
91
92IF EXISTS(SELECT * FROM dbo.inventoryfolders)
93 EXEC('INSERT INTO dbo.Tmp_inventoryfolders (folderID, agentID, parentFolderID, folderName, type, version)
94 SELECT CONVERT(uniqueidentifier, folderID), CONVERT(uniqueidentifier, agentID), CONVERT(uniqueidentifier, parentFolderID), folderName, type, version FROM dbo.inventoryfolders WITH (HOLDLOCK TABLOCKX)')
95
96DROP TABLE dbo.inventoryfolders
97
98EXECUTE sp_rename N'dbo.Tmp_inventoryfolders', N'inventoryfolders', 'OBJECT'
99
100ALTER TABLE dbo.inventoryfolders ADD CONSTRAINT
101 PK__inventor__C2FABFB3173876EA PRIMARY KEY CLUSTERED
102 (
103 folderID
104 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
105
106CREATE NONCLUSTERED INDEX owner ON dbo.inventoryfolders
107 (
108 agentID
109 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
110
111CREATE NONCLUSTERED INDEX parent ON dbo.inventoryfolders
112 (
113 parentFolderID
114 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
115
116COMMIT
117
118
119:VERSION 4
120
121BEGIN TRANSACTION
122
123CREATE TABLE dbo.Tmp_inventoryitems
124 (
125 inventoryID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
126 assetID uniqueidentifier NULL DEFAULT (NULL),
127 assetType int NULL DEFAULT (NULL),
128 parentFolderID uniqueidentifier NULL DEFAULT (NULL),
129 avatarID uniqueidentifier NULL DEFAULT (NULL),
130 inventoryName varchar(64) NULL DEFAULT (NULL),
131 inventoryDescription varchar(128) NULL DEFAULT (NULL),
132 inventoryNextPermissions int NULL DEFAULT (NULL),
133 inventoryCurrentPermissions int NULL DEFAULT (NULL),
134 invType int NULL DEFAULT (NULL),
135 creatorID uniqueidentifier NULL DEFAULT (NULL),
136 inventoryBasePermissions int NOT NULL DEFAULT ((0)),
137 inventoryEveryOnePermissions int NOT NULL DEFAULT ((0)),
138 salePrice int NULL DEFAULT (NULL),
139 saleType tinyint NULL DEFAULT (NULL),
140 creationDate int NULL DEFAULT (NULL),
141 groupID uniqueidentifier NULL DEFAULT (NULL),
142 groupOwned bit NULL DEFAULT (NULL),
143 flags int NULL DEFAULT (NULL),
144 inventoryGroupPermissions int NOT NULL DEFAULT ((0))
145 ) ON [PRIMARY]
146
147IF EXISTS(SELECT * FROM dbo.inventoryitems)
148 EXEC('INSERT INTO dbo.Tmp_inventoryitems (inventoryID, assetID, assetType, parentFolderID, avatarID, inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, creatorID, inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, groupID, groupOwned, flags, inventoryGroupPermissions)
149 SELECT CONVERT(uniqueidentifier, inventoryID), CONVERT(uniqueidentifier, assetID), assetType, CONVERT(uniqueidentifier, parentFolderID), CONVERT(uniqueidentifier, avatarID), inventoryName, inventoryDescription, inventoryNextPermissions, inventoryCurrentPermissions, invType, CONVERT(uniqueidentifier, creatorID), inventoryBasePermissions, inventoryEveryOnePermissions, salePrice, saleType, creationDate, CONVERT(uniqueidentifier, groupID), groupOwned, flags, inventoryGroupPermissions FROM dbo.inventoryitems WITH (HOLDLOCK TABLOCKX)')
150
151DROP TABLE dbo.inventoryitems
152
153EXECUTE sp_rename N'dbo.Tmp_inventoryitems', N'inventoryitems', 'OBJECT'
154
155ALTER TABLE dbo.inventoryitems ADD CONSTRAINT
156 PK__inventor__C4B7BC2220C1E124 PRIMARY KEY CLUSTERED
157 (
158 inventoryID
159 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
160
161
162CREATE NONCLUSTERED INDEX owner ON dbo.inventoryitems
163 (
164 avatarID
165 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
166
167CREATE NONCLUSTERED INDEX folder ON dbo.inventoryitems
168 (
169 parentFolderID
170 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
171
172COMMIT
173
174:VERSION 5
175
176# It would be totally crazy to have to recreate the whole table just to change one column type,
177# just because MS SQL treats each DEFAULT as a constraint object that must be dropped
178# before anything can be done to the column. Since all defaults here are unnamed, there is
179# no easy way to drop them! The hairy piece of code below removes all DEFAULT constraints
180# from InventoryItems.
181
182# SO: anything that's NULLable is by default NULL, so please don't declare DEFAULT(NULL),
183# they do nothing but prevent changes to the columns. If you really
184# need to have DEFAULTs or other constraints, give them names so they can be dropped when needed!
185
186BEGIN TRANSACTION
187DECLARE @nm varchar(80);
188DECLARE x CURSOR LOCAL FORWARD_ONLY READ_ONLY
189 FOR SELECT name FROM sys.default_constraints where parent_object_id = OBJECT_ID('inventoryitems');
190OPEN x;
191FETCH NEXT FROM x INTO @nm;
192WHILE @@FETCH_STATUS = 0
193BEGIN
194 EXEC('alter table inventoryitems drop ' + @nm);
195 FETCH NEXT FROM x INTO @nm;
196END
197CLOSE x
198DEALLOCATE x
199COMMIT
200
201# all DEFAULTs dropped!
202
203:GO
204
205BEGIN TRANSACTION
206
207# Restoring defaults:
208# NOTE: [inventoryID] does NOT need one: it's NOT NULL PK and a unique Guid must be provided every time anyway!
209
210alter table inventoryitems
211 add constraint def_baseperm default 0 for inventoryBasePermissions
212alter table inventoryitems
213 add constraint def_allperm default 0 for inventoryEveryOnePermissions
214alter table inventoryitems
215 add constraint def_grpperm default 0 for inventoryGroupPermissions
216
217COMMIT
218
219:VERSION 7
220
221BEGIN TRANSACTION
222
223# CreatorID goes back to VARCHAR(36) (???)
224
225exec sp_rename 'inventoryitems.CreatorID', 'cr_old', 'COLUMN'
226
227:GO
228
229alter table inventoryitems
230 add creatorID varchar(36) NULL
231
232:GO
233
234update inventoryitems set creatorID = CONVERT(VARCHAR(36), cr_old)
235
236alter table inventoryitems
237 drop column cr_old
238
239COMMIT
240
241:VERSION 8
242
243ALTER TABLE inventoryitems
244ADD CONSTRAINT DF_inventoryitems_creatorID
245DEFAULT '00000000-0000-0000-0000-000000000000' FOR creatorID
246
247:GO
248
249:VERSION 9
250
251BEGIN TRANSACTION
252
253# CreatorID goes up to VARCHAR(255)
254
255exec sp_rename 'inventoryitems.CreatorID', 'cr_old', 'COLUMN'
256
257:GO
258
259alter table inventoryitems
260 add creatorID varchar(255) NULL
261
262:GO
263
264update inventoryitems set creatorID = cr_old
265
266alter table inventoryitems
267drop CONSTRAINT DF_inventoryitems_creatorID
268:GO
269
270alter table inventoryitems
271 drop column cr_old
272 :GO
273COMMIT
274
275ALTER TABLE inventoryitems
276ADD CONSTRAINT DF_inventoryitems_creatorID
277DEFAULT '00000000-0000-0000-0000-000000000000' FOR creatorID
278
279:GO \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/LogStore.migrations b/OpenSim/Data/MSSQL/Resources/LogStore.migrations
deleted file mode 100644
index 1430d8d..0000000
--- a/OpenSim/Data/MSSQL/Resources/LogStore.migrations
+++ /dev/null
@@ -1,19 +0,0 @@
1:VERSION 1
2
3BEGIN TRANSACTION
4
5CREATE TABLE [logs] (
6 [logID] [int] NOT NULL,
7 [target] [varchar](36) default NULL,
8 [server] [varchar](64) default NULL,
9 [method] [varchar](64) default NULL,
10 [arguments] [varchar](255) default NULL,
11 [priority] [int] default NULL,
12 [message] [ntext],
13 PRIMARY KEY CLUSTERED
14(
15 [logID] ASC
16)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
17) ON [PRIMARY]
18
19COMMIT
diff --git a/OpenSim/Data/MSSQL/Resources/Presence.migrations b/OpenSim/Data/MSSQL/Resources/Presence.migrations
deleted file mode 100644
index bcb6328..0000000
--- a/OpenSim/Data/MSSQL/Resources/Presence.migrations
+++ /dev/null
@@ -1,31 +0,0 @@
1:VERSION 1
2
3BEGIN TRANSACTION
4
5CREATE TABLE [Presence] (
6[UserID] varchar(255) NOT NULL,
7[RegionID] uniqueidentifier NOT NULL,
8[SessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
9[SecureSessionID] uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
10
11)
12 ON [PRIMARY]
13
14COMMIT
15
16:VERSION 2
17
18BEGIN TRANSACTION
19
20CREATE UNIQUE INDEX SessionID ON Presence(SessionID);
21CREATE INDEX UserID ON Presence(UserID);
22
23COMMIT
24
25:VERSION 2
26
27BEGIN TRANSACTION
28
29ALTER TABLE Presence ADD LastSeen DateTime
30
31COMMIT \ No newline at end of file
diff --git a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations b/OpenSim/Data/MSSQL/Resources/RegionStore.migrations
deleted file mode 100644
index 350e548..0000000
--- a/OpenSim/Data/MSSQL/Resources/RegionStore.migrations
+++ /dev/null
@@ -1,1150 +0,0 @@
1:VERSION 1
2
3CREATE TABLE [dbo].[prims](
4 [UUID] [varchar](255) NOT NULL,
5 [RegionUUID] [varchar](255) NULL,
6 [ParentID] [int] NULL,
7 [CreationDate] [int] NULL,
8 [Name] [varchar](255) NULL,
9 [SceneGroupID] [varchar](255) NULL,
10 [Text] [varchar](255) NULL,
11 [Description] [varchar](255) NULL,
12 [SitName] [varchar](255) NULL,
13 [TouchName] [varchar](255) NULL,
14 [ObjectFlags] [int] NULL,
15 [CreatorID] [varchar](255) NULL,
16 [OwnerID] [varchar](255) NULL,
17 [GroupID] [varchar](255) NULL,
18 [LastOwnerID] [varchar](255) NULL,
19 [OwnerMask] [int] NULL,
20 [NextOwnerMask] [int] NULL,
21 [GroupMask] [int] NULL,
22 [EveryoneMask] [int] NULL,
23 [BaseMask] [int] NULL,
24 [PositionX] [float] NULL,
25 [PositionY] [float] NULL,
26 [PositionZ] [float] NULL,
27 [GroupPositionX] [float] NULL,
28 [GroupPositionY] [float] NULL,
29 [GroupPositionZ] [float] NULL,
30 [VelocityX] [float] NULL,
31 [VelocityY] [float] NULL,
32 [VelocityZ] [float] NULL,
33 [AngularVelocityX] [float] NULL,
34 [AngularVelocityY] [float] NULL,
35 [AngularVelocityZ] [float] NULL,
36 [AccelerationX] [float] NULL,
37 [AccelerationY] [float] NULL,
38 [AccelerationZ] [float] NULL,
39 [RotationX] [float] NULL,
40 [RotationY] [float] NULL,
41 [RotationZ] [float] NULL,
42 [RotationW] [float] NULL,
43 [SitTargetOffsetX] [float] NULL,
44 [SitTargetOffsetY] [float] NULL,
45 [SitTargetOffsetZ] [float] NULL,
46 [SitTargetOrientW] [float] NULL,
47 [SitTargetOrientX] [float] NULL,
48 [SitTargetOrientY] [float] NULL,
49 [SitTargetOrientZ] [float] NULL,
50PRIMARY KEY CLUSTERED
51(
52 [UUID] ASC
53)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
54) ON [PRIMARY]
55
56CREATE TABLE [dbo].[primshapes](
57 [UUID] [varchar](255) NOT NULL,
58 [Shape] [int] NULL,
59 [ScaleX] [float] NULL,
60 [ScaleY] [float] NULL,
61 [ScaleZ] [float] NULL,
62 [PCode] [int] NULL,
63 [PathBegin] [int] NULL,
64 [PathEnd] [int] NULL,
65 [PathScaleX] [int] NULL,
66 [PathScaleY] [int] NULL,
67 [PathShearX] [int] NULL,
68 [PathShearY] [int] NULL,
69 [PathSkew] [int] NULL,
70 [PathCurve] [int] NULL,
71 [PathRadiusOffset] [int] NULL,
72 [PathRevolutions] [int] NULL,
73 [PathTaperX] [int] NULL,
74 [PathTaperY] [int] NULL,
75 [PathTwist] [int] NULL,
76 [PathTwistBegin] [int] NULL,
77 [ProfileBegin] [int] NULL,
78 [ProfileEnd] [int] NULL,
79 [ProfileCurve] [int] NULL,
80 [ProfileHollow] [int] NULL,
81 [State] [int] NULL,
82 [Texture] [image] NULL,
83 [ExtraParams] [image] NULL,
84PRIMARY KEY CLUSTERED
85(
86 [UUID] ASC
87)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
88) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
89
90CREATE TABLE [dbo].[primitems](
91 [itemID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
92 [primID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
93 [assetID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
94 [parentFolderID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
95 [invType] [int] NULL,
96 [assetType] [int] NULL,
97 [name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
98 [description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
99 [creationDate] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
100 [creatorID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
101 [ownerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
102 [lastOwnerID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
103 [groupID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
104 [nextPermissions] [int] NULL,
105 [currentPermissions] [int] NULL,
106 [basePermissions] [int] NULL,
107 [everyonePermissions] [int] NULL,
108 [groupPermissions] [int] NULL,
109PRIMARY KEY CLUSTERED
110(
111 [itemID] ASC
112)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
113) ON [PRIMARY]
114
115CREATE TABLE [dbo].[terrain](
116 [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
117 [Revision] [int] NULL,
118 [Heightfield] [image] NULL
119) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
120
121CREATE TABLE [dbo].[land](
122 [UUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
123 [RegionUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
124 [LocalLandID] [int] NULL,
125 [Bitmap] [image] NULL,
126 [Name] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
127 [Description] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
128 [OwnerUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
129 [IsGroupOwned] [int] NULL,
130 [Area] [int] NULL,
131 [AuctionID] [int] NULL,
132 [Category] [int] NULL,
133 [ClaimDate] [int] NULL,
134 [ClaimPrice] [int] NULL,
135 [GroupUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
136 [SalePrice] [int] NULL,
137 [LandStatus] [int] NULL,
138 [LandFlags] [int] NULL,
139 [LandingType] [int] NULL,
140 [MediaAutoScale] [int] NULL,
141 [MediaTextureUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
142 [MediaURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
143 [MusicURL] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
144 [PassHours] [float] NULL,
145 [PassPrice] [int] NULL,
146 [SnapshotUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
147 [UserLocationX] [float] NULL,
148 [UserLocationY] [float] NULL,
149 [UserLocationZ] [float] NULL,
150 [UserLookAtX] [float] NULL,
151 [UserLookAtY] [float] NULL,
152 [UserLookAtZ] [float] NULL,
153PRIMARY KEY CLUSTERED
154(
155 [UUID] ASC
156)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
157) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
158
159CREATE TABLE [dbo].[landaccesslist](
160 [LandUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
161 [AccessUUID] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
162 [Flags] [int] NULL
163) ON [PRIMARY]
164
165:VERSION 2
166
167BEGIN TRANSACTION
168
169CREATE TABLE regionban (
170 [regionUUID] VARCHAR(36) NOT NULL,
171 [bannedUUID] VARCHAR(36) NOT NULL,
172 [bannedIp] VARCHAR(16) NOT NULL,
173 [bannedIpHostMask] VARCHAR(16) NOT NULL)
174
175create table [dbo].[regionsettings] (
176 [regionUUID] [varchar](36) not null,
177 [block_terraform] [bit] not null,
178 [block_fly] [bit] not null,
179 [allow_damage] [bit] not null,
180 [restrict_pushing] [bit] not null,
181 [allow_land_resell] [bit] not null,
182 [allow_land_join_divide] [bit] not null,
183 [block_show_in_search] [bit] not null,
184 [agent_limit] [int] not null,
185 [object_bonus] [float] not null,
186 [maturity] [int] not null,
187 [disable_scripts] [bit] not null,
188 [disable_collisions] [bit] not null,
189 [disable_physics] [bit] not null,
190 [terrain_texture_1] [varchar](36) not null,
191 [terrain_texture_2] [varchar](36) not null,
192 [terrain_texture_3] [varchar](36) not null,
193 [terrain_texture_4] [varchar](36) not null,
194 [elevation_1_nw] [float] not null,
195 [elevation_2_nw] [float] not null,
196 [elevation_1_ne] [float] not null,
197 [elevation_2_ne] [float] not null,
198 [elevation_1_se] [float] not null,
199 [elevation_2_se] [float] not null,
200 [elevation_1_sw] [float] not null,
201 [elevation_2_sw] [float] not null,
202 [water_height] [float] not null,
203 [terrain_raise_limit] [float] not null,
204 [terrain_lower_limit] [float] not null,
205 [use_estate_sun] [bit] not null,
206 [fixed_sun] [bit] not null,
207 [sun_position] [float] not null,
208 [covenant] [varchar](36) default NULL,
209 [Sandbox] [bit] NOT NULL,
210PRIMARY KEY CLUSTERED
211(
212 [regionUUID] ASC
213)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
214) ON [PRIMARY]
215
216COMMIT
217
218:VERSION 3
219
220BEGIN TRANSACTION
221
222CREATE TABLE dbo.Tmp_prims
223 (
224 UUID varchar(36) NOT NULL,
225 RegionUUID varchar(36) NULL,
226 ParentID int NULL,
227 CreationDate int NULL,
228 Name varchar(255) NULL,
229 SceneGroupID varchar(36) NULL,
230 Text varchar(255) NULL,
231 Description varchar(255) NULL,
232 SitName varchar(255) NULL,
233 TouchName varchar(255) NULL,
234 ObjectFlags int NULL,
235 CreatorID varchar(36) NULL,
236 OwnerID varchar(36) NULL,
237 GroupID varchar(36) NULL,
238 LastOwnerID varchar(36) NULL,
239 OwnerMask int NULL,
240 NextOwnerMask int NULL,
241 GroupMask int NULL,
242 EveryoneMask int NULL,
243 BaseMask int NULL,
244 PositionX float(53) NULL,
245 PositionY float(53) NULL,
246 PositionZ float(53) NULL,
247 GroupPositionX float(53) NULL,
248 GroupPositionY float(53) NULL,
249 GroupPositionZ float(53) NULL,
250 VelocityX float(53) NULL,
251 VelocityY float(53) NULL,
252 VelocityZ float(53) NULL,
253 AngularVelocityX float(53) NULL,
254 AngularVelocityY float(53) NULL,
255 AngularVelocityZ float(53) NULL,
256 AccelerationX float(53) NULL,
257 AccelerationY float(53) NULL,
258 AccelerationZ float(53) NULL,
259 RotationX float(53) NULL,
260 RotationY float(53) NULL,
261 RotationZ float(53) NULL,
262 RotationW float(53) NULL,
263 SitTargetOffsetX float(53) NULL,
264 SitTargetOffsetY float(53) NULL,
265 SitTargetOffsetZ float(53) NULL,
266 SitTargetOrientW float(53) NULL,
267 SitTargetOrientX float(53) NULL,
268 SitTargetOrientY float(53) NULL,
269 SitTargetOrientZ float(53) NULL
270 ) ON [PRIMARY]
271
272IF EXISTS(SELECT * FROM dbo.prims)
273 EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ)
274 SELECT CONVERT(varchar(36), UUID), CONVERT(varchar(36), RegionUUID), ParentID, CreationDate, Name, CONVERT(varchar(36), SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(varchar(36), CreatorID), CONVERT(varchar(36), OwnerID), CONVERT(varchar(36), GroupID), CONVERT(varchar(36), LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ FROM dbo.prims WITH (HOLDLOCK TABLOCKX)')
275
276DROP TABLE dbo.prims
277
278EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT'
279
280ALTER TABLE dbo.prims ADD CONSTRAINT
281 PK__prims__10566F31 PRIMARY KEY CLUSTERED
282 (
283 UUID
284 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
285
286COMMIT
287
288:VERSION 4
289
290BEGIN TRANSACTION
291
292CREATE TABLE Tmp_primitems
293 (
294 itemID varchar(36) NOT NULL,
295 primID varchar(36) NULL,
296 assetID varchar(36) NULL,
297 parentFolderID varchar(36) NULL,
298 invType int NULL,
299 assetType int NULL,
300 name varchar(255) NULL,
301 description varchar(255) NULL,
302 creationDate varchar(255) NULL,
303 creatorID varchar(36) NULL,
304 ownerID varchar(36) NULL,
305 lastOwnerID varchar(36) NULL,
306 groupID varchar(36) NULL,
307 nextPermissions int NULL,
308 currentPermissions int NULL,
309 basePermissions int NULL,
310 everyonePermissions int NULL,
311 groupPermissions int NULL
312 ) ON [PRIMARY]
313
314IF EXISTS(SELECT * FROM primitems)
315 EXEC('INSERT INTO Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions)
316 SELECT CONVERT(varchar(36), itemID), CONVERT(varchar(36), primID), CONVERT(varchar(36), assetID), CONVERT(varchar(36), parentFolderID), invType, assetType, name, description, creationDate, CONVERT(varchar(36), creatorID), CONVERT(varchar(36), ownerID), CONVERT(varchar(36), lastOwnerID), CONVERT(varchar(36), groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions')
317
318DROP TABLE primitems
319
320EXECUTE sp_rename N'Tmp_primitems', N'primitems', 'OBJECT'
321
322ALTER TABLE primitems ADD CONSTRAINT
323 PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED
324 (
325 itemID
326 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
327
328
329COMMIT
330
331
332:VERSION 5
333
334BEGIN TRANSACTION
335
336CREATE TABLE Tmp_primshapes
337 (
338 UUID varchar(36) NOT NULL,
339 Shape int NULL,
340 ScaleX float(53) NULL,
341 ScaleY float(53) NULL,
342 ScaleZ float(53) NULL,
343 PCode int NULL,
344 PathBegin int NULL,
345 PathEnd int NULL,
346 PathScaleX int NULL,
347 PathScaleY int NULL,
348 PathShearX int NULL,
349 PathShearY int NULL,
350 PathSkew int NULL,
351 PathCurve int NULL,
352 PathRadiusOffset int NULL,
353 PathRevolutions int NULL,
354 PathTaperX int NULL,
355 PathTaperY int NULL,
356 PathTwist int NULL,
357 PathTwistBegin int NULL,
358 ProfileBegin int NULL,
359 ProfileEnd int NULL,
360 ProfileCurve int NULL,
361 ProfileHollow int NULL,
362 State int NULL,
363 Texture image NULL,
364 ExtraParams image NULL
365 ) ON [PRIMARY]
366 TEXTIMAGE_ON [PRIMARY]
367
368IF EXISTS(SELECT * FROM primshapes)
369 EXEC('INSERT INTO Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams)
370 SELECT CONVERT(varchar(36), UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM primshapes WITH (HOLDLOCK TABLOCKX)')
371
372DROP TABLE primshapes
373
374EXECUTE sp_rename N'Tmp_primshapes', N'primshapes', 'OBJECT'
375
376ALTER TABLE primshapes ADD CONSTRAINT
377 PK__primshapes__0880433F PRIMARY KEY CLUSTERED
378 (
379 UUID
380 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
381
382COMMIT
383
384
385:VERSION 6
386
387BEGIN TRANSACTION
388
389ALTER TABLE prims ADD PayPrice int not null default 0
390ALTER TABLE prims ADD PayButton1 int not null default 0
391ALTER TABLE prims ADD PayButton2 int not null default 0
392ALTER TABLE prims ADD PayButton3 int not null default 0
393ALTER TABLE prims ADD PayButton4 int not null default 0
394ALTER TABLE prims ADD LoopedSound varchar(36) not null default '00000000-0000-0000-0000-000000000000';
395ALTER TABLE prims ADD LoopedSoundGain float not null default 0.0;
396ALTER TABLE prims ADD TextureAnimation image
397ALTER TABLE prims ADD OmegaX float not null default 0.0
398ALTER TABLE prims ADD OmegaY float not null default 0.0
399ALTER TABLE prims ADD OmegaZ float not null default 0.0
400ALTER TABLE prims ADD CameraEyeOffsetX float not null default 0.0
401ALTER TABLE prims ADD CameraEyeOffsetY float not null default 0.0
402ALTER TABLE prims ADD CameraEyeOffsetZ float not null default 0.0
403ALTER TABLE prims ADD CameraAtOffsetX float not null default 0.0
404ALTER TABLE prims ADD CameraAtOffsetY float not null default 0.0
405ALTER TABLE prims ADD CameraAtOffsetZ float not null default 0.0
406ALTER TABLE prims ADD ForceMouselook tinyint not null default 0
407ALTER TABLE prims ADD ScriptAccessPin int not null default 0
408ALTER TABLE prims ADD AllowedDrop tinyint not null default 0
409ALTER TABLE prims ADD DieAtEdge tinyint not null default 0
410ALTER TABLE prims ADD SalePrice int not null default 10
411ALTER TABLE prims ADD SaleType tinyint not null default 0
412
413ALTER TABLE primitems add flags integer not null default 0
414
415ALTER TABLE land ADD AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'
416
417CREATE index prims_regionuuid on prims(RegionUUID)
418CREATE index prims_parentid on prims(ParentID)
419
420CREATE index primitems_primid on primitems(primID)
421
422COMMIT
423
424
425:VERSION 7
426
427BEGIN TRANSACTION
428
429ALTER TABLE prims ADD ColorR int not null default 0;
430ALTER TABLE prims ADD ColorG int not null default 0;
431ALTER TABLE prims ADD ColorB int not null default 0;
432ALTER TABLE prims ADD ColorA int not null default 0;
433ALTER TABLE prims ADD ParticleSystem IMAGE;
434ALTER TABLE prims ADD ClickAction tinyint NOT NULL default 0;
435
436COMMIT
437
438
439:VERSION 8
440
441BEGIN TRANSACTION
442
443ALTER TABLE land ADD OtherCleanTime integer NOT NULL default 0;
444ALTER TABLE land ADD Dwell integer NOT NULL default 0;
445
446COMMIT
447
448:VERSION 9
449
450BEGIN TRANSACTION
451
452ALTER TABLE prims ADD Material tinyint NOT NULL default 3
453
454COMMIT
455
456
457:VERSION 10
458
459BEGIN TRANSACTION
460
461ALTER TABLE regionsettings ADD sunvectorx float NOT NULL default 0;
462ALTER TABLE regionsettings ADD sunvectory float NOT NULL default 0;
463ALTER TABLE regionsettings ADD sunvectorz float NOT NULL default 0;
464
465COMMIT
466
467
468:VERSION 11
469
470BEGIN TRANSACTION
471
472ALTER TABLE prims ADD CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000'
473ALTER TABLE prims ADD CollisionSoundVolume float not null default 0.0
474
475COMMIT
476
477
478:VERSION 12
479
480BEGIN TRANSACTION
481
482ALTER TABLE prims ADD LinkNumber integer not null default 0
483
484COMMIT
485
486
487:VERSION 13
488
489BEGIN TRANSACTION
490
491CREATE TABLE dbo.Tmp_prims
492 (
493 UUID uniqueidentifier NOT NULL,
494 RegionUUID uniqueidentifier NULL,
495 ParentID int NULL,
496 CreationDate int NULL,
497 Name varchar(255) NULL,
498 SceneGroupID uniqueidentifier NULL,
499 Text varchar(255) NULL,
500 Description varchar(255) NULL,
501 SitName varchar(255) NULL,
502 TouchName varchar(255) NULL,
503 ObjectFlags int NULL,
504 CreatorID uniqueidentifier NULL,
505 OwnerID uniqueidentifier NULL,
506 GroupID uniqueidentifier NULL,
507 LastOwnerID uniqueidentifier NULL,
508 OwnerMask int NULL,
509 NextOwnerMask int NULL,
510 GroupMask int NULL,
511 EveryoneMask int NULL,
512 BaseMask int NULL,
513 PositionX float(53) NULL,
514 PositionY float(53) NULL,
515 PositionZ float(53) NULL,
516 GroupPositionX float(53) NULL,
517 GroupPositionY float(53) NULL,
518 GroupPositionZ float(53) NULL,
519 VelocityX float(53) NULL,
520 VelocityY float(53) NULL,
521 VelocityZ float(53) NULL,
522 AngularVelocityX float(53) NULL,
523 AngularVelocityY float(53) NULL,
524 AngularVelocityZ float(53) NULL,
525 AccelerationX float(53) NULL,
526 AccelerationY float(53) NULL,
527 AccelerationZ float(53) NULL,
528 RotationX float(53) NULL,
529 RotationY float(53) NULL,
530 RotationZ float(53) NULL,
531 RotationW float(53) NULL,
532 SitTargetOffsetX float(53) NULL,
533 SitTargetOffsetY float(53) NULL,
534 SitTargetOffsetZ float(53) NULL,
535 SitTargetOrientW float(53) NULL,
536 SitTargetOrientX float(53) NULL,
537 SitTargetOrientY float(53) NULL,
538 SitTargetOrientZ float(53) NULL,
539 PayPrice int NOT NULL DEFAULT ((0)),
540 PayButton1 int NOT NULL DEFAULT ((0)),
541 PayButton2 int NOT NULL DEFAULT ((0)),
542 PayButton3 int NOT NULL DEFAULT ((0)),
543 PayButton4 int NOT NULL DEFAULT ((0)),
544 LoopedSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
545 LoopedSoundGain float(53) NOT NULL DEFAULT ((0.0)),
546 TextureAnimation image NULL,
547 OmegaX float(53) NOT NULL DEFAULT ((0.0)),
548 OmegaY float(53) NOT NULL DEFAULT ((0.0)),
549 OmegaZ float(53) NOT NULL DEFAULT ((0.0)),
550 CameraEyeOffsetX float(53) NOT NULL DEFAULT ((0.0)),
551 CameraEyeOffsetY float(53) NOT NULL DEFAULT ((0.0)),
552 CameraEyeOffsetZ float(53) NOT NULL DEFAULT ((0.0)),
553 CameraAtOffsetX float(53) NOT NULL DEFAULT ((0.0)),
554 CameraAtOffsetY float(53) NOT NULL DEFAULT ((0.0)),
555 CameraAtOffsetZ float(53) NOT NULL DEFAULT ((0.0)),
556 ForceMouselook tinyint NOT NULL DEFAULT ((0)),
557 ScriptAccessPin int NOT NULL DEFAULT ((0)),
558 AllowedDrop tinyint NOT NULL DEFAULT ((0)),
559 DieAtEdge tinyint NOT NULL DEFAULT ((0)),
560 SalePrice int NOT NULL DEFAULT ((10)),
561 SaleType tinyint NOT NULL DEFAULT ((0)),
562 ColorR int NOT NULL DEFAULT ((0)),
563 ColorG int NOT NULL DEFAULT ((0)),
564 ColorB int NOT NULL DEFAULT ((0)),
565 ColorA int NOT NULL DEFAULT ((0)),
566 ParticleSystem image NULL,
567 ClickAction tinyint NOT NULL DEFAULT ((0)),
568 Material tinyint NOT NULL DEFAULT ((3)),
569 CollisionSound uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
570 CollisionSoundVolume float(53) NOT NULL DEFAULT ((0.0)),
571 LinkNumber int NOT NULL DEFAULT ((0))
572 ) ON [PRIMARY]
573 TEXTIMAGE_ON [PRIMARY]
574
575IF EXISTS(SELECT * FROM dbo.prims)
576 EXEC('INSERT INTO dbo.Tmp_prims (UUID, RegionUUID, ParentID, CreationDate, Name, SceneGroupID, Text, Description, SitName, TouchName, ObjectFlags, CreatorID, OwnerID, GroupID, LastOwnerID, OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, LinkNumber)
577 SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), ParentID, CreationDate, Name, CONVERT(uniqueidentifier, SceneGroupID), Text, Description, SitName, TouchName, ObjectFlags, CONVERT(uniqueidentifier, CreatorID), CONVERT(uniqueidentifier, OwnerID), CONVERT(uniqueidentifier, GroupID), CONVERT(uniqueidentifier, LastOwnerID), OwnerMask, NextOwnerMask, GroupMask, EveryoneMask, BaseMask, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ, VelocityX, VelocityY, VelocityZ, AngularVelocityX, AngularVelocityY, AngularVelocityZ, AccelerationX, AccelerationY, AccelerationZ, RotationX, RotationY, RotationZ, RotationW, SitTargetOffsetX, SitTargetOffsetY, SitTargetOffsetZ, SitTargetOrientW, SitTargetOrientX, SitTargetOrientY, SitTargetOrientZ, PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, CONVERT(uniqueidentifier, LoopedSound), LoopedSoundGain, TextureAnimation, OmegaX, OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ, ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA, ParticleSystem, ClickAction, Material, CONVERT(uniqueidentifier, CollisionSound), CollisionSoundVolume, LinkNumber FROM dbo.prims WITH (HOLDLOCK TABLOCKX)')
578
579DROP TABLE dbo.prims
580
581EXECUTE sp_rename N'dbo.Tmp_prims', N'prims', 'OBJECT'
582
583ALTER TABLE dbo.prims ADD CONSTRAINT
584 PK__prims__10566F31 PRIMARY KEY CLUSTERED
585 (
586 UUID
587 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
588
589
590CREATE NONCLUSTERED INDEX prims_regionuuid ON dbo.prims
591 (
592 RegionUUID
593 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
594
595CREATE NONCLUSTERED INDEX prims_parentid ON dbo.prims
596 (
597 ParentID
598 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
599
600COMMIT
601
602
603:VERSION 14
604
605BEGIN TRANSACTION
606
607CREATE TABLE dbo.Tmp_primshapes
608 (
609 UUID uniqueidentifier NOT NULL,
610 Shape int NULL,
611 ScaleX float(53) NULL,
612 ScaleY float(53) NULL,
613 ScaleZ float(53) NULL,
614 PCode int NULL,
615 PathBegin int NULL,
616 PathEnd int NULL,
617 PathScaleX int NULL,
618 PathScaleY int NULL,
619 PathShearX int NULL,
620 PathShearY int NULL,
621 PathSkew int NULL,
622 PathCurve int NULL,
623 PathRadiusOffset int NULL,
624 PathRevolutions int NULL,
625 PathTaperX int NULL,
626 PathTaperY int NULL,
627 PathTwist int NULL,
628 PathTwistBegin int NULL,
629 ProfileBegin int NULL,
630 ProfileEnd int NULL,
631 ProfileCurve int NULL,
632 ProfileHollow int NULL,
633 State int NULL,
634 Texture image NULL,
635 ExtraParams image NULL
636 ) ON [PRIMARY]
637 TEXTIMAGE_ON [PRIMARY]
638
639IF EXISTS(SELECT * FROM dbo.primshapes)
640 EXEC('INSERT INTO dbo.Tmp_primshapes (UUID, Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams)
641 SELECT CONVERT(uniqueidentifier, UUID), Shape, ScaleX, ScaleY, ScaleZ, PCode, PathBegin, PathEnd, PathScaleX, PathScaleY, PathShearX, PathShearY, PathSkew, PathCurve, PathRadiusOffset, PathRevolutions, PathTaperX, PathTaperY, PathTwist, PathTwistBegin, ProfileBegin, ProfileEnd, ProfileCurve, ProfileHollow, State, Texture, ExtraParams FROM dbo.primshapes WITH (HOLDLOCK TABLOCKX)')
642
643DROP TABLE dbo.primshapes
644
645EXECUTE sp_rename N'dbo.Tmp_primshapes', N'primshapes', 'OBJECT'
646
647ALTER TABLE dbo.primshapes ADD CONSTRAINT
648 PK__primshapes__0880433F PRIMARY KEY CLUSTERED
649 (
650 UUID
651 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
652
653COMMIT
654
655
656:VERSION 15
657
658BEGIN TRANSACTION
659
660CREATE TABLE dbo.Tmp_primitems
661 (
662 itemID uniqueidentifier NOT NULL,
663 primID uniqueidentifier NULL,
664 assetID uniqueidentifier NULL,
665 parentFolderID uniqueidentifier NULL,
666 invType int NULL,
667 assetType int NULL,
668 name varchar(255) NULL,
669 description varchar(255) NULL,
670 creationDate varchar(255) NULL,
671 creatorID uniqueidentifier NULL,
672 ownerID uniqueidentifier NULL,
673 lastOwnerID uniqueidentifier NULL,
674 groupID uniqueidentifier NULL,
675 nextPermissions int NULL,
676 currentPermissions int NULL,
677 basePermissions int NULL,
678 everyonePermissions int NULL,
679 groupPermissions int NULL,
680 flags int NOT NULL DEFAULT ((0))
681 ) ON [PRIMARY]
682
683IF EXISTS(SELECT * FROM dbo.primitems)
684 EXEC('INSERT INTO dbo.Tmp_primitems (itemID, primID, assetID, parentFolderID, invType, assetType, name, description, creationDate, creatorID, ownerID, lastOwnerID, groupID, nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags)
685 SELECT CONVERT(uniqueidentifier, itemID), CONVERT(uniqueidentifier, primID), CONVERT(uniqueidentifier, assetID), CONVERT(uniqueidentifier, parentFolderID), invType, assetType, name, description, creationDate, CONVERT(uniqueidentifier, creatorID), CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, lastOwnerID), CONVERT(uniqueidentifier, groupID), nextPermissions, currentPermissions, basePermissions, everyonePermissions, groupPermissions, flags FROM dbo.primitems WITH (HOLDLOCK TABLOCKX)')
686
687DROP TABLE dbo.primitems
688
689EXECUTE sp_rename N'dbo.Tmp_primitems', N'primitems', 'OBJECT'
690
691ALTER TABLE dbo.primitems ADD CONSTRAINT
692 PK__primitems__0A688BB1 PRIMARY KEY CLUSTERED
693 (
694 itemID
695 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
696
697CREATE NONCLUSTERED INDEX primitems_primid ON dbo.primitems
698 (
699 primID
700 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
701
702COMMIT
703
704
705:VERSION 16
706
707
708BEGIN TRANSACTION
709
710CREATE TABLE dbo.Tmp_terrain
711 (
712 RegionUUID uniqueidentifier NULL,
713 Revision int NULL,
714 Heightfield image NULL
715 ) ON [PRIMARY]
716 TEXTIMAGE_ON [PRIMARY]
717
718IF EXISTS(SELECT * FROM dbo.terrain)
719 EXEC('INSERT INTO dbo.Tmp_terrain (RegionUUID, Revision, Heightfield)
720 SELECT CONVERT(uniqueidentifier, RegionUUID), Revision, Heightfield FROM dbo.terrain WITH (HOLDLOCK TABLOCKX)')
721
722DROP TABLE dbo.terrain
723
724EXECUTE sp_rename N'dbo.Tmp_terrain', N'terrain', 'OBJECT'
725
726COMMIT
727
728
729:VERSION 17
730
731BEGIN TRANSACTION
732
733CREATE TABLE dbo.Tmp_land
734 (
735 UUID uniqueidentifier NOT NULL,
736 RegionUUID uniqueidentifier NULL,
737 LocalLandID int NULL,
738 Bitmap image NULL,
739 Name varchar(255) NULL,
740 Description varchar(255) NULL,
741 OwnerUUID uniqueidentifier NULL,
742 IsGroupOwned int NULL,
743 Area int NULL,
744 AuctionID int NULL,
745 Category int NULL,
746 ClaimDate int NULL,
747 ClaimPrice int NULL,
748 GroupUUID uniqueidentifier NULL,
749 SalePrice int NULL,
750 LandStatus int NULL,
751 LandFlags int NULL,
752 LandingType int NULL,
753 MediaAutoScale int NULL,
754 MediaTextureUUID uniqueidentifier NULL,
755 MediaURL varchar(255) NULL,
756 MusicURL varchar(255) NULL,
757 PassHours float(53) NULL,
758 PassPrice int NULL,
759 SnapshotUUID uniqueidentifier NULL,
760 UserLocationX float(53) NULL,
761 UserLocationY float(53) NULL,
762 UserLocationZ float(53) NULL,
763 UserLookAtX float(53) NULL,
764 UserLookAtY float(53) NULL,
765 UserLookAtZ float(53) NULL,
766 AuthbuyerID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
767 OtherCleanTime int NOT NULL DEFAULT ((0)),
768 Dwell int NOT NULL DEFAULT ((0))
769 ) ON [PRIMARY]
770 TEXTIMAGE_ON [PRIMARY]
771
772IF EXISTS(SELECT * FROM dbo.land)
773 EXEC('INSERT INTO dbo.Tmp_land (UUID, RegionUUID, LocalLandID, Bitmap, Name, Description, OwnerUUID, IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, GroupUUID, SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, MediaTextureUUID, MediaURL, MusicURL, PassHours, PassPrice, SnapshotUUID, UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, AuthbuyerID, OtherCleanTime, Dwell)
774 SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, RegionUUID), LocalLandID, Bitmap, Name, Description, CONVERT(uniqueidentifier, OwnerUUID), IsGroupOwned, Area, AuctionID, Category, ClaimDate, ClaimPrice, CONVERT(uniqueidentifier, GroupUUID), SalePrice, LandStatus, LandFlags, LandingType, MediaAutoScale, CONVERT(uniqueidentifier, MediaTextureUUID), MediaURL, MusicURL, PassHours, PassPrice, CONVERT(uniqueidentifier, SnapshotUUID), UserLocationX, UserLocationY, UserLocationZ, UserLookAtX, UserLookAtY, UserLookAtZ, CONVERT(uniqueidentifier, AuthbuyerID), OtherCleanTime, Dwell FROM dbo.land WITH (HOLDLOCK TABLOCKX)')
775
776DROP TABLE dbo.land
777
778EXECUTE sp_rename N'dbo.Tmp_land', N'land', 'OBJECT'
779
780ALTER TABLE dbo.land ADD CONSTRAINT
781 PK__land__65A475E71BFD2C07 PRIMARY KEY CLUSTERED
782 (
783 UUID
784 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
785
786COMMIT
787
788
789
790:VERSION 18
791
792BEGIN TRANSACTION
793
794CREATE TABLE dbo.Tmp_landaccesslist
795 (
796 LandUUID uniqueidentifier NULL,
797 AccessUUID uniqueidentifier NULL,
798 Flags int NULL
799 ) ON [PRIMARY]
800
801IF EXISTS(SELECT * FROM dbo.landaccesslist)
802 EXEC('INSERT INTO dbo.Tmp_landaccesslist (LandUUID, AccessUUID, Flags)
803 SELECT CONVERT(uniqueidentifier, LandUUID), CONVERT(uniqueidentifier, AccessUUID), Flags FROM dbo.landaccesslist WITH (HOLDLOCK TABLOCKX)')
804
805DROP TABLE dbo.landaccesslist
806
807EXECUTE sp_rename N'dbo.Tmp_landaccesslist', N'landaccesslist', 'OBJECT'
808
809COMMIT
810
811
812
813:VERSION 19
814
815BEGIN TRANSACTION
816
817CREATE TABLE dbo.Tmp_regionban
818 (
819 regionUUID uniqueidentifier NOT NULL,
820 bannedUUID uniqueidentifier NOT NULL,
821 bannedIp varchar(16) NOT NULL,
822 bannedIpHostMask varchar(16) NOT NULL
823 ) ON [PRIMARY]
824
825IF EXISTS(SELECT * FROM dbo.regionban)
826 EXEC('INSERT INTO dbo.Tmp_regionban (regionUUID, bannedUUID, bannedIp, bannedIpHostMask)
827 SELECT CONVERT(uniqueidentifier, regionUUID), CONVERT(uniqueidentifier, bannedUUID), bannedIp, bannedIpHostMask FROM dbo.regionban WITH (HOLDLOCK TABLOCKX)')
828
829DROP TABLE dbo.regionban
830
831EXECUTE sp_rename N'dbo.Tmp_regionban', N'regionban', 'OBJECT'
832
833COMMIT
834
835
836:VERSION 20
837
838BEGIN TRANSACTION
839
840CREATE TABLE dbo.Tmp_regionsettings
841 (
842 regionUUID uniqueidentifier NOT NULL,
843 block_terraform bit NOT NULL,
844 block_fly bit NOT NULL,
845 allow_damage bit NOT NULL,
846 restrict_pushing bit NOT NULL,
847 allow_land_resell bit NOT NULL,
848 allow_land_join_divide bit NOT NULL,
849 block_show_in_search bit NOT NULL,
850 agent_limit int NOT NULL,
851 object_bonus float(53) NOT NULL,
852 maturity int NOT NULL,
853 disable_scripts bit NOT NULL,
854 disable_collisions bit NOT NULL,
855 disable_physics bit NOT NULL,
856 terrain_texture_1 uniqueidentifier NOT NULL,
857 terrain_texture_2 uniqueidentifier NOT NULL,
858 terrain_texture_3 uniqueidentifier NOT NULL,
859 terrain_texture_4 uniqueidentifier NOT NULL,
860 elevation_1_nw float(53) NOT NULL,
861 elevation_2_nw float(53) NOT NULL,
862 elevation_1_ne float(53) NOT NULL,
863 elevation_2_ne float(53) NOT NULL,
864 elevation_1_se float(53) NOT NULL,
865 elevation_2_se float(53) NOT NULL,
866 elevation_1_sw float(53) NOT NULL,
867 elevation_2_sw float(53) NOT NULL,
868 water_height float(53) NOT NULL,
869 terrain_raise_limit float(53) NOT NULL,
870 terrain_lower_limit float(53) NOT NULL,
871 use_estate_sun bit NOT NULL,
872 fixed_sun bit NOT NULL,
873 sun_position float(53) NOT NULL,
874 covenant uniqueidentifier NULL DEFAULT (NULL),
875 Sandbox bit NOT NULL,
876 sunvectorx float(53) NOT NULL DEFAULT ((0)),
877 sunvectory float(53) NOT NULL DEFAULT ((0)),
878 sunvectorz float(53) NOT NULL DEFAULT ((0))
879 ) ON [PRIMARY]
880
881IF EXISTS(SELECT * FROM dbo.regionsettings)
882 EXEC('INSERT INTO dbo.Tmp_regionsettings (regionUUID, block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, terrain_texture_1, terrain_texture_2, terrain_texture_3, terrain_texture_4, elevation_1_nw, elevation_2_nw, elevation_1_ne, elevation_2_ne, elevation_1_se, elevation_2_se, elevation_1_sw, elevation_2_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, covenant, Sandbox, sunvectorx, sunvectory, sunvectorz)
883 SELECT CONVERT(uniqueidentifier, regionUUID), block_terraform, block_fly, allow_damage, restrict_pushing, allow_land_resell, allow_land_join_divide, block_show_in_search, agent_limit, object_bonus, maturity, disable_scripts, disable_collisions, disable_physics, CONVERT(uniqueidentifier, terrain_texture_1), CONVERT(uniqueidentifier, terrain_texture_2), CONVERT(uniqueidentifier, terrain_texture_3), CONVERT(uniqueidentifier, terrain_texture_4), elevation_1_nw, elevation_2_nw, elevation_1_ne, elevation_2_ne, elevation_1_se, elevation_2_se, elevation_1_sw, elevation_2_sw, water_height, terrain_raise_limit, terrain_lower_limit, use_estate_sun, fixed_sun, sun_position, CONVERT(uniqueidentifier, covenant), Sandbox, sunvectorx, sunvectory, sunvectorz FROM dbo.regionsettings WITH (HOLDLOCK TABLOCKX)')
884
885DROP TABLE dbo.regionsettings
886
887EXECUTE sp_rename N'dbo.Tmp_regionsettings', N'regionsettings', 'OBJECT'
888
889ALTER TABLE dbo.regionsettings ADD CONSTRAINT
890 PK__regionse__5B35159D21B6055D PRIMARY KEY CLUSTERED
891 (
892 regionUUID
893 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
894
895COMMIT
896
897
898:VERSION 21
899
900BEGIN TRANSACTION
901
902ALTER TABLE prims ADD PassTouches bit not null default 0
903
904COMMIT
905
906
907:VERSION 22
908
909BEGIN TRANSACTION
910
911ALTER TABLE regionsettings ADD loaded_creation_date varchar(20)
912ALTER TABLE regionsettings ADD loaded_creation_time varchar(20)
913ALTER TABLE regionsettings ADD loaded_creation_id varchar(64)
914
915COMMIT
916
917:VERSION 23
918
919BEGIN TRANSACTION
920
921ALTER TABLE regionsettings DROP COLUMN loaded_creation_date
922ALTER TABLE regionsettings DROP COLUMN loaded_creation_time
923ALTER TABLE regionsettings ADD loaded_creation_datetime int NOT NULL default 0
924
925COMMIT
926
927:VERSION 24
928
929BEGIN TRANSACTION
930
931ALTER TABLE prims ADD MediaURL varchar(255)
932ALTER TABLE primshapes ADD Media TEXT NULL
933
934COMMIT
935
936:VERSION 25
937
938BEGIN TRANSACTION
939CREATE TABLE "regionwindlight" (
940 "region_id" varchar(36) NOT NULL DEFAULT '000000-0000-0000-0000-000000000000',
941 "water_color_r" [float] NOT NULL DEFAULT '4.000000',
942 "water_color_g" [float] NOT NULL DEFAULT '38.000000',
943 "water_color_b" [float] NOT NULL DEFAULT '64.000000',
944 "water_fog_density_exponent" [float] NOT NULL DEFAULT '4.0',
945 "underwater_fog_modifier" [float] NOT NULL DEFAULT '0.25',
946 "reflection_wavelet_scale_1" [float] NOT NULL DEFAULT '2.0',
947 "reflection_wavelet_scale_2" [float] NOT NULL DEFAULT '2.0',
948 "reflection_wavelet_scale_3" [float] NOT NULL DEFAULT '2.0',
949 "fresnel_scale" [float] NOT NULL DEFAULT '0.40',
950 "fresnel_offset" [float] NOT NULL DEFAULT '0.50',
951 "refract_scale_above" [float] NOT NULL DEFAULT '0.03',
952 "refract_scale_below" [float] NOT NULL DEFAULT '0.20',
953 "blur_multiplier" [float] NOT NULL DEFAULT '0.040',
954 "big_wave_direction_x" [float] NOT NULL DEFAULT '1.05',
955 "big_wave_direction_y" [float] NOT NULL DEFAULT '-0.42',
956 "little_wave_direction_x" [float] NOT NULL DEFAULT '1.11',
957 "little_wave_direction_y" [float] NOT NULL DEFAULT '-1.16',
958 "normal_map_texture" varchar(36) NOT NULL DEFAULT '822ded49-9a6c-f61c-cb89-6df54f42cdf4',
959 "horizon_r" [float] NOT NULL DEFAULT '0.25',
960 "horizon_g" [float] NOT NULL DEFAULT '0.25',
961 "horizon_b" [float] NOT NULL DEFAULT '0.32',
962 "horizon_i" [float] NOT NULL DEFAULT '0.32',
963 "haze_horizon" [float] NOT NULL DEFAULT '0.19',
964 "blue_density_r" [float] NOT NULL DEFAULT '0.12',
965 "blue_density_g" [float] NOT NULL DEFAULT '0.22',
966 "blue_density_b" [float] NOT NULL DEFAULT '0.38',
967 "blue_density_i" [float] NOT NULL DEFAULT '0.38',
968 "haze_density" [float] NOT NULL DEFAULT '0.70',
969 "density_multiplier" [float] NOT NULL DEFAULT '0.18',
970 "distance_multiplier" [float] NOT NULL DEFAULT '0.8',
971 "max_altitude" int NOT NULL DEFAULT '1605',
972 "sun_moon_color_r" [float] NOT NULL DEFAULT '0.24',
973 "sun_moon_color_g" [float] NOT NULL DEFAULT '0.26',
974 "sun_moon_color_b" [float] NOT NULL DEFAULT '0.30',
975 "sun_moon_color_i" [float] NOT NULL DEFAULT '0.30',
976 "sun_moon_position" [float] NOT NULL DEFAULT '0.317',
977 "ambient_r" [float] NOT NULL DEFAULT '0.35',
978 "ambient_g" [float] NOT NULL DEFAULT '0.35',
979 "ambient_b" [float] NOT NULL DEFAULT '0.35',
980 "ambient_i" [float] NOT NULL DEFAULT '0.35',
981 "east_angle" [float] NOT NULL DEFAULT '0.00',
982 "sun_glow_focus" [float] NOT NULL DEFAULT '0.10',
983 "sun_glow_size" [float] NOT NULL DEFAULT '1.75',
984 "scene_gamma" [float] NOT NULL DEFAULT '1.00',
985 "star_brightness" [float] NOT NULL DEFAULT '0.00',
986 "cloud_color_r" [float] NOT NULL DEFAULT '0.41',
987 "cloud_color_g" [float] NOT NULL DEFAULT '0.41',
988 "cloud_color_b" [float] NOT NULL DEFAULT '0.41',
989 "cloud_color_i" [float] NOT NULL DEFAULT '0.41',
990 "cloud_x" [float] NOT NULL DEFAULT '1.00',
991 "cloud_y" [float] NOT NULL DEFAULT '0.53',
992 "cloud_density" [float] NOT NULL DEFAULT '1.00',
993 "cloud_coverage" [float] NOT NULL DEFAULT '0.27',
994 "cloud_scale" [float] NOT NULL DEFAULT '0.42',
995 "cloud_detail_x" [float] NOT NULL DEFAULT '1.00',
996 "cloud_detail_y" [float] NOT NULL DEFAULT '0.53',
997 "cloud_detail_density" [float] NOT NULL DEFAULT '0.12',
998 "cloud_scroll_x" [float] NOT NULL DEFAULT '0.20',
999 "cloud_scroll_x_lock" tinyint NOT NULL DEFAULT '0',
1000 "cloud_scroll_y" [float] NOT NULL DEFAULT '0.01',
1001 "cloud_scroll_y_lock" tinyint NOT NULL DEFAULT '0',
1002 "draw_classic_clouds" tinyint NOT NULL DEFAULT '1',
1003 PRIMARY KEY ("region_id")
1004)
1005
1006COMMIT
1007
1008:VERSION 26
1009
1010BEGIN TRANSACTION
1011
1012ALTER TABLE regionsettings ADD map_tile_ID CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
1013
1014COMMIT
1015
1016:VERSION 27 #---------------------
1017
1018BEGIN TRANSACTION
1019ALTER TABLE land ADD MediaType VARCHAR(32) NOT NULL DEFAULT 'none/none'
1020ALTER TABLE land ADD MediaDescription VARCHAR(255) NOT NULL DEFAULT ''
1021ALTER TABLE land ADD MediaSize VARCHAR(16) NOT NULL DEFAULT '0,0'
1022ALTER TABLE land ADD MediaLoop bit NOT NULL DEFAULT 0
1023ALTER TABLE land ADD ObscureMusic bit NOT NULL DEFAULT 0
1024ALTER TABLE land ADD ObscureMedia bit NOT NULL DEFAULT 0
1025COMMIT
1026
1027:VERSION 28 #---------------------
1028
1029BEGIN TRANSACTION
1030
1031ALTER TABLE prims
1032ADD CONSTRAINT DF_prims_CreatorID
1033DEFAULT '00000000-0000-0000-0000-000000000000'
1034FOR CreatorID
1035
1036ALTER TABLE prims ALTER COLUMN CreatorID uniqueidentifier NOT NULL
1037
1038ALTER TABLE primitems
1039ADD CONSTRAINT DF_primitems_CreatorID
1040DEFAULT '00000000-0000-0000-0000-000000000000'
1041FOR CreatorID
1042
1043ALTER TABLE primitems ALTER COLUMN CreatorID uniqueidentifier NOT NULL
1044
1045COMMIT
1046
1047:VERSION 29 #----------------- Region Covenant changed time
1048
1049BEGIN TRANSACTION
1050
1051ALTER TABLE regionsettings ADD covenant_datetime int NOT NULL default 0
1052
1053COMMIT
1054
1055:VERSION 30 #------------------Migrate creatorID storage to varchars instead of UUIDs for HG support
1056
1057BEGIN TRANSACTION
1058
1059EXECUTE sp_rename N'dbo.prims.creatorid', N'creatoridold', 'COLUMN'
1060EXECUTE sp_rename N'dbo.primitems.creatorid', N'creatoridold', 'COLUMN'
1061
1062COMMIT
1063
1064:VERSION 31 #---------------------
1065
1066BEGIN TRANSACTION
1067
1068ALTER TABLE prims ADD CreatorID varchar(255)
1069ALTER TABLE primitems ADD CreatorID varchar(255)
1070
1071COMMIT
1072
1073:VERSION 32 #---------------------
1074
1075BEGIN TRANSACTION
1076
1077UPDATE prims SET prims.CreatorID = CONVERT(varchar(255), creatoridold)
1078UPDATE primitems SET primitems.CreatorID = CONVERT(varchar(255), creatoridold)
1079
1080COMMIT
1081
1082:VERSION 33 #---------------------
1083
1084BEGIN TRANSACTION
1085
1086ALTER TABLE prims
1087ADD CONSTRAINT DF_prims_CreatorIDNew
1088DEFAULT '00000000-0000-0000-0000-000000000000'
1089FOR CreatorID
1090
1091ALTER TABLE prims ALTER COLUMN CreatorID varchar(255) NOT NULL
1092
1093ALTER TABLE primitems
1094ADD CONSTRAINT DF_primitems_CreatorIDNew
1095DEFAULT '00000000-0000-0000-0000-000000000000'
1096FOR CreatorID
1097
1098ALTER TABLE primitems ALTER COLUMN CreatorID varchar(255) NOT NULL
1099
1100COMMIT
1101
1102:VERSION 34 #--------------- Telehub support
1103
1104BEGIN TRANSACTION
1105
1106CREATE TABLE [dbo].[Spawn_Points](
1107 [RegionUUID] [uniqueidentifier] NOT NULL,
1108 [Yaw] [float] NOT NULL,
1109 [Pitch] [float] NOT NULL,
1110 [Distance] [float] NOT NULL,
1111 PRIMARY KEY CLUSTERED
1112 (
1113 [RegionUUID] ASC
1114 )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
1115) ON [PRIMARY]
1116
1117ALTER TABLE regionsettings ADD TelehubObject uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
1118
1119COMMIT
1120
1121:VERSION 35 #---------------- Parcels for sale
1122
1123BEGIN TRANSACTION
1124
1125ALTER TABLE regionsettings ADD parcel_tile_ID uniqueidentifier NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
1126
1127COMMIT
1128
1129:VERSION 36 #---------------- Timed bans/access
1130
1131BEGIN TRANSACTION
1132
1133ALTER TABLE landaccesslist ADD Expires integer NOT NULL DEFAULT 0;
1134
1135COMMIT
1136
1137:VERSION 37 #---------------- Environment Settings
1138
1139BEGIN TRANSACTION
1140
1141CREATE TABLE [dbo].[regionenvironment](
1142 [region_id] [uniqueidentifier] NOT NULL,
1143 [llsd_settings] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
1144 PRIMARY KEY CLUSTERED
1145(
1146 [region_id] ASC
1147)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
1148) ON [PRIMARY]
1149
1150COMMIT
diff --git a/OpenSim/Data/MSSQL/Resources/UserAccount.migrations b/OpenSim/Data/MSSQL/Resources/UserAccount.migrations
deleted file mode 100644
index a81704d..0000000
--- a/OpenSim/Data/MSSQL/Resources/UserAccount.migrations
+++ /dev/null
@@ -1,55 +0,0 @@
1:VERSION 1
2
3CREATE TABLE [UserAccounts] (
4 [PrincipalID] uniqueidentifier NOT NULL,
5 [ScopeID] uniqueidentifier NOT NULL,
6 [FirstName] [varchar](64) NOT NULL,
7 [LastName] [varchar](64) NOT NULL,
8 [Email] [varchar](64) NULL,
9 [ServiceURLs] [text] NULL,
10 [Created] [int] default NULL,
11
12 PRIMARY KEY CLUSTERED
13(
14 [PrincipalID] ASC
15)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
16) ON [PRIMARY]
17
18
19:VERSION 2
20
21BEGIN TRANSACTION
22IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[users]') AND type in (N'U'))
23INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT [UUID] AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID,
24username AS FirstName,
25lastname AS LastName,
26email as Email, (
27'AssetServerURI=' +
28userAssetURI + ' InventoryServerURI=' + userInventoryURI + ' GatewayURI= HomeURI=') AS ServiceURLs,
29created as Created FROM users;
30
31
32COMMIT
33
34:VERSION 3
35
36BEGIN TRANSACTION
37
38CREATE UNIQUE INDEX PrincipalID ON UserAccounts(PrincipalID);
39CREATE INDEX Email ON UserAccounts(Email);
40CREATE INDEX FirstName ON UserAccounts(FirstName);
41CREATE INDEX LastName ON UserAccounts(LastName);
42CREATE INDEX Name ON UserAccounts(FirstName,LastName);
43
44COMMIT
45
46:VERSION 4
47
48BEGIN TRANSACTION
49
50ALTER TABLE UserAccounts ADD UserLevel integer NOT NULL DEFAULT 0;
51ALTER TABLE UserAccounts ADD UserFlags integer NOT NULL DEFAULT 0;
52ALTER TABLE UserAccounts ADD UserTitle varchar(64) NOT NULL DEFAULT '';
53
54COMMIT
55
diff --git a/OpenSim/Data/MSSQL/Resources/UserStore.migrations b/OpenSim/Data/MSSQL/Resources/UserStore.migrations
deleted file mode 100644
index 050c544..0000000
--- a/OpenSim/Data/MSSQL/Resources/UserStore.migrations
+++ /dev/null
@@ -1,421 +0,0 @@
1:VERSION 1
2
3CREATE TABLE [users] (
4 [UUID] [varchar](36) NOT NULL default '',
5 [username] [varchar](32) NOT NULL,
6 [lastname] [varchar](32) NOT NULL,
7 [passwordHash] [varchar](32) NOT NULL,
8 [passwordSalt] [varchar](32) NOT NULL,
9 [homeRegion] [bigint] default NULL,
10 [homeLocationX] [float] default NULL,
11 [homeLocationY] [float] default NULL,
12 [homeLocationZ] [float] default NULL,
13 [homeLookAtX] [float] default NULL,
14 [homeLookAtY] [float] default NULL,
15 [homeLookAtZ] [float] default NULL,
16 [created] [int] NOT NULL,
17 [lastLogin] [int] NOT NULL,
18 [userInventoryURI] [varchar](255) default NULL,
19 [userAssetURI] [varchar](255) default NULL,
20 [profileCanDoMask] [int] default NULL,
21 [profileWantDoMask] [int] default NULL,
22 [profileAboutText] [ntext],
23 [profileFirstText] [ntext],
24 [profileImage] [varchar](36) default NULL,
25 [profileFirstImage] [varchar](36) default NULL,
26 [webLoginKey] [varchar](36) default NULL,
27 PRIMARY KEY CLUSTERED
28(
29 [UUID] ASC
30)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
31) ON [PRIMARY]
32
33
34CREATE NONCLUSTERED INDEX [usernames] ON [users]
35(
36 [username] ASC,
37 [lastname] ASC
38)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
39
40
41CREATE TABLE [agents] (
42 [UUID] [varchar](36) NOT NULL,
43 [sessionID] [varchar](36) NOT NULL,
44 [secureSessionID] [varchar](36) NOT NULL,
45 [agentIP] [varchar](16) NOT NULL,
46 [agentPort] [int] NOT NULL,
47 [agentOnline] [tinyint] NOT NULL,
48 [loginTime] [int] NOT NULL,
49 [logoutTime] [int] NOT NULL,
50 [currentRegion] [varchar](36) NOT NULL,
51 [currentHandle] [bigint] NOT NULL,
52 [currentPos] [varchar](64) NOT NULL,
53 PRIMARY KEY CLUSTERED
54(
55 [UUID] ASC
56)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
57) ON [PRIMARY]
58
59
60CREATE NONCLUSTERED INDEX [session] ON [agents]
61(
62 [sessionID] ASC
63)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
64
65CREATE NONCLUSTERED INDEX [ssession] ON [agents]
66(
67 [secureSessionID] ASC
68)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
69
70
71CREATE TABLE [dbo].[userfriends](
72 [ownerID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
73 [friendID] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
74 [friendPerms] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
75 [datetimestamp] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
76) ON [PRIMARY]
77
78CREATE TABLE [avatarappearance] (
79 [Owner] [varchar](36) NOT NULL,
80 [Serial] int NOT NULL,
81 [Visual_Params] [image] NOT NULL,
82 [Texture] [image] NOT NULL,
83 [Avatar_Height] float NOT NULL,
84 [Body_Item] [varchar](36) NOT NULL,
85 [Body_Asset] [varchar](36) NOT NULL,
86 [Skin_Item] [varchar](36) NOT NULL,
87 [Skin_Asset] [varchar](36) NOT NULL,
88 [Hair_Item] [varchar](36) NOT NULL,
89 [Hair_Asset] [varchar](36) NOT NULL,
90 [Eyes_Item] [varchar](36) NOT NULL,
91 [Eyes_Asset] [varchar](36) NOT NULL,
92 [Shirt_Item] [varchar](36) NOT NULL,
93 [Shirt_Asset] [varchar](36) NOT NULL,
94 [Pants_Item] [varchar](36) NOT NULL,
95 [Pants_Asset] [varchar](36) NOT NULL,
96 [Shoes_Item] [varchar](36) NOT NULL,
97 [Shoes_Asset] [varchar](36) NOT NULL,
98 [Socks_Item] [varchar](36) NOT NULL,
99 [Socks_Asset] [varchar](36) NOT NULL,
100 [Jacket_Item] [varchar](36) NOT NULL,
101 [Jacket_Asset] [varchar](36) NOT NULL,
102 [Gloves_Item] [varchar](36) NOT NULL,
103 [Gloves_Asset] [varchar](36) NOT NULL,
104 [Undershirt_Item] [varchar](36) NOT NULL,
105 [Undershirt_Asset] [varchar](36) NOT NULL,
106 [Underpants_Item] [varchar](36) NOT NULL,
107 [Underpants_Asset] [varchar](36) NOT NULL,
108 [Skirt_Item] [varchar](36) NOT NULL,
109 [Skirt_Asset] [varchar](36) NOT NULL,
110
111 PRIMARY KEY CLUSTERED (
112 [Owner]
113 ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
114) ON [PRIMARY]
115
116:VERSION 2
117
118BEGIN TRANSACTION
119
120ALTER TABLE users ADD homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
121ALTER TABLE users ADD userFlags int NOT NULL default 0;
122ALTER TABLE users ADD godLevel int NOT NULL default 0;
123ALTER TABLE users ADD customType varchar(32) not null default '';
124ALTER TABLE users ADD partner varchar(36) not null default '00000000-0000-0000-0000-000000000000';
125
126COMMIT
127
128
129:VERSION 3
130
131BEGIN TRANSACTION
132
133CREATE TABLE [avatarattachments] (
134 [UUID] varchar(36) NOT NULL
135 , [attachpoint] int NOT NULL
136 , [item] varchar(36) NOT NULL
137 , [asset] varchar(36) NOT NULL)
138
139CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments
140 (
141 UUID
142 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
143
144
145COMMIT
146
147
148:VERSION 4
149
150BEGIN TRANSACTION
151
152CREATE TABLE Tmp_userfriends
153 (
154 ownerID varchar(36) NOT NULL,
155 friendID varchar(36) NOT NULL,
156 friendPerms int NOT NULL,
157 datetimestamp int NOT NULL
158 ) ON [PRIMARY]
159
160IF EXISTS(SELECT * FROM userfriends)
161 EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp)
162 SELECT CONVERT(varchar(36), ownerID), CONVERT(varchar(36), friendID), CONVERT(int, friendPerms), CONVERT(int, datetimestamp) FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)')
163
164DROP TABLE dbo.userfriends
165
166EXECUTE sp_rename N'Tmp_userfriends', N'userfriends', 'OBJECT'
167
168CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON userfriends
169 (
170 ownerID
171 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
172
173CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON userfriends
174 (
175 friendID
176 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
177
178COMMIT
179
180
181:VERSION 5
182
183BEGIN TRANSACTION
184
185 ALTER TABLE users add email varchar(250);
186
187COMMIT
188
189
190:VERSION 6
191
192BEGIN TRANSACTION
193
194CREATE TABLE dbo.Tmp_users
195 (
196 UUID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
197 username varchar(32) NOT NULL,
198 lastname varchar(32) NOT NULL,
199 passwordHash varchar(32) NOT NULL,
200 passwordSalt varchar(32) NOT NULL,
201 homeRegion bigint NULL DEFAULT (NULL),
202 homeLocationX float(53) NULL DEFAULT (NULL),
203 homeLocationY float(53) NULL DEFAULT (NULL),
204 homeLocationZ float(53) NULL DEFAULT (NULL),
205 homeLookAtX float(53) NULL DEFAULT (NULL),
206 homeLookAtY float(53) NULL DEFAULT (NULL),
207 homeLookAtZ float(53) NULL DEFAULT (NULL),
208 created int NOT NULL,
209 lastLogin int NOT NULL,
210 userInventoryURI varchar(255) NULL DEFAULT (NULL),
211 userAssetURI varchar(255) NULL DEFAULT (NULL),
212 profileCanDoMask int NULL DEFAULT (NULL),
213 profileWantDoMask int NULL DEFAULT (NULL),
214 profileAboutText ntext NULL,
215 profileFirstText ntext NULL,
216 profileImage uniqueidentifier NULL DEFAULT (NULL),
217 profileFirstImage uniqueidentifier NULL DEFAULT (NULL),
218 webLoginKey uniqueidentifier NULL DEFAULT (NULL),
219 homeRegionID uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
220 userFlags int NOT NULL DEFAULT ((0)),
221 godLevel int NOT NULL DEFAULT ((0)),
222 customType varchar(32) NOT NULL DEFAULT (''),
223 partner uniqueidentifier NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
224 email varchar(250) NULL
225 ) ON [PRIMARY]
226 TEXTIMAGE_ON [PRIMARY]
227
228IF EXISTS(SELECT * FROM dbo.users)
229 EXEC('INSERT INTO dbo.Tmp_users (UUID, username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, profileImage, profileFirstImage, webLoginKey, homeRegionID, userFlags, godLevel, customType, partner, email)
230 SELECT CONVERT(uniqueidentifier, UUID), username, lastname, passwordHash, passwordSalt, homeRegion, homeLocationX, homeLocationY, homeLocationZ, homeLookAtX, homeLookAtY, homeLookAtZ, created, lastLogin, userInventoryURI, userAssetURI, profileCanDoMask, profileWantDoMask, profileAboutText, profileFirstText, CONVERT(uniqueidentifier, profileImage), CONVERT(uniqueidentifier, profileFirstImage), CONVERT(uniqueidentifier, webLoginKey), CONVERT(uniqueidentifier, homeRegionID), userFlags, godLevel, customType, CONVERT(uniqueidentifier, partner), email FROM dbo.users WITH (HOLDLOCK TABLOCKX)')
231
232DROP TABLE dbo.users
233
234EXECUTE sp_rename N'dbo.Tmp_users', N'users', 'OBJECT'
235
236ALTER TABLE dbo.users ADD CONSTRAINT
237 PK__users__65A475E737A5467C PRIMARY KEY CLUSTERED
238 (
239 UUID
240 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
241
242CREATE NONCLUSTERED INDEX usernames ON dbo.users
243 (
244 username,
245 lastname
246 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
247
248COMMIT
249
250
251:VERSION 7
252
253BEGIN TRANSACTION
254
255CREATE TABLE dbo.Tmp_agents
256 (
257 UUID uniqueidentifier NOT NULL,
258 sessionID uniqueidentifier NOT NULL,
259 secureSessionID uniqueidentifier NOT NULL,
260 agentIP varchar(16) NOT NULL,
261 agentPort int NOT NULL,
262 agentOnline tinyint NOT NULL,
263 loginTime int NOT NULL,
264 logoutTime int NOT NULL,
265 currentRegion uniqueidentifier NOT NULL,
266 currentHandle bigint NOT NULL,
267 currentPos varchar(64) NOT NULL
268 ) ON [PRIMARY]
269
270IF EXISTS(SELECT * FROM dbo.agents)
271 EXEC('INSERT INTO dbo.Tmp_agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos)
272 SELECT CONVERT(uniqueidentifier, UUID), CONVERT(uniqueidentifier, sessionID), CONVERT(uniqueidentifier, secureSessionID), agentIP, agentPort, agentOnline, loginTime, logoutTime, CONVERT(uniqueidentifier, currentRegion), currentHandle, currentPos FROM dbo.agents WITH (HOLDLOCK TABLOCKX)')
273
274DROP TABLE dbo.agents
275
276EXECUTE sp_rename N'dbo.Tmp_agents', N'agents', 'OBJECT'
277
278ALTER TABLE dbo.agents ADD CONSTRAINT
279 PK__agents__65A475E749C3F6B7 PRIMARY KEY CLUSTERED
280 (
281 UUID
282 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
283
284CREATE NONCLUSTERED INDEX session ON dbo.agents
285 (
286 sessionID
287 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
288
289CREATE NONCLUSTERED INDEX ssession ON dbo.agents
290 (
291 secureSessionID
292 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
293
294COMMIT
295
296
297:VERSION 8
298
299BEGIN TRANSACTION
300
301CREATE TABLE dbo.Tmp_userfriends
302 (
303 ownerID uniqueidentifier NOT NULL,
304 friendID uniqueidentifier NOT NULL,
305 friendPerms int NOT NULL,
306 datetimestamp int NOT NULL
307 ) ON [PRIMARY]
308
309IF EXISTS(SELECT * FROM dbo.userfriends)
310 EXEC('INSERT INTO dbo.Tmp_userfriends (ownerID, friendID, friendPerms, datetimestamp)
311 SELECT CONVERT(uniqueidentifier, ownerID), CONVERT(uniqueidentifier, friendID), friendPerms, datetimestamp FROM dbo.userfriends WITH (HOLDLOCK TABLOCKX)')
312
313DROP TABLE dbo.userfriends
314
315EXECUTE sp_rename N'dbo.Tmp_userfriends', N'userfriends', 'OBJECT'
316
317CREATE NONCLUSTERED INDEX IX_userfriends_ownerID ON dbo.userfriends
318 (
319 ownerID
320 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
321
322CREATE NONCLUSTERED INDEX IX_userfriends_friendID ON dbo.userfriends
323 (
324 friendID
325 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
326
327COMMIT
328
329
330:VERSION 9
331
332BEGIN TRANSACTION
333
334CREATE TABLE dbo.Tmp_avatarappearance
335 (
336 Owner uniqueidentifier NOT NULL,
337 Serial int NOT NULL,
338 Visual_Params image NOT NULL,
339 Texture image NOT NULL,
340 Avatar_Height float(53) NOT NULL,
341 Body_Item uniqueidentifier NOT NULL,
342 Body_Asset uniqueidentifier NOT NULL,
343 Skin_Item uniqueidentifier NOT NULL,
344 Skin_Asset uniqueidentifier NOT NULL,
345 Hair_Item uniqueidentifier NOT NULL,
346 Hair_Asset uniqueidentifier NOT NULL,
347 Eyes_Item uniqueidentifier NOT NULL,
348 Eyes_Asset uniqueidentifier NOT NULL,
349 Shirt_Item uniqueidentifier NOT NULL,
350 Shirt_Asset uniqueidentifier NOT NULL,
351 Pants_Item uniqueidentifier NOT NULL,
352 Pants_Asset uniqueidentifier NOT NULL,
353 Shoes_Item uniqueidentifier NOT NULL,
354 Shoes_Asset uniqueidentifier NOT NULL,
355 Socks_Item uniqueidentifier NOT NULL,
356 Socks_Asset uniqueidentifier NOT NULL,
357 Jacket_Item uniqueidentifier NOT NULL,
358 Jacket_Asset uniqueidentifier NOT NULL,
359 Gloves_Item uniqueidentifier NOT NULL,
360 Gloves_Asset uniqueidentifier NOT NULL,
361 Undershirt_Item uniqueidentifier NOT NULL,
362 Undershirt_Asset uniqueidentifier NOT NULL,
363 Underpants_Item uniqueidentifier NOT NULL,
364 Underpants_Asset uniqueidentifier NOT NULL,
365 Skirt_Item uniqueidentifier NOT NULL,
366 Skirt_Asset uniqueidentifier NOT NULL
367 ) ON [PRIMARY]
368 TEXTIMAGE_ON [PRIMARY]
369
370IF EXISTS(SELECT * FROM dbo.avatarappearance)
371 EXEC('INSERT INTO dbo.Tmp_avatarappearance (Owner, Serial, Visual_Params, Texture, Avatar_Height, Body_Item, Body_Asset, Skin_Item, Skin_Asset, Hair_Item, Hair_Asset, Eyes_Item, Eyes_Asset, Shirt_Item, Shirt_Asset, Pants_Item, Pants_Asset, Shoes_Item, Shoes_Asset, Socks_Item, Socks_Asset, Jacket_Item, Jacket_Asset, Gloves_Item, Gloves_Asset, Undershirt_Item, Undershirt_Asset, Underpants_Item, Underpants_Asset, Skirt_Item, Skirt_Asset)
372 SELECT CONVERT(uniqueidentifier, Owner), Serial, Visual_Params, Texture, Avatar_Height, CONVERT(uniqueidentifier, Body_Item), CONVERT(uniqueidentifier, Body_Asset), CONVERT(uniqueidentifier, Skin_Item), CONVERT(uniqueidentifier, Skin_Asset), CONVERT(uniqueidentifier, Hair_Item), CONVERT(uniqueidentifier, Hair_Asset), CONVERT(uniqueidentifier, Eyes_Item), CONVERT(uniqueidentifier, Eyes_Asset), CONVERT(uniqueidentifier, Shirt_Item), CONVERT(uniqueidentifier, Shirt_Asset), CONVERT(uniqueidentifier, Pants_Item), CONVERT(uniqueidentifier, Pants_Asset), CONVERT(uniqueidentifier, Shoes_Item), CONVERT(uniqueidentifier, Shoes_Asset), CONVERT(uniqueidentifier, Socks_Item), CONVERT(uniqueidentifier, Socks_Asset), CONVERT(uniqueidentifier, Jacket_Item), CONVERT(uniqueidentifier, Jacket_Asset), CONVERT(uniqueidentifier, Gloves_Item), CONVERT(uniqueidentifier, Gloves_Asset), CONVERT(uniqueidentifier, Undershirt_Item), CONVERT(uniqueidentifier, Undershirt_Asset), CONVERT(uniqueidentifier, Underpants_Item), CONVERT(uniqueidentifier, Underpants_Asset), CONVERT(uniqueidentifier, Skirt_Item), CONVERT(uniqueidentifier, Skirt_Asset) FROM dbo.avatarappearance WITH (HOLDLOCK TABLOCKX)')
373
374DROP TABLE dbo.avatarappearance
375
376EXECUTE sp_rename N'dbo.Tmp_avatarappearance', N'avatarappearance', 'OBJECT'
377
378ALTER TABLE dbo.avatarappearance ADD CONSTRAINT
379 PK__avatarap__7DD115CC4E88ABD4 PRIMARY KEY CLUSTERED
380 (
381 Owner
382 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
383
384COMMIT
385
386
387:VERSION 10
388
389BEGIN TRANSACTION
390
391CREATE TABLE dbo.Tmp_avatarattachments
392 (
393 UUID uniqueidentifier NOT NULL,
394 attachpoint int NOT NULL,
395 item uniqueidentifier NOT NULL,
396 asset uniqueidentifier NOT NULL
397 ) ON [PRIMARY]
398
399IF EXISTS(SELECT * FROM dbo.avatarattachments)
400 EXEC('INSERT INTO dbo.Tmp_avatarattachments (UUID, attachpoint, item, asset)
401 SELECT CONVERT(uniqueidentifier, UUID), attachpoint, CONVERT(uniqueidentifier, item), CONVERT(uniqueidentifier, asset) FROM dbo.avatarattachments WITH (HOLDLOCK TABLOCKX)')
402
403DROP TABLE dbo.avatarattachments
404
405EXECUTE sp_rename N'dbo.Tmp_avatarattachments', N'avatarattachments', 'OBJECT'
406
407CREATE NONCLUSTERED INDEX IX_avatarattachments ON dbo.avatarattachments
408 (
409 UUID
410 ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
411
412COMMIT
413
414
415:VERSION 11
416
417BEGIN TRANSACTION
418
419ALTER TABLE users ADD scopeID uniqueidentifier not null default '00000000-0000-0000-0000-000000000000'
420
421COMMIT