diff options
Diffstat (limited to 'OpenSim/Data/MSSQL/MSSQLUserData.cs')
-rw-r--r-- | OpenSim/Data/MSSQL/MSSQLUserData.cs | 1360 |
1 files changed, 829 insertions, 531 deletions
diff --git a/OpenSim/Data/MSSQL/MSSQLUserData.cs b/OpenSim/Data/MSSQL/MSSQLUserData.cs index 9118012..6352cce 100644 --- a/OpenSim/Data/MSSQL/MSSQLUserData.cs +++ b/OpenSim/Data/MSSQL/MSSQLUserData.cs | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections; | ||
29 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
30 | using System.Data; | 31 | using System.Data; |
31 | using System.Data.SqlClient; | 32 | using System.Data.SqlClient; |
@@ -41,6 +42,8 @@ namespace OpenSim.Data.MSSQL | |||
41 | /// </summary> | 42 | /// </summary> |
42 | public class MSSQLUserData : UserDataBase | 43 | public class MSSQLUserData : UserDataBase |
43 | { | 44 | { |
45 | private const string _migrationStore = "UserStore"; | ||
46 | |||
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
45 | 48 | ||
46 | /// <summary> | 49 | /// <summary> |
@@ -52,28 +55,35 @@ namespace OpenSim.Data.MSSQL | |||
52 | private string m_usersTableName; | 55 | private string m_usersTableName; |
53 | private string m_userFriendsTableName; | 56 | private string m_userFriendsTableName; |
54 | 57 | ||
55 | public override void Initialise() | 58 | override public void Initialise() |
56 | { | 59 | { |
57 | m_log.Info("[MSSQLUserData]: " + Name + " cannot be default-initialized!"); | 60 | m_log.Info("[MSSQLUserData]: " + Name + " cannot be default-initialized!"); |
58 | throw new PluginNotInitialisedException (Name); | 61 | throw new PluginNotInitialisedException(Name); |
59 | } | 62 | } |
60 | 63 | ||
61 | /// <summary> | 64 | /// <summary> |
62 | /// Loads and initialises the MSSQL storage plugin | 65 | /// Loads and initialises the MSSQL storage plugin |
63 | /// </summary> | 66 | /// </summary> |
64 | /// <param name="connect">TODO: do something with the connect string instead of ignoring it.</param> | 67 | /// <param name="connect">connectionstring</param> |
65 | /// <remarks>use mssql_connection.ini</remarks> | 68 | /// <remarks>use mssql_connection.ini</remarks> |
66 | override public void Initialise(string connect) | 69 | override public void Initialise(string connect) |
67 | { | 70 | { |
68 | // TODO: do something with the connect string instead of | ||
69 | // ignoring it. | ||
70 | |||
71 | IniFile iniFile = new IniFile("mssql_connection.ini"); | 71 | IniFile iniFile = new IniFile("mssql_connection.ini"); |
72 | string settingDataSource = iniFile.ParseFileReadValue("data_source"); | 72 | |
73 | string settingInitialCatalog = iniFile.ParseFileReadValue("initial_catalog"); | 73 | if (string.IsNullOrEmpty(connect)) |
74 | string settingPersistSecurityInfo = iniFile.ParseFileReadValue("persist_security_info"); | 74 | { |
75 | string settingUserId = iniFile.ParseFileReadValue("user_id"); | 75 | database = new MSSQLManager(connect); |
76 | string settingPassword = iniFile.ParseFileReadValue("password"); | 76 | } |
77 | else | ||
78 | { | ||
79 | string settingDataSource = iniFile.ParseFileReadValue("data_source"); | ||
80 | string settingInitialCatalog = iniFile.ParseFileReadValue("initial_catalog"); | ||
81 | string settingPersistSecurityInfo = iniFile.ParseFileReadValue("persist_security_info"); | ||
82 | string settingUserId = iniFile.ParseFileReadValue("user_id"); | ||
83 | string settingPassword = iniFile.ParseFileReadValue("password"); | ||
84 | |||
85 | database = new MSSQLManager(settingDataSource, settingInitialCatalog, settingPersistSecurityInfo, settingUserId, settingPassword); | ||
86 | } | ||
77 | 87 | ||
78 | m_usersTableName = iniFile.ParseFileReadValue("userstablename"); | 88 | m_usersTableName = iniFile.ParseFileReadValue("userstablename"); |
79 | if (m_usersTableName == null) | 89 | if (m_usersTableName == null) |
@@ -93,23 +103,22 @@ namespace OpenSim.Data.MSSQL | |||
93 | m_agentsTableName = "agents"; | 103 | m_agentsTableName = "agents"; |
94 | } | 104 | } |
95 | 105 | ||
96 | database = | 106 | //TODO this can be removed at one time!!!!! |
97 | new MSSQLManager(settingDataSource, settingInitialCatalog, settingPersistSecurityInfo, settingUserId, | ||
98 | settingPassword); | ||
99 | |||
100 | TestTables(); | 107 | TestTables(); |
108 | |||
109 | //Check migration on DB | ||
110 | database.CheckMigration(_migrationStore); | ||
101 | } | 111 | } |
102 | 112 | ||
103 | public override void Dispose () {} | 113 | override public void Dispose() { } |
104 | 114 | ||
105 | /// <summary> | 115 | /// <summary> |
106 | /// | 116 | /// Can be deleted at one time! |
107 | /// </summary> | 117 | /// </summary> |
108 | /// <returns></returns> | 118 | /// <returns></returns> |
109 | private bool TestTables() | 119 | private void TestTables() |
110 | { | 120 | { |
111 | 121 | using (IDbCommand cmd = database.Query("select top 1 * from " + m_usersTableName)) | |
112 | using (IDbCommand cmd = database.Query("select top 1 * from " + m_usersTableName, new Dictionary<string, string>())) | ||
113 | { | 122 | { |
114 | try | 123 | try |
115 | { | 124 | { |
@@ -145,9 +154,53 @@ namespace OpenSim.Data.MSSQL | |||
145 | } | 154 | } |
146 | } | 155 | } |
147 | 156 | ||
148 | return true; | 157 | using (IDbCommand cmd = database.Query("select top 1 * from avatarappearance", new Dictionary<string, string>())) |
158 | { | ||
159 | try | ||
160 | { | ||
161 | cmd.ExecuteNonQuery(); | ||
162 | } | ||
163 | catch | ||
164 | { | ||
165 | database.ExecuteResourceSql("AvatarAppearance.sql"); | ||
166 | } | ||
167 | } | ||
168 | |||
169 | //Special for Migrations | ||
170 | using (AutoClosingSqlCommand cmd = database.Query("select * from migrations where name = 'UserStore'")) | ||
171 | { | ||
172 | try | ||
173 | { | ||
174 | bool insert = true; | ||
175 | using (SqlDataReader reader = cmd.ExecuteReader()) | ||
176 | { | ||
177 | if (reader.Read()) insert = false; | ||
178 | } | ||
179 | if (insert) | ||
180 | { | ||
181 | cmd.CommandText = "insert into migrations(name, version) values('UserStore', 1)"; | ||
182 | cmd.ExecuteNonQuery(); | ||
183 | } | ||
184 | } | ||
185 | catch | ||
186 | { | ||
187 | //No migrations table | ||
188 | //HACK create one and add data | ||
189 | cmd.CommandText = "create table migrations(name varchar(100), version int)"; | ||
190 | cmd.ExecuteNonQuery(); | ||
191 | |||
192 | cmd.CommandText = "insert into migrations(name, version) values('migrations', 1)"; | ||
193 | cmd.ExecuteNonQuery(); | ||
194 | |||
195 | cmd.CommandText = "insert into migrations(name, version) values('UserStore', 1)"; | ||
196 | cmd.ExecuteNonQuery(); | ||
197 | } | ||
198 | } | ||
199 | return; | ||
149 | } | 200 | } |
150 | 201 | ||
202 | #region User table methods | ||
203 | |||
151 | /// <summary> | 204 | /// <summary> |
152 | /// Searches the database for a specified user profile by name components | 205 | /// Searches the database for a specified user profile by name components |
153 | /// </summary> | 206 | /// </summary> |
@@ -156,623 +209,713 @@ namespace OpenSim.Data.MSSQL | |||
156 | /// <returns>A user profile</returns> | 209 | /// <returns>A user profile</returns> |
157 | override public UserProfileData GetUserByName(string user, string last) | 210 | override public UserProfileData GetUserByName(string user, string last) |
158 | { | 211 | { |
159 | try | 212 | using (AutoClosingSqlCommand command = database.Query("SELECT * FROM " + m_usersTableName + " WHERE username = @first AND lastname = @second")) |
160 | { | 213 | { |
161 | Dictionary<string, string> param = new Dictionary<string, string>(); | 214 | command.Parameters.Add(database.CreateParameter("first", user)); |
162 | param["first"] = user; | 215 | command.Parameters.Add(database.CreateParameter("second", last)); |
163 | param["second"] = last; | ||
164 | 216 | ||
165 | using (IDbCommand result = database.Query("SELECT * FROM " + m_usersTableName + " WHERE username = @first AND lastname = @second", param)) | 217 | try |
166 | using (IDataReader reader = result.ExecuteReader()) | ||
167 | { | 218 | { |
168 | return database.readUserRow(reader); | 219 | using (SqlDataReader reader = command.ExecuteReader()) |
220 | { | ||
221 | return ReadUserRow(reader); | ||
222 | } | ||
223 | } | ||
224 | catch (Exception e) | ||
225 | { | ||
226 | m_log.Error("[USER DB] Error getting user profile, error: " + e.Message); | ||
227 | return null; | ||
169 | } | 228 | } |
170 | } | ||
171 | catch (Exception e) | ||
172 | { | ||
173 | m_log.Error(e.ToString()); | ||
174 | return null; | ||
175 | } | 229 | } |
176 | } | 230 | } |
177 | 231 | ||
178 | #region User Friends List Data | ||
179 | |||
180 | /// <summary> | 232 | /// <summary> |
181 | /// Add a new friend in the friendlist | 233 | /// See IUserDataPlugin |
182 | /// </summary> | 234 | /// </summary> |
183 | /// <param name="friendlistowner">UUID of the friendlist owner</param> | 235 | /// <param name="uuid"></param> |
184 | /// <param name="friend">Friend's UUID</param> | 236 | /// <returns></returns> |
185 | /// <param name="perms">Permission flag</param> | 237 | override public UserProfileData GetUserByUUID(UUID uuid) |
186 | override public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) | ||
187 | { | 238 | { |
188 | int dtvalue = Util.UnixTimeSinceEpoch(); | 239 | using (AutoClosingSqlCommand command = database.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = @uuid")) |
189 | |||
190 | Dictionary<string, string> param = new Dictionary<string, string>(); | ||
191 | param["@ownerID"] = friendlistowner.ToString(); | ||
192 | param["@friendID"] = friend.ToString(); | ||
193 | param["@friendPerms"] = perms.ToString(); | ||
194 | param["@datetimestamp"] = dtvalue.ToString(); | ||
195 | |||
196 | try | ||
197 | { | 240 | { |
198 | using (IDbCommand adder = | 241 | command.Parameters.Add(database.CreateParameter("uuid", uuid)); |
199 | database.Query( | 242 | |
200 | "INSERT INTO " + m_userFriendsTableName + " " + | 243 | try |
201 | "(ownerID,friendID,friendPerms,datetimestamp) " + | ||
202 | "VALUES " + | ||
203 | "(@ownerID,@friendID,@friendPerms,@datetimestamp)", | ||
204 | param)) | ||
205 | { | 244 | { |
206 | adder.ExecuteNonQuery(); | 245 | using (IDataReader reader = command.ExecuteReader()) |
246 | { | ||
247 | return ReadUserRow(reader); | ||
248 | } | ||
207 | } | 249 | } |
208 | 250 | catch (Exception e) | |
209 | using (IDbCommand adder = | ||
210 | database.Query( | ||
211 | "INSERT INTO " + m_userFriendsTableName + " " + | ||
212 | "(ownerID,friendID,friendPerms,datetimestamp) " + | ||
213 | "VALUES " + | ||
214 | "(@friendID,@ownerID,@friendPerms,@datetimestamp)", | ||
215 | param)) | ||
216 | { | 251 | { |
217 | adder.ExecuteNonQuery(); | 252 | m_log.Error("[USER DB] Error getting user profile by UUID, error: " + e.Message); |
253 | return null; | ||
218 | } | 254 | } |
219 | } | 255 | } |
220 | catch (Exception e) | ||
221 | { | ||
222 | m_log.Error(e.ToString()); | ||
223 | return; | ||
224 | } | ||
225 | } | 256 | } |
226 | 257 | ||
258 | |||
227 | /// <summary> | 259 | /// <summary> |
228 | /// Remove an friend from the friendlist | 260 | /// Creates a new users profile |
229 | /// </summary> | 261 | /// </summary> |
230 | /// <param name="friendlistowner">UUID of the friendlist owner</param> | 262 | /// <param name="user">The user profile to create</param> |
231 | /// <param name="friend">UUID of the not-so-friendly user to remove from the list</param> | 263 | override public void AddNewUserProfile(UserProfileData user) |
232 | override public void RemoveUserFriend(UUID friendlistowner, UUID friend) | ||
233 | { | 264 | { |
234 | Dictionary<string, string> param = new Dictionary<string, string>(); | ||
235 | param["@ownerID"] = friendlistowner.ToString(); | ||
236 | param["@friendID"] = friend.ToString(); | ||
237 | |||
238 | |||
239 | try | 265 | try |
240 | { | 266 | { |
241 | using (IDbCommand updater = | 267 | InsertUserRow(user.ID, user.FirstName, user.SurName, user.PasswordHash, user.PasswordSalt, |
242 | database.Query( | 268 | user.HomeRegion, user.HomeLocation.X, user.HomeLocation.Y, |
243 | "delete from " + m_userFriendsTableName + " where ownerID = @ownerID and friendID = @friendID", | 269 | user.HomeLocation.Z, |
244 | param)) | 270 | user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, |
245 | { | 271 | user.LastLogin, user.UserInventoryURI, user.UserAssetURI, |
246 | updater.ExecuteNonQuery(); | 272 | user.CanDoMask, user.WantDoMask, |
247 | } | 273 | user.AboutText, user.FirstLifeAboutText, user.Image, |
248 | 274 | user.FirstLifeImage, user.WebLoginKey, user.HomeRegionID, | |
249 | using (IDbCommand updater = | 275 | user.GodLevel, user.UserFlags, user.CustomType, user.Partner); |
250 | database.Query( | ||
251 | "delete from " + m_userFriendsTableName + " where ownerID = @friendID and friendID = @ownerID", | ||
252 | param)) | ||
253 | { | ||
254 | updater.ExecuteNonQuery(); | ||
255 | } | ||
256 | |||
257 | } | 276 | } |
258 | catch (Exception e) | 277 | catch (Exception e) |
259 | { | 278 | { |
260 | m_log.Error(e.ToString()); | 279 | m_log.Error("[USER DB] Error adding new profile, error: " + e.Message); |
261 | } | 280 | } |
262 | } | 281 | } |
263 | 282 | ||
264 | /// <summary> | 283 | /// <summary> |
265 | /// Update friendlist permission flag for a friend | 284 | /// update a user profile |
266 | /// </summary> | 285 | /// </summary> |
267 | /// <param name="friendlistowner">UUID of the friendlist owner</param> | 286 | /// <param name="user">the profile to update</param> |
268 | /// <param name="friend">UUID of the friend</param> | 287 | /// <returns></returns> |
269 | /// <param name="perms">new permission flag</param> | 288 | override public bool UpdateUserProfile(UserProfileData user) |
270 | override public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) | ||
271 | { | 289 | { |
272 | Dictionary<string, string> param = new Dictionary<string, string>(); | 290 | using (AutoClosingSqlCommand command = database.Query("UPDATE " + m_usersTableName + " set UUID = @uuid, " + |
273 | param["@ownerID"] = friendlistowner.ToString(); | 291 | "username = @username, " + |
274 | param["@friendID"] = friend.ToString(); | 292 | "lastname = @lastname," + |
275 | param["@friendPerms"] = perms.ToString(); | 293 | "passwordHash = @passwordHash," + |
276 | 294 | "passwordSalt = @passwordSalt," + | |
277 | 295 | "homeRegion = @homeRegion," + | |
278 | try | 296 | "homeLocationX = @homeLocationX," + |
297 | "homeLocationY = @homeLocationY," + | ||
298 | "homeLocationZ = @homeLocationZ," + | ||
299 | "homeLookAtX = @homeLookAtX," + | ||
300 | "homeLookAtY = @homeLookAtY," + | ||
301 | "homeLookAtZ = @homeLookAtZ," + | ||
302 | "created = @created," + | ||
303 | "lastLogin = @lastLogin," + | ||
304 | "userInventoryURI = @userInventoryURI," + | ||
305 | "userAssetURI = @userAssetURI," + | ||
306 | "profileCanDoMask = @profileCanDoMask," + | ||
307 | "profileWantDoMask = @profileWantDoMask," + | ||
308 | "profileAboutText = @profileAboutText," + | ||
309 | "profileFirstText = @profileFirstText," + | ||
310 | "profileImage = @profileImage," + | ||
311 | "profileFirstImage = @profileFirstImage, " + | ||
312 | "webLoginKey = @webLoginKey, " + | ||
313 | "homeRegionID = @homeRegionID, " + | ||
314 | "userFlags = @userFlags, " + | ||
315 | "godLevel = @godLevel, " + | ||
316 | "customType = @customType, " + | ||
317 | "partner = @partner where " + | ||
318 | "UUID = @keyUUUID;")) | ||
279 | { | 319 | { |
280 | using (IDbCommand updater = | 320 | command.Parameters.Add(database.CreateParameter("uuid", user.ID)); |
281 | database.Query( | 321 | command.Parameters.Add(database.CreateParameter("username", user.FirstName)); |
282 | "update " + m_userFriendsTableName + | 322 | command.Parameters.Add(database.CreateParameter("lastname", user.SurName)); |
283 | " SET friendPerms = @friendPerms " + | 323 | command.Parameters.Add(database.CreateParameter("passwordHash", user.PasswordHash)); |
284 | "where ownerID = @ownerID and friendID = @friendID", | 324 | command.Parameters.Add(database.CreateParameter("passwordSalt", user.PasswordSalt)); |
285 | param)) | 325 | command.Parameters.Add(database.CreateParameter("homeRegion", user.HomeRegion)); |
326 | command.Parameters.Add(database.CreateParameter("homeLocationX", user.HomeLocation.X)); | ||
327 | command.Parameters.Add(database.CreateParameter("homeLocationY", user.HomeLocation.Y)); | ||
328 | command.Parameters.Add(database.CreateParameter("homeLocationZ", user.HomeLocation.Z)); | ||
329 | command.Parameters.Add(database.CreateParameter("homeLookAtX", user.HomeLookAt.X)); | ||
330 | command.Parameters.Add(database.CreateParameter("homeLookAtY", user.HomeLookAt.Y)); | ||
331 | command.Parameters.Add(database.CreateParameter("homeLookAtZ", user.HomeLookAt.Z)); | ||
332 | command.Parameters.Add(database.CreateParameter("created", user.Created)); | ||
333 | command.Parameters.Add(database.CreateParameter("lastLogin", user.LastLogin)); | ||
334 | command.Parameters.Add(database.CreateParameter("userInventoryURI", user.UserInventoryURI)); | ||
335 | command.Parameters.Add(database.CreateParameter("userAssetURI", user.UserAssetURI)); | ||
336 | command.Parameters.Add(database.CreateParameter("profileCanDoMask", user.CanDoMask)); | ||
337 | command.Parameters.Add(database.CreateParameter("profileWantDoMask", user.WantDoMask)); | ||
338 | command.Parameters.Add(database.CreateParameter("profileAboutText", user.AboutText)); | ||
339 | command.Parameters.Add(database.CreateParameter("profileFirstText", user.FirstLifeAboutText)); | ||
340 | command.Parameters.Add(database.CreateParameter("profileImage", user.Image)); | ||
341 | command.Parameters.Add(database.CreateParameter("profileFirstImage", user.FirstLifeImage)); | ||
342 | command.Parameters.Add(database.CreateParameter("webLoginKey", user.WebLoginKey)); | ||
343 | // | ||
344 | command.Parameters.Add(database.CreateParameter("homeRegionID", user.HomeRegionID)); | ||
345 | command.Parameters.Add(database.CreateParameter("userFlags", user.UserFlags)); | ||
346 | command.Parameters.Add(database.CreateParameter("godLevel", user.GodLevel)); | ||
347 | command.Parameters.Add(database.CreateParameter("customType", user.CustomType)); | ||
348 | command.Parameters.Add(database.CreateParameter("partner", user.Partner)); | ||
349 | command.Parameters.Add(database.CreateParameter("keyUUUID", user.ID)); | ||
350 | |||
351 | try | ||
286 | { | 352 | { |
287 | updater.ExecuteNonQuery(); | 353 | int affected = command.ExecuteNonQuery(); |
354 | return (affected != 0); | ||
355 | } | ||
356 | catch (Exception e) | ||
357 | { | ||
358 | m_log.Error("[USER DB] Error updating profile, error: " + e.Message); | ||
288 | } | 359 | } |
289 | } | 360 | } |
290 | catch (Exception e) | 361 | return false; |
291 | { | ||
292 | m_log.Error(e.ToString()); | ||
293 | } | ||
294 | } | 362 | } |
295 | 363 | ||
364 | #endregion | ||
365 | |||
366 | #region Agent table methods | ||
367 | |||
296 | /// <summary> | 368 | /// <summary> |
297 | /// Get (fetch?) the user's friendlist | 369 | /// Returns a user session searching by name |
298 | /// </summary> | 370 | /// </summary> |
299 | /// <param name="friendlistowner">UUID of the friendlist owner</param> | 371 | /// <param name="name">The account name</param> |
300 | /// <returns>Friendlist list</returns> | 372 | /// <returns>The users session</returns> |
301 | override public List<FriendListItem> GetUserFriendList(UUID friendlistowner) | 373 | override public UserAgentData GetAgentByName(string name) |
302 | { | 374 | { |
303 | List<FriendListItem> Lfli = new List<FriendListItem>(); | 375 | return GetAgentByName(name.Split(' ')[0], name.Split(' ')[1]); |
376 | } | ||
304 | 377 | ||
305 | Dictionary<string, string> param = new Dictionary<string, string>(); | 378 | /// <summary> |
306 | param["@ownerID"] = friendlistowner.ToString(); | 379 | /// Returns a user session by account name |
380 | /// </summary> | ||
381 | /// <param name="user">First part of the users account name</param> | ||
382 | /// <param name="last">Second part of the users account name</param> | ||
383 | /// <returns>The users session</returns> | ||
384 | override public UserAgentData GetAgentByName(string user, string last) | ||
385 | { | ||
386 | UserProfileData profile = GetUserByName(user, last); | ||
387 | return GetAgentByUUID(profile.ID); | ||
388 | } | ||
307 | 389 | ||
308 | try | 390 | /// <summary> |
391 | /// Returns an agent session by account UUID | ||
392 | /// </summary> | ||
393 | /// <param name="uuid">The accounts UUID</param> | ||
394 | /// <returns>The users session</returns> | ||
395 | override public UserAgentData GetAgentByUUID(UUID uuid) | ||
396 | { | ||
397 | using (AutoClosingSqlCommand command = database.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = @uuid")) | ||
309 | { | 398 | { |
310 | //Left Join userfriends to itself | 399 | command.Parameters.Add(database.CreateParameter("uuid", uuid)); |
311 | using (IDbCommand result = | 400 | try |
312 | database.Query( | ||
313 | "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " + m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" + | ||
314 | " where a.ownerID = @ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID", | ||
315 | param)) | ||
316 | using (IDataReader reader = result.ExecuteReader()) | ||
317 | { | 401 | { |
318 | while (reader.Read()) | 402 | using (SqlDataReader reader = command.ExecuteReader()) |
319 | { | 403 | { |
320 | FriendListItem fli = new FriendListItem(); | 404 | return readAgentRow(reader); |
321 | fli.FriendListOwner = new UUID((string)reader["ownerID"]); | ||
322 | fli.Friend = new UUID((string)reader["friendID"]); | ||
323 | fli.FriendPerms = (uint)Convert.ToInt32(reader["friendPerms"]); | ||
324 | |||
325 | // This is not a real column in the database table, it's a joined column from the opposite record | ||
326 | fli.FriendListOwnerPerms = (uint)Convert.ToInt32(reader["ownerperms"]); | ||
327 | |||
328 | Lfli.Add(fli); | ||
329 | } | 405 | } |
330 | } | 406 | } |
407 | catch (Exception e) | ||
408 | { | ||
409 | m_log.Error("[USER DB] Error updating agentdata by UUID, error: " + e.Message); | ||
410 | return null; | ||
411 | } | ||
412 | } | ||
413 | } | ||
414 | |||
415 | /// <summary> | ||
416 | /// Creates a new agent | ||
417 | /// </summary> | ||
418 | /// <param name="agent">The agent to create</param> | ||
419 | override public void AddNewUserAgent(UserAgentData agent) | ||
420 | { | ||
421 | try | ||
422 | { | ||
423 | InsertUpdateAgentRow(agent); | ||
331 | } | 424 | } |
332 | catch (Exception e) | 425 | catch (Exception e) |
333 | { | 426 | { |
334 | m_log.Error(e.ToString()); | 427 | m_log.Error("[USER DB] Error adding new agentdata, error: " + e.Message); |
335 | } | 428 | } |
336 | |||
337 | return Lfli; | ||
338 | } | 429 | } |
339 | 430 | ||
340 | #endregion | 431 | #endregion |
341 | 432 | ||
433 | #region User Friends List Data | ||
434 | |||
342 | /// <summary> | 435 | /// <summary> |
343 | /// STUB ! Update current region | 436 | /// Add a new friend in the friendlist |
344 | /// </summary> | 437 | /// </summary> |
345 | /// <param name="avatarid">avatar uuid</param> | 438 | /// <param name="friendlistowner">UUID of the friendlist owner</param> |
346 | /// <param name="regionuuid">region uuid</param> | 439 | /// <param name="friend">Friend's UUID</param> |
347 | /// <param name="regionhandle">region handle</param> | 440 | /// <param name="perms">Permission flag</param> |
348 | override public void UpdateUserCurrentRegion(UUID avatarid, UUID regionuuid, ulong regionhandle) | 441 | override public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) |
349 | { | 442 | { |
350 | //m_log.Info("[USER]: Stub UpdateUserCUrrentRegion called"); | 443 | int dtvalue = Util.UnixTimeSinceEpoch(); |
444 | |||
445 | using (AutoClosingSqlCommand command = database.Query( | ||
446 | "INSERT INTO " + m_userFriendsTableName + " " + | ||
447 | "(ownerID,friendID,friendPerms,datetimestamp) " + | ||
448 | "VALUES " + | ||
449 | "(@ownerID,@friendID,@friendPerms,@datetimestamp)")) | ||
450 | { | ||
451 | command.Parameters.Add(database.CreateParameter("ownerID", friendlistowner)); | ||
452 | command.Parameters.Add(database.CreateParameter("friendID", friend)); | ||
453 | command.Parameters.Add(database.CreateParameter("friendPerms", perms)); | ||
454 | command.Parameters.Add(database.CreateParameter("datetimestamp", dtvalue)); | ||
455 | command.ExecuteNonQuery(); | ||
456 | |||
457 | try | ||
458 | { | ||
459 | command.CommandText = string.Format("INSERT INTO {0} (ownerID,friendID,friendPerms,datetimestamp) VALUES (@friendID,@ownerID,@friendPerms,@datetimestamp)", | ||
460 | m_userFriendsTableName); | ||
461 | |||
462 | command.ExecuteNonQuery(); | ||
463 | } | ||
464 | catch (Exception e) | ||
465 | { | ||
466 | m_log.Error("[USER DB] Error adding new userfriend, error: " + e.Message); | ||
467 | return; | ||
468 | } | ||
469 | } | ||
351 | } | 470 | } |
352 | 471 | ||
353 | /// <summary> | 472 | /// <summary> |
354 | /// | 473 | /// Remove an friend from the friendlist |
355 | /// </summary> | 474 | /// </summary> |
356 | /// <param name="queryID"></param> | 475 | /// <param name="friendlistowner">UUID of the friendlist owner</param> |
357 | /// <param name="query"></param> | 476 | /// <param name="friend">UUID of the not-so-friendly user to remove from the list</param> |
358 | /// <returns></returns> | 477 | override public void RemoveUserFriend(UUID friendlistowner, UUID friend) |
359 | override public List<AvatarPickerAvatar> GeneratePickerResults(UUID queryID, string query) | ||
360 | { | 478 | { |
361 | List<AvatarPickerAvatar> returnlist = new List<AvatarPickerAvatar>(); | 479 | using (AutoClosingSqlCommand command = database.Query("delete from " + m_userFriendsTableName + " where ownerID = @ownerID and friendID = @friendID")) |
362 | string[] querysplit; | ||
363 | querysplit = query.Split(' '); | ||
364 | if (querysplit.Length == 2) | ||
365 | { | 480 | { |
481 | command.Parameters.Add(database.CreateParameter("@ownerID", friendlistowner)); | ||
482 | command.Parameters.Add(database.CreateParameter("@friendID", friend)); | ||
483 | command.ExecuteNonQuery(); | ||
484 | |||
485 | command.CommandText = "delete from " + m_userFriendsTableName + | ||
486 | " where ownerID = @friendID and friendID = @ownerID"; | ||
366 | try | 487 | try |
367 | { | 488 | { |
368 | Dictionary<string, string> param = new Dictionary<string, string>(); | 489 | command.ExecuteNonQuery(); |
369 | param["first"] = querysplit[0]; | ||
370 | param["second"] = querysplit[1]; | ||
371 | |||
372 | using (IDbCommand result = database.Query("SELECT UUID,username,lastname FROM " + m_usersTableName + " WHERE username = @first AND lastname = @second", param)) | ||
373 | using (IDataReader reader = result.ExecuteReader()) | ||
374 | { | ||
375 | while (reader.Read()) | ||
376 | { | ||
377 | AvatarPickerAvatar user = new AvatarPickerAvatar(); | ||
378 | user.AvatarID = new UUID((string)reader["UUID"]); | ||
379 | user.firstName = (string)reader["username"]; | ||
380 | user.lastName = (string)reader["lastname"]; | ||
381 | returnlist.Add(user); | ||
382 | } | ||
383 | } | ||
384 | } | 490 | } |
385 | catch (Exception e) | 491 | catch (Exception e) |
386 | { | 492 | { |
387 | m_log.Error(e.ToString()); | 493 | m_log.Error("[USER DB] Error removing userfriend, error: " + e.Message); |
388 | } | 494 | } |
389 | } | 495 | } |
390 | else if (querysplit.Length == 1) | 496 | } |
497 | |||
498 | /// <summary> | ||
499 | /// Update friendlist permission flag for a friend | ||
500 | /// </summary> | ||
501 | /// <param name="friendlistowner">UUID of the friendlist owner</param> | ||
502 | /// <param name="friend">UUID of the friend</param> | ||
503 | /// <param name="perms">new permission flag</param> | ||
504 | override public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) | ||
505 | { | ||
506 | using (AutoClosingSqlCommand command = database.Query( | ||
507 | "update " + m_userFriendsTableName + | ||
508 | " SET friendPerms = @friendPerms " + | ||
509 | "where ownerID = @ownerID and friendID = @friendID")) | ||
391 | { | 510 | { |
511 | command.Parameters.Add(database.CreateParameter("@ownerID", friendlistowner)); | ||
512 | command.Parameters.Add(database.CreateParameter("@friendID", friend)); | ||
513 | command.Parameters.Add(database.CreateParameter("@friendPerms", perms)); | ||
514 | |||
392 | try | 515 | try |
393 | { | 516 | { |
394 | Dictionary<string, string> param = new Dictionary<string, string>(); | 517 | command.ExecuteNonQuery(); |
395 | param["first"] = querysplit[0]; | ||
396 | |||
397 | using (IDbCommand result = database.Query("SELECT UUID,username,lastname FROM " + m_usersTableName + " WHERE username = @first OR lastname = @first", param)) | ||
398 | using (IDataReader reader = result.ExecuteReader()) | ||
399 | { | ||
400 | while (reader.Read()) | ||
401 | { | ||
402 | AvatarPickerAvatar user = new AvatarPickerAvatar(); | ||
403 | user.AvatarID = new UUID((string)reader["UUID"]); | ||
404 | user.firstName = (string)reader["username"]; | ||
405 | user.lastName = (string)reader["lastname"]; | ||
406 | returnlist.Add(user); | ||
407 | } | ||
408 | } | ||
409 | } | 518 | } |
410 | catch (Exception e) | 519 | catch (Exception e) |
411 | { | 520 | { |
412 | m_log.Error(e.ToString()); | 521 | m_log.Error("[USER DB] Error updating userfriend, error: " + e.Message); |
413 | } | 522 | } |
414 | } | 523 | } |
415 | return returnlist; | ||
416 | } | 524 | } |
417 | 525 | ||
418 | /// <summary> | 526 | /// <summary> |
419 | /// See IUserDataPlugin | 527 | /// Get (fetch?) the user's friendlist |
420 | /// </summary> | 528 | /// </summary> |
421 | /// <param name="uuid"></param> | 529 | /// <param name="friendlistowner">UUID of the friendlist owner</param> |
422 | /// <returns></returns> | 530 | /// <returns>Friendlist list</returns> |
423 | override public UserProfileData GetUserByUUID(UUID uuid) | 531 | override public List<FriendListItem> GetUserFriendList(UUID friendlistowner) |
424 | { | 532 | { |
425 | try | 533 | List<FriendListItem> friendList = new List<FriendListItem>(); |
534 | |||
535 | //Left Join userfriends to itself | ||
536 | using (AutoClosingSqlCommand command = database.Query( | ||
537 | "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " + m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" + | ||
538 | " where a.ownerID = @ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID")) | ||
426 | { | 539 | { |
427 | Dictionary<string, string> param = new Dictionary<string, string>(); | 540 | command.Parameters.Add(database.CreateParameter("@ownerID", friendlistowner)); |
428 | param["uuid"] = uuid.ToString(); | 541 | |
542 | try | ||
543 | { | ||
544 | using (IDataReader reader = command.ExecuteReader()) | ||
545 | { | ||
546 | while (reader.Read()) | ||
547 | { | ||
548 | FriendListItem fli = new FriendListItem(); | ||
549 | fli.FriendListOwner = new UUID((string)reader["ownerID"]); | ||
550 | fli.Friend = new UUID((string)reader["friendID"]); | ||
551 | fli.FriendPerms = (uint)Convert.ToInt32(reader["friendPerms"]); | ||
429 | 552 | ||
430 | using (IDbCommand result = database.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = @uuid", param)) | 553 | // This is not a real column in the database table, it's a joined column from the opposite record |
431 | using (IDataReader reader = result.ExecuteReader()) | 554 | fli.FriendListOwnerPerms = (uint)Convert.ToInt32(reader["ownerperms"]); |
555 | |||
556 | friendList.Add(fli); | ||
557 | } | ||
558 | } | ||
559 | } | ||
560 | catch (Exception e) | ||
432 | { | 561 | { |
433 | return database.readUserRow(reader); | 562 | m_log.Error("[USER DB] Error updating userfriend, error: " + e.Message); |
434 | } | 563 | } |
435 | } | 564 | } |
436 | catch (Exception e) | 565 | |
437 | { | 566 | return friendList; |
438 | m_log.Error(e.ToString()); | ||
439 | return null; | ||
440 | } | ||
441 | } | 567 | } |
442 | 568 | ||
569 | #endregion | ||
570 | |||
571 | #region Money functions (not used) | ||
572 | |||
443 | /// <summary> | 573 | /// <summary> |
444 | /// Returns a user session searching by name | 574 | /// Performs a money transfer request between two accounts |
445 | /// </summary> | 575 | /// </summary> |
446 | /// <param name="name">The account name</param> | 576 | /// <param name="from">The senders account ID</param> |
447 | /// <returns>The users session</returns> | 577 | /// <param name="to">The receivers account ID</param> |
448 | override public UserAgentData GetAgentByName(string name) | 578 | /// <param name="amount">The amount to transfer</param> |
579 | /// <returns>false</returns> | ||
580 | override public bool MoneyTransferRequest(UUID from, UUID to, uint amount) | ||
449 | { | 581 | { |
450 | return GetAgentByName(name.Split(' ')[0], name.Split(' ')[1]); | 582 | return false; |
451 | } | 583 | } |
452 | 584 | ||
453 | /// <summary> | 585 | /// <summary> |
454 | /// Returns a user session by account name | 586 | /// Performs an inventory transfer request between two accounts |
455 | /// </summary> | 587 | /// </summary> |
456 | /// <param name="user">First part of the users account name</param> | 588 | /// <remarks>TODO: Move to inventory server</remarks> |
457 | /// <param name="last">Second part of the users account name</param> | 589 | /// <param name="from">The senders account ID</param> |
458 | /// <returns>The users session</returns> | 590 | /// <param name="to">The receivers account ID</param> |
459 | override public UserAgentData GetAgentByName(string user, string last) | 591 | /// <param name="item">The item to transfer</param> |
592 | /// <returns>false</returns> | ||
593 | override public bool InventoryTransferRequest(UUID from, UUID to, UUID item) | ||
460 | { | 594 | { |
461 | UserProfileData profile = GetUserByName(user, last); | 595 | return false; |
462 | return GetAgentByUUID(profile.ID); | ||
463 | } | 596 | } |
464 | 597 | ||
598 | #endregion | ||
599 | |||
600 | #region Appearance methods | ||
601 | |||
465 | /// <summary> | 602 | /// <summary> |
466 | /// Returns an agent session by account UUID | 603 | /// Gets the user appearance. |
467 | /// </summary> | 604 | /// </summary> |
468 | /// <param name="uuid">The accounts UUID</param> | 605 | /// <param name="user">The user.</param> |
469 | /// <returns>The users session</returns> | 606 | /// <returns></returns> |
470 | override public UserAgentData GetAgentByUUID(UUID uuid) | 607 | /// TODO: stubs for now to get us to a compiling state gently |
608 | override public AvatarAppearance GetUserAppearance(UUID user) | ||
471 | { | 609 | { |
472 | try | 610 | try |
473 | { | 611 | { |
474 | Dictionary<string, string> param = new Dictionary<string, string>(); | 612 | AvatarAppearance appearance = new AvatarAppearance(); |
475 | param["uuid"] = uuid.ToString(); | ||
476 | 613 | ||
477 | using (IDbCommand result = database.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = @uuid", param)) | 614 | using (AutoClosingSqlCommand command = database.Query("SELECT * FROM avatarappearance WHERE owner = @UUID")) |
478 | using (IDataReader reader = result.ExecuteReader()) | ||
479 | { | 615 | { |
480 | return database.readAgentRow(reader); | 616 | command.Parameters.Add(database.CreateParameter("@UUID", user)); |
617 | using (IDataReader reader = command.ExecuteReader()) | ||
618 | { | ||
619 | if (reader.Read()) | ||
620 | appearance = readUserAppearance(reader); | ||
621 | } | ||
481 | } | 622 | } |
623 | |||
624 | appearance.SetAttachments(GetUserAttachments(user)); | ||
625 | |||
626 | return appearance; | ||
482 | } | 627 | } |
483 | catch (Exception e) | 628 | catch (Exception e) |
484 | { | 629 | { |
485 | m_log.Error(e.ToString()); | 630 | m_log.Error("[USER DB] Error updating userfriend, error: " + e.Message); |
486 | return null; | ||
487 | } | 631 | } |
632 | return null; | ||
488 | } | 633 | } |
489 | 634 | ||
635 | |||
490 | /// <summary> | 636 | /// <summary> |
491 | /// Store a weblogin key | 637 | /// Update a user appearence into database |
492 | /// </summary> | 638 | /// </summary> |
493 | /// <param name="AgentID">The agent UUID</param> | 639 | /// <param name="user">the used UUID</param> |
494 | /// <param name="WebLoginKey">the WebLogin Key</param> | 640 | /// <param name="appearance">the appearence</param> |
495 | /// <remarks>unused ?</remarks> | 641 | override public void UpdateUserAppearance(UUID user, AvatarAppearance appearance) |
496 | override public void StoreWebLoginKey(UUID AgentID, UUID WebLoginKey) | ||
497 | { | 642 | { |
498 | UserProfileData user = GetUserByUUID(AgentID); | 643 | string sql = String.Empty; |
499 | user.WebLoginKey = WebLoginKey; | 644 | sql += "DELETE FROM avatarappearance WHERE owner=@owner "; |
500 | UpdateUserProfile(user); | 645 | sql += "INSERT INTO avatarappearance "; |
646 | sql += "(owner, serial, visual_params, texture, avatar_height, "; | ||
647 | sql += "body_item, body_asset, skin_item, skin_asset, hair_item, hair_asset, eyes_item, eyes_asset, "; | ||
648 | sql += "shirt_item, shirt_asset, pants_item, pants_asset, shoes_item, shoes_asset, socks_item, socks_asset, "; | ||
649 | sql += "jacket_item, jacket_asset, gloves_item, gloves_asset, undershirt_item, undershirt_asset, underpants_item, underpants_asset, "; | ||
650 | sql += "skirt_item, skirt_asset) values ("; | ||
651 | sql += "@owner, @serial, @visual_params, @texture, @avatar_height, "; | ||
652 | sql += "@body_item, @body_asset, @skin_item, @skin_asset, @hair_item, @hair_asset, @eyes_item, @eyes_asset, "; | ||
653 | sql += "@shirt_item, @shirt_asset, @pants_item, @pants_asset, @shoes_item, @shoes_asset, @socks_item, @socks_asset, "; | ||
654 | sql += "@jacket_item, @jacket_asset, @gloves_item, @gloves_asset, @undershirt_item, @undershirt_asset, @underpants_item, @underpants_asset, "; | ||
655 | sql += "@skirt_item, @skirt_asset)"; | ||
656 | |||
657 | using (AutoClosingSqlCommand cmd = database.Query(sql)) | ||
658 | { | ||
659 | cmd.Parameters.Add(database.CreateParameter("@owner", appearance.Owner)); | ||
660 | cmd.Parameters.Add(database.CreateParameter("@serial", appearance.Serial)); | ||
661 | cmd.Parameters.Add(database.CreateParameter("@visual_params", appearance.VisualParams)); | ||
662 | cmd.Parameters.Add(database.CreateParameter("@texture", appearance.Texture.ToBytes())); | ||
663 | cmd.Parameters.Add(database.CreateParameter("@avatar_height", appearance.AvatarHeight)); | ||
664 | cmd.Parameters.Add(database.CreateParameter("@body_item", appearance.BodyItem)); | ||
665 | cmd.Parameters.Add(database.CreateParameter("@body_asset", appearance.BodyAsset)); | ||
666 | cmd.Parameters.Add(database.CreateParameter("@skin_item", appearance.SkinItem)); | ||
667 | cmd.Parameters.Add(database.CreateParameter("@skin_asset", appearance.SkinAsset)); | ||
668 | cmd.Parameters.Add(database.CreateParameter("@hair_item", appearance.HairItem)); | ||
669 | cmd.Parameters.Add(database.CreateParameter("@hair_asset", appearance.HairAsset)); | ||
670 | cmd.Parameters.Add(database.CreateParameter("@eyes_item", appearance.EyesItem)); | ||
671 | cmd.Parameters.Add(database.CreateParameter("@eyes_asset", appearance.EyesAsset)); | ||
672 | cmd.Parameters.Add(database.CreateParameter("@shirt_item", appearance.ShirtItem)); | ||
673 | cmd.Parameters.Add(database.CreateParameter("@shirt_asset", appearance.ShirtAsset)); | ||
674 | cmd.Parameters.Add(database.CreateParameter("@pants_item", appearance.PantsItem)); | ||
675 | cmd.Parameters.Add(database.CreateParameter("@pants_asset", appearance.PantsAsset)); | ||
676 | cmd.Parameters.Add(database.CreateParameter("@shoes_item", appearance.ShoesItem)); | ||
677 | cmd.Parameters.Add(database.CreateParameter("@shoes_asset", appearance.ShoesAsset)); | ||
678 | cmd.Parameters.Add(database.CreateParameter("@socks_item", appearance.SocksItem)); | ||
679 | cmd.Parameters.Add(database.CreateParameter("@socks_asset", appearance.SocksAsset)); | ||
680 | cmd.Parameters.Add(database.CreateParameter("@jacket_item", appearance.JacketItem)); | ||
681 | cmd.Parameters.Add(database.CreateParameter("@jacket_asset", appearance.JacketAsset)); | ||
682 | cmd.Parameters.Add(database.CreateParameter("@gloves_item", appearance.GlovesItem)); | ||
683 | cmd.Parameters.Add(database.CreateParameter("@gloves_asset", appearance.GlovesAsset)); | ||
684 | cmd.Parameters.Add(database.CreateParameter("@undershirt_item", appearance.UnderShirtItem)); | ||
685 | cmd.Parameters.Add(database.CreateParameter("@undershirt_asset", appearance.UnderShirtAsset)); | ||
686 | cmd.Parameters.Add(database.CreateParameter("@underpants_item", appearance.UnderPantsItem)); | ||
687 | cmd.Parameters.Add(database.CreateParameter("@underpants_asset", appearance.UnderPantsAsset)); | ||
688 | cmd.Parameters.Add(database.CreateParameter("@skirt_item", appearance.SkirtItem)); | ||
689 | cmd.Parameters.Add(database.CreateParameter("@skirt_asset", appearance.SkirtAsset)); | ||
501 | 690 | ||
691 | try | ||
692 | { | ||
693 | cmd.ExecuteNonQuery(); | ||
694 | } | ||
695 | catch (Exception e) | ||
696 | { | ||
697 | m_log.Error("[USER DB] Error updating user appearance, error: " + e.Message); | ||
698 | } | ||
699 | } | ||
700 | |||
701 | UpdateUserAttachments(user, appearance.GetAttachments()); | ||
502 | } | 702 | } |
703 | |||
704 | #endregion | ||
705 | |||
706 | #region Attachment methods | ||
707 | |||
503 | /// <summary> | 708 | /// <summary> |
504 | /// Creates a new users profile | 709 | /// Gets all attachment of a agent. |
505 | /// </summary> | 710 | /// </summary> |
506 | /// <param name="user">The user profile to create</param> | 711 | /// <param name="agentID">agent ID.</param> |
507 | override public void AddNewUserProfile(UserProfileData user) | 712 | /// <returns></returns> |
713 | public Hashtable GetUserAttachments(UUID agentID) | ||
508 | { | 714 | { |
509 | try | 715 | Hashtable returnTable = new Hashtable(); |
510 | { | 716 | using (AutoClosingSqlCommand command = database.Query("select attachpoint, item, asset from avatarattachments where UUID = @uuid", database.CreateParameter("@uuid", agentID))) |
511 | InsertUserRow(user.ID, user.FirstName, user.SurName, user.PasswordHash, user.PasswordSalt, | ||
512 | user.HomeRegion, user.HomeLocation.X, user.HomeLocation.Y, | ||
513 | user.HomeLocation.Z, | ||
514 | user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, | ||
515 | user.LastLogin, user.UserInventoryURI, user.UserAssetURI, | ||
516 | user.CanDoMask, user.WantDoMask, | ||
517 | user.AboutText, user.FirstLifeAboutText, user.Image, | ||
518 | user.FirstLifeImage, user.WebLoginKey); | ||
519 | } | ||
520 | catch (Exception e) | ||
521 | { | 717 | { |
522 | m_log.Error(e.ToString()); | 718 | using (SqlDataReader reader = command.ExecuteReader()) |
719 | { | ||
720 | while (reader.Read()) | ||
721 | { | ||
722 | int attachpoint = Convert.ToInt32(reader["attachpoint"]); | ||
723 | if (returnTable.ContainsKey(attachpoint)) | ||
724 | continue; | ||
725 | Hashtable item = new Hashtable(); | ||
726 | item.Add("item", reader["item"].ToString()); | ||
727 | item.Add("asset", reader["asset"].ToString()); | ||
728 | |||
729 | returnTable.Add(attachpoint, item); | ||
730 | } | ||
731 | } | ||
523 | } | 732 | } |
733 | return returnTable; | ||
524 | } | 734 | } |
525 | 735 | ||
526 | /// <summary> | 736 | /// <summary> |
527 | /// Creates a new user and inserts it into the database | 737 | /// Updates all attachments of the agent. |
528 | /// </summary> | 738 | /// </summary> |
529 | /// <param name="uuid">User ID</param> | 739 | /// <param name="agentID">agentID.</param> |
530 | /// <param name="username">First part of the login</param> | 740 | /// <param name="data">data with all items on attachmentpoints</param> |
531 | /// <param name="lastname">Second part of the login</param> | 741 | public void UpdateUserAttachments(UUID agentID, Hashtable data) |
532 | /// <param name="passwordHash">A salted hash of the users password</param> | 742 | { |
533 | /// <param name="passwordSalt">The salt used for the password hash</param> | 743 | string sql = "delete from avatarattachments where UUID = @uuid"; |
534 | /// <param name="homeRegion">A regionHandle of the users home region</param> | ||
535 | /// <param name="homeLocX">Home region position vector</param> | ||
536 | /// <param name="homeLocY">Home region position vector</param> | ||
537 | /// <param name="homeLocZ">Home region position vector</param> | ||
538 | /// <param name="homeLookAtX">Home region 'look at' vector</param> | ||
539 | /// <param name="homeLookAtY">Home region 'look at' vector</param> | ||
540 | /// <param name="homeLookAtZ">Home region 'look at' vector</param> | ||
541 | /// <param name="created">Account created (unix timestamp)</param> | ||
542 | /// <param name="lastlogin">Last login (unix timestamp)</param> | ||
543 | /// <param name="inventoryURI">Users inventory URI</param> | ||
544 | /// <param name="assetURI">Users asset URI</param> | ||
545 | /// <param name="canDoMask">I can do mask</param> | ||
546 | /// <param name="wantDoMask">I want to do mask</param> | ||
547 | /// <param name="aboutText">Profile text</param> | ||
548 | /// <param name="firstText">Firstlife text</param> | ||
549 | /// <param name="profileImage">UUID for profile image</param> | ||
550 | /// <param name="firstImage">UUID for firstlife image</param> | ||
551 | /// <returns>Success?</returns> | ||
552 | private bool InsertUserRow(UUID uuid, string username, string lastname, string passwordHash, | ||
553 | string passwordSalt, UInt64 homeRegion, float homeLocX, float homeLocY, float homeLocZ, | ||
554 | float homeLookAtX, float homeLookAtY, float homeLookAtZ, int created, int lastlogin, | ||
555 | string inventoryURI, string assetURI, uint canDoMask, uint wantDoMask, | ||
556 | string aboutText, string firstText, | ||
557 | UUID profileImage, UUID firstImage, UUID webLoginKey) | ||
558 | { | ||
559 | string sql = "INSERT INTO "+m_usersTableName; | ||
560 | sql += " ([UUID], [username], [lastname], [passwordHash], [passwordSalt], [homeRegion], "; | ||
561 | sql += | ||
562 | "[homeLocationX], [homeLocationY], [homeLocationZ], [homeLookAtX], [homeLookAtY], [homeLookAtZ], [created], "; | ||
563 | sql += | ||
564 | "[lastLogin], [userInventoryURI], [userAssetURI], [profileCanDoMask], [profileWantDoMask], [profileAboutText], "; | ||
565 | sql += "[profileFirstText], [profileImage], [profileFirstImage], [webLoginKey]) VALUES "; | ||
566 | 744 | ||
567 | sql += "(@UUID, @username, @lastname, @passwordHash, @passwordSalt, @homeRegion, "; | 745 | using (AutoClosingSqlCommand command = database.Query(sql)) |
568 | sql += | 746 | { |
569 | "@homeLocationX, @homeLocationY, @homeLocationZ, @homeLookAtX, @homeLookAtY, @homeLookAtZ, @created, "; | 747 | command.Parameters.Add(database.CreateParameter("uuid", agentID)); |
570 | sql += | 748 | command.ExecuteNonQuery(); |
571 | "@lastLogin, @userInventoryURI, @userAssetURI, @profileCanDoMask, @profileWantDoMask, @profileAboutText, "; | 749 | } |
572 | sql += "@profileFirstText, @profileImage, @profileFirstImage, @webLoginKey);"; | 750 | if (data == null) |
573 | 751 | return; | |
574 | Dictionary<string, string> parameters = new Dictionary<string, string>(); | ||
575 | parameters["UUID"] = uuid.ToString(); | ||
576 | parameters["username"] = username.ToString(); | ||
577 | parameters["lastname"] = lastname.ToString(); | ||
578 | parameters["passwordHash"] = passwordHash.ToString(); | ||
579 | parameters["passwordSalt"] = passwordSalt.ToString(); | ||
580 | parameters["homeRegion"] = homeRegion.ToString(); | ||
581 | parameters["homeLocationX"] = homeLocX.ToString(); | ||
582 | parameters["homeLocationY"] = homeLocY.ToString(); | ||
583 | parameters["homeLocationZ"] = homeLocZ.ToString(); | ||
584 | parameters["homeLookAtX"] = homeLookAtX.ToString(); | ||
585 | parameters["homeLookAtY"] = homeLookAtY.ToString(); | ||
586 | parameters["homeLookAtZ"] = homeLookAtZ.ToString(); | ||
587 | parameters["created"] = created.ToString(); | ||
588 | parameters["lastLogin"] = lastlogin.ToString(); | ||
589 | parameters["userInventoryURI"] = String.Empty; | ||
590 | parameters["userAssetURI"] = String.Empty; | ||
591 | parameters["profileCanDoMask"] = "0"; | ||
592 | parameters["profileWantDoMask"] = "0"; | ||
593 | parameters["profileAboutText"] = aboutText; | ||
594 | parameters["profileFirstText"] = firstText; | ||
595 | parameters["profileImage"] = profileImage.ToString(); | ||
596 | parameters["profileFirstImage"] = firstImage.ToString(); | ||
597 | parameters["webLoginKey"] = UUID.Random().ToString(); | ||
598 | 752 | ||
753 | sql = "insert into avatarattachments (UUID, attachpoint, item, asset) values (@uuid, @attachpoint, @item, @asset)"; | ||
599 | 754 | ||
600 | try | 755 | using (AutoClosingSqlCommand command = database.Query(sql)) |
601 | { | 756 | { |
602 | using (IDbCommand result = database.Query(sql, parameters)) | 757 | bool firstTime = true; |
758 | foreach (DictionaryEntry e in data) | ||
603 | { | 759 | { |
604 | return (result.ExecuteNonQuery() == 1); | 760 | int attachpoint = Convert.ToInt32(e.Key); |
761 | |||
762 | Hashtable item = (Hashtable)e.Value; | ||
763 | |||
764 | if (firstTime) | ||
765 | { | ||
766 | command.Parameters.Add(database.CreateParameter("@uuid", agentID)); | ||
767 | command.Parameters.Add(database.CreateParameter("@attachpoint", attachpoint)); | ||
768 | command.Parameters.Add(database.CreateParameter("@item", item["item"].ToString())); | ||
769 | command.Parameters.Add(database.CreateParameter("@asset", item["asset"].ToString())); | ||
770 | firstTime = false; | ||
771 | } | ||
772 | command.Parameters["@uuid"].Value = agentID.ToString(); | ||
773 | command.Parameters["@attachpoint"].Value = attachpoint; | ||
774 | command.Parameters["@item"].Value = item["item"].ToString(); | ||
775 | command.Parameters["@asset"].Value = item["asset"].ToString(); | ||
776 | |||
777 | try | ||
778 | { | ||
779 | command.ExecuteNonQuery(); | ||
780 | } | ||
781 | catch (Exception ex) | ||
782 | { | ||
783 | m_log.DebugFormat("[USER DB] : Error adding user attachment. {0}", ex.Message); | ||
784 | } | ||
605 | } | 785 | } |
606 | } | 786 | } |
607 | catch (Exception e) | ||
608 | { | ||
609 | m_log.Error(e.ToString()); | ||
610 | return false; | ||
611 | } | ||
612 | |||
613 | } | 787 | } |
614 | 788 | ||
615 | /// <summary> | 789 | /// <summary> |
616 | /// Creates a new agent | 790 | /// Resets all attachments of a agent in the database. |
617 | /// </summary> | 791 | /// </summary> |
618 | /// <param name="agent">The agent to create</param> | 792 | /// <param name="agentID">agentID.</param> |
619 | override public void AddNewUserAgent(UserAgentData agent) | 793 | override public void ResetAttachments(UUID agentID) |
620 | { | 794 | { |
621 | try | 795 | using (AutoClosingSqlCommand command = database.Query("update avatarattachments set asset = '00000000-0000-0000-0000-000000000000' where UUID = @uuid")) |
622 | { | 796 | { |
623 | database.insertAgentRow(agent); | 797 | command.Parameters.Add(database.CreateParameter("uuid", agentID)); |
624 | } | 798 | command.ExecuteNonQuery(); |
625 | catch (Exception e) | ||
626 | { | ||
627 | m_log.Error(e.ToString()); | ||
628 | } | 799 | } |
629 | } | 800 | } |
630 | 801 | ||
802 | #endregion | ||
803 | |||
804 | #region Other public methods | ||
805 | |||
631 | /// <summary> | 806 | /// <summary> |
632 | /// update a user profile | 807 | /// STUB ! Update current region |
633 | /// </summary> | 808 | /// </summary> |
634 | /// <param name="user">the profile to update</param> | 809 | /// <param name="avatarid">avatar uuid</param> |
810 | /// <param name="regionuuid">region uuid</param> | ||
811 | /// <param name="regionhandle">region handle</param> | ||
812 | override public void UpdateUserCurrentRegion(UUID avatarid, UUID regionuuid, ulong regionhandle) | ||
813 | { | ||
814 | //m_log.Info("[USER]: Stub UpdateUserCUrrentRegion called"); | ||
815 | } | ||
816 | |||
817 | /// <summary> | ||
818 | /// | ||
819 | /// </summary> | ||
820 | /// <param name="queryID"></param> | ||
821 | /// <param name="query"></param> | ||
635 | /// <returns></returns> | 822 | /// <returns></returns> |
636 | override public bool UpdateUserProfile(UserProfileData user) | 823 | override public List<AvatarPickerAvatar> GeneratePickerResults(UUID queryID, string query) |
637 | { | 824 | { |
638 | using (IDbCommand command = database.Query("UPDATE " + m_usersTableName + " set UUID = @uuid, " + | 825 | List<AvatarPickerAvatar> returnlist = new List<AvatarPickerAvatar>(); |
639 | "username = @username, " + | 826 | string[] querysplit = query.Split(' '); |
640 | "lastname = @lastname," + | 827 | if (querysplit.Length == 2) |
641 | "passwordHash = @passwordHash," + | 828 | { |
642 | "passwordSalt = @passwordSalt," + | ||
643 | "homeRegion = @homeRegion," + | ||
644 | "homeLocationX = @homeLocationX," + | ||
645 | "homeLocationY = @homeLocationY," + | ||
646 | "homeLocationZ = @homeLocationZ," + | ||
647 | "homeLookAtX = @homeLookAtX," + | ||
648 | "homeLookAtY = @homeLookAtY," + | ||
649 | "homeLookAtZ = @homeLookAtZ," + | ||
650 | "created = @created," + | ||
651 | "lastLogin = @lastLogin," + | ||
652 | "userInventoryURI = @userInventoryURI," + | ||
653 | "userAssetURI = @userAssetURI," + | ||
654 | "profileCanDoMask = @profileCanDoMask," + | ||
655 | "profileWantDoMask = @profileWantDoMask," + | ||
656 | "profileAboutText = @profileAboutText," + | ||
657 | "profileFirstText = @profileFirstText," + | ||
658 | "profileImage = @profileImage," + | ||
659 | "profileFirstImage = @profileFirstImage, " + | ||
660 | "webLoginKey = @webLoginKey where " + | ||
661 | "UUID = @keyUUUID;")) | ||
662 | { | ||
663 | SqlParameter param1 = new SqlParameter("@uuid", user.ID.ToString()); | ||
664 | SqlParameter param2 = new SqlParameter("@username", user.FirstName); | ||
665 | SqlParameter param3 = new SqlParameter("@lastname", user.SurName); | ||
666 | SqlParameter param4 = new SqlParameter("@passwordHash", user.PasswordHash); | ||
667 | SqlParameter param5 = new SqlParameter("@passwordSalt", user.PasswordSalt); | ||
668 | SqlParameter param6 = new SqlParameter("@homeRegion", Convert.ToInt64(user.HomeRegion)); | ||
669 | SqlParameter param7 = new SqlParameter("@homeLocationX", user.HomeLocation.X); | ||
670 | SqlParameter param8 = new SqlParameter("@homeLocationY", user.HomeLocation.Y); | ||
671 | SqlParameter param9 = new SqlParameter("@homeLocationZ", user.HomeLocation.Y); | ||
672 | SqlParameter param10 = new SqlParameter("@homeLookAtX", user.HomeLookAt.X); | ||
673 | SqlParameter param11 = new SqlParameter("@homeLookAtY", user.HomeLookAt.Y); | ||
674 | SqlParameter param12 = new SqlParameter("@homeLookAtZ", user.HomeLookAt.Z); | ||
675 | SqlParameter param13 = new SqlParameter("@created", Convert.ToInt32(user.Created)); | ||
676 | SqlParameter param14 = new SqlParameter("@lastLogin", Convert.ToInt32(user.LastLogin)); | ||
677 | SqlParameter param15 = new SqlParameter("@userInventoryURI", user.UserInventoryURI); | ||
678 | SqlParameter param16 = new SqlParameter("@userAssetURI", user.UserAssetURI); | ||
679 | SqlParameter param17 = new SqlParameter("@profileCanDoMask", Convert.ToInt32(user.CanDoMask)); | ||
680 | SqlParameter param18 = new SqlParameter("@profileWantDoMask", Convert.ToInt32(user.WantDoMask)); | ||
681 | SqlParameter param19 = new SqlParameter("@profileAboutText", user.AboutText); | ||
682 | SqlParameter param20 = new SqlParameter("@profileFirstText", user.FirstLifeAboutText); | ||
683 | SqlParameter param21 = new SqlParameter("@profileImage", user.Image.ToString()); | ||
684 | SqlParameter param22 = new SqlParameter("@profileFirstImage", user.FirstLifeImage.ToString()); | ||
685 | SqlParameter param23 = new SqlParameter("@keyUUUID", user.ID.ToString()); | ||
686 | SqlParameter param24 = new SqlParameter("@webLoginKey", user.WebLoginKey.ToString()); | ||
687 | command.Parameters.Add(param1); | ||
688 | command.Parameters.Add(param2); | ||
689 | command.Parameters.Add(param3); | ||
690 | command.Parameters.Add(param4); | ||
691 | command.Parameters.Add(param5); | ||
692 | command.Parameters.Add(param6); | ||
693 | command.Parameters.Add(param7); | ||
694 | command.Parameters.Add(param8); | ||
695 | command.Parameters.Add(param9); | ||
696 | command.Parameters.Add(param10); | ||
697 | command.Parameters.Add(param11); | ||
698 | command.Parameters.Add(param12); | ||
699 | command.Parameters.Add(param13); | ||
700 | command.Parameters.Add(param14); | ||
701 | command.Parameters.Add(param15); | ||
702 | command.Parameters.Add(param16); | ||
703 | command.Parameters.Add(param17); | ||
704 | command.Parameters.Add(param18); | ||
705 | command.Parameters.Add(param19); | ||
706 | command.Parameters.Add(param20); | ||
707 | command.Parameters.Add(param21); | ||
708 | command.Parameters.Add(param22); | ||
709 | command.Parameters.Add(param23); | ||
710 | command.Parameters.Add(param24); | ||
711 | try | 829 | try |
712 | { | 830 | { |
713 | int affected = command.ExecuteNonQuery(); | 831 | using (AutoClosingSqlCommand command = database.Query("SELECT UUID,username,lastname FROM " + m_usersTableName + " WHERE username LIKE @first AND lastname LIKE @second")) |
714 | return (affected != 0); | 832 | { |
833 | //Add wildcard to the search | ||
834 | command.Parameters.Add(database.CreateParameter("first", querysplit[0] + "%")); | ||
835 | command.Parameters.Add(database.CreateParameter("second", querysplit[1] + "%")); | ||
836 | using (IDataReader reader = command.ExecuteReader()) | ||
837 | { | ||
838 | while (reader.Read()) | ||
839 | { | ||
840 | AvatarPickerAvatar user = new AvatarPickerAvatar(); | ||
841 | user.AvatarID = new UUID((string)reader["UUID"]); | ||
842 | user.firstName = (string)reader["username"]; | ||
843 | user.lastName = (string)reader["lastname"]; | ||
844 | returnlist.Add(user); | ||
845 | } | ||
846 | } | ||
847 | } | ||
715 | } | 848 | } |
716 | catch (Exception e) | 849 | catch (Exception e) |
717 | { | 850 | { |
718 | m_log.Error(e.ToString()); | 851 | m_log.Error(e.ToString()); |
719 | } | 852 | } |
720 | } | 853 | } |
721 | return false; | 854 | else if (querysplit.Length == 1) |
855 | { | ||
856 | try | ||
857 | { | ||
858 | using (AutoClosingSqlCommand command = database.Query("SELECT UUID,username,lastname FROM " + m_usersTableName + " WHERE username LIKE @first OR lastname LIKE @first")) | ||
859 | { | ||
860 | command.Parameters.Add(database.CreateParameter("first", querysplit[0] + "%")); | ||
861 | |||
862 | using (IDataReader reader = command.ExecuteReader()) | ||
863 | { | ||
864 | while (reader.Read()) | ||
865 | { | ||
866 | AvatarPickerAvatar user = new AvatarPickerAvatar(); | ||
867 | user.AvatarID = new UUID((string)reader["UUID"]); | ||
868 | user.firstName = (string)reader["username"]; | ||
869 | user.lastName = (string)reader["lastname"]; | ||
870 | returnlist.Add(user); | ||
871 | } | ||
872 | } | ||
873 | } | ||
874 | } | ||
875 | catch (Exception e) | ||
876 | { | ||
877 | m_log.Error(e.ToString()); | ||
878 | } | ||
879 | } | ||
880 | return returnlist; | ||
722 | } | 881 | } |
723 | 882 | ||
724 | /// <summary> | 883 | /// <summary> |
725 | /// Performs a money transfer request between two accounts | 884 | /// Store a weblogin key |
726 | /// </summary> | 885 | /// </summary> |
727 | /// <param name="from">The senders account ID</param> | 886 | /// <param name="AgentID">The agent UUID</param> |
728 | /// <param name="to">The receivers account ID</param> | 887 | /// <param name="WebLoginKey">the WebLogin Key</param> |
729 | /// <param name="amount">The amount to transfer</param> | 888 | /// <remarks>unused ?</remarks> |
730 | /// <returns>false</returns> | 889 | override public void StoreWebLoginKey(UUID AgentID, UUID WebLoginKey) |
731 | override public bool MoneyTransferRequest(UUID from, UUID to, uint amount) | ||
732 | { | 890 | { |
733 | return false; | 891 | UserProfileData user = GetUserByUUID(AgentID); |
892 | user.WebLoginKey = WebLoginKey; | ||
893 | UpdateUserProfile(user); | ||
894 | |||
734 | } | 895 | } |
735 | 896 | ||
736 | /// <summary> | 897 | /// <summary> |
737 | /// Performs an inventory transfer request between two accounts | 898 | /// Database provider name |
738 | /// </summary> | 899 | /// </summary> |
739 | /// <remarks>TODO: Move to inventory server</remarks> | 900 | /// <returns>Provider name</returns> |
740 | /// <param name="from">The senders account ID</param> | 901 | override public string Name |
741 | /// <param name="to">The receivers account ID</param> | ||
742 | /// <param name="item">The item to transfer</param> | ||
743 | /// <returns>false</returns> | ||
744 | override public bool InventoryTransferRequest(UUID from, UUID to, UUID item) | ||
745 | { | 902 | { |
746 | return false; | 903 | get { return "MSSQL Userdata Interface"; } |
747 | } | 904 | } |
748 | 905 | ||
749 | /// Appearance | 906 | /// <summary> |
750 | /// TODO: stubs for now to get us to a compiling state gently | 907 | /// Database provider version |
751 | override public AvatarAppearance GetUserAppearance(UUID user) | 908 | /// </summary> |
909 | /// <returns>provider version</returns> | ||
910 | override public string Version | ||
752 | { | 911 | { |
753 | // return new AvatarAppearance(); | 912 | get { return database.getVersion(); } |
754 | try | ||
755 | { | ||
756 | Dictionary<string, string> param = new Dictionary<string, string>(); | ||
757 | param["@UUID"] = user.ToString(); | ||
758 | |||
759 | using (IDbCommand result = | ||
760 | database.Query("SELECT * FROM avatarappearance WHERE owner = @UUID", param)) | ||
761 | using (IDataReader reader = result.ExecuteReader()) | ||
762 | { | ||
763 | AvatarAppearance item = null; | ||
764 | if (reader.Read()) | ||
765 | item = readUserAppearance(reader); | ||
766 | return item; | ||
767 | } | ||
768 | } | ||
769 | catch (Exception e) | ||
770 | { | ||
771 | m_log.Error(e.ToString()); | ||
772 | } | ||
773 | return null; | ||
774 | } | 913 | } |
775 | 914 | ||
915 | #endregion | ||
916 | |||
917 | #region Private functions | ||
918 | |||
776 | /// <summary> | 919 | /// <summary> |
777 | /// Reads a one item from an SQL result | 920 | /// Reads a one item from an SQL result |
778 | /// </summary> | 921 | /// </summary> |
@@ -827,99 +970,254 @@ namespace OpenSim.Data.MSSQL | |||
827 | } | 970 | } |
828 | 971 | ||
829 | /// <summary> | 972 | /// <summary> |
830 | /// Update a user appearence into database | 973 | /// Insert/Update a agent row in the DB. |
831 | /// </summary> | 974 | /// </summary> |
832 | /// <param name="user">the used UUID</param> | 975 | /// <param name="agentdata">agentdata.</param> |
833 | /// <param name="appearance">the appearence</param> | 976 | private void InsertUpdateAgentRow(UserAgentData agentdata) |
834 | override public void UpdateUserAppearance(UUID user, AvatarAppearance appearance) | ||
835 | { | 977 | { |
836 | string sql = String.Empty; | 978 | string sql = @" |
837 | sql += "DELETE FROM avatarappearance WHERE owner=@owner "; | 979 | |
838 | sql += "INSERT INTO avatarappearance "; | 980 | IF EXISTS (SELECT * FROM agents WHERE UUID = @UUID) |
839 | sql += "(owner, serial, visual_params, texture, avatar_height, "; | 981 | BEGIN |
840 | sql += "body_item, body_asset, skin_item, skin_asset, hair_item, hair_asset, eyes_item, eyes_asset, "; | 982 | UPDATE agents SET UUID = @UUID, sessionID = @sessionID, secureSessionID = @secureSessionID, agentIP = @agentIP, agentPort = @agentPort, agentOnline = @agentOnline, loginTime = @loginTime, logoutTime = @logoutTime, currentRegion = @currentRegion, currentHandle = @currentHandle, currentPos = @currentPos |
841 | sql += "shirt_item, shirt_asset, pants_item, pants_asset, shoes_item, shoes_asset, socks_item, socks_asset, "; | 983 | WHERE UUID = @UUID |
842 | sql += "jacket_item, jacket_asset, gloves_item, gloves_asset, undershirt_item, undershirt_asset, underpants_item, underpants_asset, "; | 984 | END |
843 | sql += "skirt_item, skirt_asset) values ("; | 985 | ELSE |
844 | sql += "@owner, @serial, @visual_params, @texture, @avatar_height, "; | 986 | BEGIN |
845 | sql += "@body_item, @body_asset, @skin_item, @skin_asset, @hair_item, @hair_asset, @eyes_item, @eyes_asset, "; | 987 | INSERT INTO |
846 | sql += "@shirt_item, @shirt_asset, @pants_item, @pants_asset, @shoes_item, @shoes_asset, @socks_item, @socks_asset, "; | 988 | agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) VALUES |
847 | sql += "@jacket_item, @jacket_asset, @gloves_item, @gloves_asset, @undershirt_item, @undershirt_asset, @underpants_item, @underpants_asset, "; | 989 | (@UUID, @sessionID, @secureSessionID, @agentIP, @agentPort, @agentOnline, @loginTime, @logoutTime, @currentRegion, @currentHandle, @currentPos) |
848 | sql += "@skirt_item, @skirt_asset)"; | 990 | END |
849 | 991 | "; | |
850 | using (AutoClosingSqlCommand cmd = database.Query(sql)) | 992 | |
993 | using (AutoClosingSqlCommand command = database.Query(sql)) | ||
851 | { | 994 | { |
852 | cmd.Parameters.AddWithValue("@owner", appearance.Owner.ToString()); | 995 | command.Parameters.Add(database.CreateParameter("@UUID", agentdata.ProfileID)); |
853 | cmd.Parameters.AddWithValue("@serial", appearance.Serial); | 996 | command.Parameters.Add(database.CreateParameter("@sessionID", agentdata.SessionID)); |
854 | cmd.Parameters.AddWithValue("@visual_params", appearance.VisualParams); | 997 | command.Parameters.Add(database.CreateParameter("@secureSessionID", agentdata.SecureSessionID)); |
855 | cmd.Parameters.AddWithValue("@texture", appearance.Texture.ToBytes()); | 998 | command.Parameters.Add(database.CreateParameter("@agentIP", agentdata.AgentIP)); |
856 | cmd.Parameters.AddWithValue("@avatar_height", appearance.AvatarHeight); | 999 | command.Parameters.Add(database.CreateParameter("@agentPort", agentdata.AgentPort)); |
857 | cmd.Parameters.AddWithValue("@body_item", appearance.BodyItem.ToString()); | 1000 | command.Parameters.Add(database.CreateParameter("@agentOnline", agentdata.AgentOnline)); |
858 | cmd.Parameters.AddWithValue("@body_asset", appearance.BodyAsset.ToString()); | 1001 | command.Parameters.Add(database.CreateParameter("@loginTime", agentdata.LoginTime)); |
859 | cmd.Parameters.AddWithValue("@skin_item", appearance.SkinItem.ToString()); | 1002 | command.Parameters.Add(database.CreateParameter("@logoutTime", agentdata.LogoutTime)); |
860 | cmd.Parameters.AddWithValue("@skin_asset", appearance.SkinAsset.ToString()); | 1003 | command.Parameters.Add(database.CreateParameter("@currentRegion", agentdata.Region)); |
861 | cmd.Parameters.AddWithValue("@hair_item", appearance.HairItem.ToString()); | 1004 | command.Parameters.Add(database.CreateParameter("@currentHandle", agentdata.Handle)); |
862 | cmd.Parameters.AddWithValue("@hair_asset", appearance.HairAsset.ToString()); | 1005 | command.Parameters.Add(database.CreateParameter("@currentPos", "<" + ((int)agentdata.Position.X) + "," + ((int)agentdata.Position.Y) + "," + ((int)agentdata.Position.Z) + ">")); |
863 | cmd.Parameters.AddWithValue("@eyes_item", appearance.EyesItem.ToString()); | 1006 | |
864 | cmd.Parameters.AddWithValue("@eyes_asset", appearance.EyesAsset.ToString()); | 1007 | command.Transaction = command.Connection.BeginTransaction(IsolationLevel.Serializable); |
865 | cmd.Parameters.AddWithValue("@shirt_item", appearance.ShirtItem.ToString()); | ||
866 | cmd.Parameters.AddWithValue("@shirt_asset", appearance.ShirtAsset.ToString()); | ||
867 | cmd.Parameters.AddWithValue("@pants_item", appearance.PantsItem.ToString()); | ||
868 | cmd.Parameters.AddWithValue("@pants_asset", appearance.PantsAsset.ToString()); | ||
869 | cmd.Parameters.AddWithValue("@shoes_item", appearance.ShoesItem.ToString()); | ||
870 | cmd.Parameters.AddWithValue("@shoes_asset", appearance.ShoesAsset.ToString()); | ||
871 | cmd.Parameters.AddWithValue("@socks_item", appearance.SocksItem.ToString()); | ||
872 | cmd.Parameters.AddWithValue("@socks_asset", appearance.SocksAsset.ToString()); | ||
873 | cmd.Parameters.AddWithValue("@jacket_item", appearance.JacketItem.ToString()); | ||
874 | cmd.Parameters.AddWithValue("@jacket_asset", appearance.JacketAsset.ToString()); | ||
875 | cmd.Parameters.AddWithValue("@gloves_item", appearance.GlovesItem.ToString()); | ||
876 | cmd.Parameters.AddWithValue("@gloves_asset", appearance.GlovesAsset.ToString()); | ||
877 | cmd.Parameters.AddWithValue("@undershirt_item", appearance.UnderShirtItem.ToString()); | ||
878 | cmd.Parameters.AddWithValue("@undershirt_asset", appearance.UnderShirtAsset.ToString()); | ||
879 | cmd.Parameters.AddWithValue("@underpants_item", appearance.UnderPantsItem.ToString()); | ||
880 | cmd.Parameters.AddWithValue("@underpants_asset", appearance.UnderPantsAsset.ToString()); | ||
881 | cmd.Parameters.AddWithValue("@skirt_item", appearance.SkirtItem.ToString()); | ||
882 | cmd.Parameters.AddWithValue("@skirt_asset", appearance.SkirtAsset.ToString()); | ||
883 | |||
884 | try | 1008 | try |
885 | { | 1009 | { |
886 | cmd.ExecuteNonQuery(); | 1010 | if (command.ExecuteNonQuery() > 0) |
1011 | { | ||
1012 | command.Transaction.Commit(); | ||
1013 | return; | ||
1014 | } | ||
1015 | |||
1016 | command.Transaction.Rollback(); | ||
1017 | return; | ||
887 | } | 1018 | } |
888 | catch (Exception e) | 1019 | catch (Exception e) |
889 | { | 1020 | { |
1021 | command.Transaction.Rollback(); | ||
890 | m_log.Error(e.ToString()); | 1022 | m_log.Error(e.ToString()); |
1023 | return; | ||
891 | } | 1024 | } |
892 | } | 1025 | } |
1026 | |||
893 | } | 1027 | } |
894 | 1028 | ||
895 | /// <summary> | 1029 | /// <summary> |
896 | /// Database provider name | 1030 | /// Reads an agent row from a database reader |
897 | /// </summary> | 1031 | /// </summary> |
898 | /// <returns>Provider name</returns> | 1032 | /// <param name="reader">An active database reader</param> |
899 | override public string Name | 1033 | /// <returns>A user session agent</returns> |
1034 | private UserAgentData readAgentRow(IDataReader reader) | ||
900 | { | 1035 | { |
901 | get {return "MSSQL Userdata Interface";} | 1036 | UserAgentData retval = new UserAgentData(); |
1037 | |||
1038 | if (reader.Read()) | ||
1039 | { | ||
1040 | // Agent IDs | ||
1041 | retval.ProfileID = new UUID((string)reader["UUID"]); | ||
1042 | retval.SessionID = new UUID((string)reader["sessionID"]); | ||
1043 | retval.SecureSessionID = new UUID((string)reader["secureSessionID"]); | ||
1044 | |||
1045 | // Agent Who? | ||
1046 | retval.AgentIP = (string)reader["agentIP"]; | ||
1047 | retval.AgentPort = Convert.ToUInt32(reader["agentPort"].ToString()); | ||
1048 | retval.AgentOnline = Convert.ToInt32(reader["agentOnline"].ToString()) != 0; | ||
1049 | |||
1050 | // Login/Logout times (UNIX Epoch) | ||
1051 | retval.LoginTime = Convert.ToInt32(reader["loginTime"].ToString()); | ||
1052 | retval.LogoutTime = Convert.ToInt32(reader["logoutTime"].ToString()); | ||
1053 | |||
1054 | // Current position | ||
1055 | retval.Region = (string)reader["currentRegion"]; | ||
1056 | retval.Handle = Convert.ToUInt64(reader["currentHandle"].ToString()); | ||
1057 | Vector3 tmp_v; | ||
1058 | Vector3.TryParse((string)reader["currentPos"], out tmp_v); | ||
1059 | retval.Position = tmp_v; | ||
1060 | |||
1061 | } | ||
1062 | else | ||
1063 | { | ||
1064 | return null; | ||
1065 | } | ||
1066 | return retval; | ||
902 | } | 1067 | } |
903 | 1068 | ||
904 | /// <summary> | 1069 | /// <summary> |
905 | /// Database provider version | 1070 | /// Creates a new user and inserts it into the database |
906 | /// </summary> | 1071 | /// </summary> |
907 | /// <returns>provider version</returns> | 1072 | /// <param name="uuid">User ID</param> |
908 | override public string Version | 1073 | /// <param name="username">First part of the login</param> |
1074 | /// <param name="lastname">Second part of the login</param> | ||
1075 | /// <param name="passwordHash">A salted hash of the users password</param> | ||
1076 | /// <param name="passwordSalt">The salt used for the password hash</param> | ||
1077 | /// <param name="homeRegion">A regionHandle of the users home region</param> | ||
1078 | /// <param name="homeLocX">Home region position vector</param> | ||
1079 | /// <param name="homeLocY">Home region position vector</param> | ||
1080 | /// <param name="homeLocZ">Home region position vector</param> | ||
1081 | /// <param name="homeLookAtX">Home region 'look at' vector</param> | ||
1082 | /// <param name="homeLookAtY">Home region 'look at' vector</param> | ||
1083 | /// <param name="homeLookAtZ">Home region 'look at' vector</param> | ||
1084 | /// <param name="created">Account created (unix timestamp)</param> | ||
1085 | /// <param name="lastlogin">Last login (unix timestamp)</param> | ||
1086 | /// <param name="inventoryURI">Users inventory URI</param> | ||
1087 | /// <param name="assetURI">Users asset URI</param> | ||
1088 | /// <param name="canDoMask">I can do mask</param> | ||
1089 | /// <param name="wantDoMask">I want to do mask</param> | ||
1090 | /// <param name="aboutText">Profile text</param> | ||
1091 | /// <param name="firstText">Firstlife text</param> | ||
1092 | /// <param name="profileImage">UUID for profile image</param> | ||
1093 | /// <param name="firstImage">UUID for firstlife image</param> | ||
1094 | /// <param name="webLoginKey">web login key</param> | ||
1095 | /// <param name="homeRegionID">homeregion UUID</param> | ||
1096 | /// <param name="godLevel">has the user godlevel</param> | ||
1097 | /// <param name="userFlags">unknown</param> | ||
1098 | /// <param name="customType">unknown</param> | ||
1099 | /// <param name="partnerID">UUID of partner</param> | ||
1100 | /// <returns>Success?</returns> | ||
1101 | private void InsertUserRow(UUID uuid, string username, string lastname, string passwordHash, | ||
1102 | string passwordSalt, UInt64 homeRegion, float homeLocX, float homeLocY, float homeLocZ, | ||
1103 | float homeLookAtX, float homeLookAtY, float homeLookAtZ, int created, int lastlogin, | ||
1104 | string inventoryURI, string assetURI, uint canDoMask, uint wantDoMask, | ||
1105 | string aboutText, string firstText, | ||
1106 | UUID profileImage, UUID firstImage, UUID webLoginKey, UUID homeRegionID, | ||
1107 | int godLevel, int userFlags, string customType, UUID partnerID) | ||
909 | { | 1108 | { |
910 | get {return database.getVersion();} | 1109 | string sql = "INSERT INTO " + m_usersTableName; |
1110 | sql += " ([UUID], [username], [lastname], [passwordHash], [passwordSalt], [homeRegion], "; | ||
1111 | sql += "[homeLocationX], [homeLocationY], [homeLocationZ], [homeLookAtX], [homeLookAtY], [homeLookAtZ], [created], "; | ||
1112 | sql += "[lastLogin], [userInventoryURI], [userAssetURI], [profileCanDoMask], [profileWantDoMask], [profileAboutText], "; | ||
1113 | sql += "[profileFirstText], [profileImage], [profileFirstImage], [webLoginKey], "; | ||
1114 | sql += "[homeRegionID], [userFlags], [godLevel], [customType], [partner]) VALUES "; | ||
1115 | |||
1116 | sql += "(@UUID, @username, @lastname, @passwordHash, @passwordSalt, @homeRegion, "; | ||
1117 | sql += "@homeLocationX, @homeLocationY, @homeLocationZ, @homeLookAtX, @homeLookAtY, @homeLookAtZ, @created, "; | ||
1118 | sql += "@lastLogin, @userInventoryURI, @userAssetURI, @profileCanDoMask, @profileWantDoMask, @profileAboutText, "; | ||
1119 | sql += "@profileFirstText, @profileImage, @profileFirstImage, @webLoginKey, "; | ||
1120 | sql += "@homeRegionID, @userFlags, @godLevel, @customType, @partner)"; | ||
1121 | |||
1122 | try | ||
1123 | { | ||
1124 | using (AutoClosingSqlCommand command = database.Query(sql)) | ||
1125 | { | ||
1126 | command.Parameters.Add(database.CreateParameter("UUID", uuid)); | ||
1127 | command.Parameters.Add(database.CreateParameter("username", username)); | ||
1128 | command.Parameters.Add(database.CreateParameter("lastname", lastname)); | ||
1129 | command.Parameters.Add(database.CreateParameter("passwordHash", passwordHash)); | ||
1130 | command.Parameters.Add(database.CreateParameter("passwordSalt", passwordSalt)); | ||
1131 | command.Parameters.Add(database.CreateParameter("homeRegion", homeRegion)); | ||
1132 | command.Parameters.Add(database.CreateParameter("homeLocationX", homeLocX)); | ||
1133 | command.Parameters.Add(database.CreateParameter("homeLocationY", homeLocY)); | ||
1134 | command.Parameters.Add(database.CreateParameter("homeLocationZ", homeLocZ)); | ||
1135 | command.Parameters.Add(database.CreateParameter("homeLookAtX", homeLookAtX)); | ||
1136 | command.Parameters.Add(database.CreateParameter("homeLookAtY", homeLookAtY)); | ||
1137 | command.Parameters.Add(database.CreateParameter("homeLookAtZ", homeLookAtZ)); | ||
1138 | command.Parameters.Add(database.CreateParameter("created", created)); | ||
1139 | command.Parameters.Add(database.CreateParameter("lastLogin", lastlogin)); | ||
1140 | command.Parameters.Add(database.CreateParameter("userInventoryURI", inventoryURI)); | ||
1141 | command.Parameters.Add(database.CreateParameter("userAssetURI", assetURI)); | ||
1142 | command.Parameters.Add(database.CreateParameter("profileCanDoMask", canDoMask)); | ||
1143 | command.Parameters.Add(database.CreateParameter("profileWantDoMask", wantDoMask)); | ||
1144 | command.Parameters.Add(database.CreateParameter("profileAboutText", aboutText)); | ||
1145 | command.Parameters.Add(database.CreateParameter("profileFirstText", firstText)); | ||
1146 | command.Parameters.Add(database.CreateParameter("profileImage", profileImage)); | ||
1147 | command.Parameters.Add(database.CreateParameter("profileFirstImage", firstImage)); | ||
1148 | command.Parameters.Add(database.CreateParameter("webLoginKey", webLoginKey)); | ||
1149 | // | ||
1150 | command.Parameters.Add(database.CreateParameter("homeRegionID", homeRegionID)); | ||
1151 | command.Parameters.Add(database.CreateParameter("userFlags", userFlags)); | ||
1152 | command.Parameters.Add(database.CreateParameter("godLevel", godLevel)); | ||
1153 | command.Parameters.Add(database.CreateParameter("customType", customType)); | ||
1154 | command.Parameters.Add(database.CreateParameter("partner", partnerID)); | ||
1155 | |||
1156 | |||
1157 | command.ExecuteNonQuery(); | ||
1158 | return; | ||
1159 | } | ||
1160 | } | ||
1161 | catch (Exception e) | ||
1162 | { | ||
1163 | m_log.Error(e.ToString()); | ||
1164 | return; | ||
1165 | } | ||
1166 | |||
911 | } | 1167 | } |
912 | 1168 | ||
913 | /// <summary> | 1169 | /// <summary> |
914 | /// Not implemented | 1170 | /// Reads a user profile from an active data reader |
915 | /// </summary> | 1171 | /// </summary> |
916 | /// <param name="query"></param> | 1172 | /// <param name="reader">An active database reader</param> |
917 | public void runQuery(string query) | 1173 | /// <returns>A user profile</returns> |
1174 | private static UserProfileData ReadUserRow(IDataReader reader) | ||
918 | { | 1175 | { |
919 | } | 1176 | UserProfileData retval = new UserProfileData(); |
920 | 1177 | ||
921 | override public void ResetAttachments(UUID userID) | 1178 | if (reader.Read()) |
922 | { | 1179 | { |
1180 | retval.ID = new UUID((string)reader["UUID"]); | ||
1181 | retval.FirstName = (string)reader["username"]; | ||
1182 | retval.SurName = (string)reader["lastname"]; | ||
1183 | |||
1184 | retval.PasswordHash = (string)reader["passwordHash"]; | ||
1185 | retval.PasswordSalt = (string)reader["passwordSalt"]; | ||
1186 | |||
1187 | retval.HomeRegion = Convert.ToUInt64(reader["homeRegion"].ToString()); | ||
1188 | retval.HomeLocation = new Vector3( | ||
1189 | Convert.ToSingle(reader["homeLocationX"].ToString()), | ||
1190 | Convert.ToSingle(reader["homeLocationY"].ToString()), | ||
1191 | Convert.ToSingle(reader["homeLocationZ"].ToString())); | ||
1192 | retval.HomeLookAt = new Vector3( | ||
1193 | Convert.ToSingle(reader["homeLookAtX"].ToString()), | ||
1194 | Convert.ToSingle(reader["homeLookAtY"].ToString()), | ||
1195 | Convert.ToSingle(reader["homeLookAtZ"].ToString())); | ||
1196 | |||
1197 | retval.Created = Convert.ToInt32(reader["created"].ToString()); | ||
1198 | retval.LastLogin = Convert.ToInt32(reader["lastLogin"].ToString()); | ||
1199 | |||
1200 | retval.UserInventoryURI = (string)reader["userInventoryURI"]; | ||
1201 | retval.UserAssetURI = (string)reader["userAssetURI"]; | ||
1202 | |||
1203 | retval.CanDoMask = Convert.ToUInt32(reader["profileCanDoMask"].ToString()); | ||
1204 | retval.WantDoMask = Convert.ToUInt32(reader["profileWantDoMask"].ToString()); | ||
1205 | |||
1206 | retval.AboutText = (string)reader["profileAboutText"]; | ||
1207 | retval.FirstLifeAboutText = (string)reader["profileFirstText"]; | ||
1208 | |||
1209 | retval.Image = new UUID((string)reader["profileImage"]); | ||
1210 | retval.FirstLifeImage = new UUID((string)reader["profileFirstImage"]); | ||
1211 | retval.WebLoginKey = new UUID((string)reader["webLoginKey"]); | ||
1212 | } | ||
1213 | else | ||
1214 | { | ||
1215 | return null; | ||
1216 | } | ||
1217 | return retval; | ||
923 | } | 1218 | } |
1219 | |||
1220 | #endregion | ||
924 | } | 1221 | } |
1222 | |||
925 | } | 1223 | } |