1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156 |
- /*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the OpenSim Project nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Data;
- using System.Data.SqlClient;
- using System.Reflection;
- using OpenMetaverse;
- using log4net;
- using OpenSim.Framework;
- namespace OpenSim.Data.MSSQL
- {
- /// <summary>
- /// A database interface class to a user profile storage system
- /// </summary>
- public class MSSQLUserData : UserDataBase
- {
- private const string _migrationStore = "UserStore";
- private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- /// <summary>
- /// Database manager for MSSQL
- /// </summary>
- public MSSQLManager database;
- private const string m_agentsTableName = "agents";
- private const string m_usersTableName = "users";
- private const string m_userFriendsTableName = "userfriends";
- // [Obsolete("Cannot be default-initialized!")]
- override public void Initialise()
- {
- m_log.Info("[MSSQLUserData]: " + Name + " cannot be default-initialized!");
- throw new PluginNotInitialisedException(Name);
- }
- /// <summary>
- /// Loads and initialises the MSSQL storage plugin
- /// </summary>
- /// <param name="connect">connectionstring</param>
- /// <remarks>use mssql_connection.ini</remarks>
- override public void Initialise(string connect)
- {
- if (!string.IsNullOrEmpty(connect))
- {
- database = new MSSQLManager(connect);
- }
- else
- {
- IniFile iniFile = new IniFile("mssql_connection.ini");
- string settingDataSource = iniFile.ParseFileReadValue("data_source");
- string settingInitialCatalog = iniFile.ParseFileReadValue("initial_catalog");
- string settingPersistSecurityInfo = iniFile.ParseFileReadValue("persist_security_info");
- string settingUserId = iniFile.ParseFileReadValue("user_id");
- string settingPassword = iniFile.ParseFileReadValue("password");
- database = new MSSQLManager(settingDataSource, settingInitialCatalog, settingPersistSecurityInfo, settingUserId, settingPassword);
- }
- //Check migration on DB
- database.CheckMigration(_migrationStore);
- }
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources
- /// </summary>
- override public void Dispose() { }
- #region User table methods
- /// <summary>
- /// Searches the database for a specified user profile by name components
- /// </summary>
- /// <param name="user">The first part of the account name</param>
- /// <param name="last">The second part of the account name</param>
- /// <returns>A user profile</returns>
- override public UserProfileData GetUserByName(string user, string last)
- {
- using (AutoClosingSqlCommand command = database.Query("SELECT * FROM " + m_usersTableName + " WHERE username = @first AND lastname = @second"))
- {
- command.Parameters.Add(database.CreateParameter("first", user));
- command.Parameters.Add(database.CreateParameter("second", last));
- try
- {
- using (SqlDataReader reader = command.ExecuteReader())
- {
- return ReadUserRow(reader);
- }
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error getting user profile, error: " + e.Message);
- return null;
- }
- }
- }
- /// <summary>
- /// See IUserDataPlugin
- /// </summary>
- /// <param name="uuid"></param>
- /// <returns></returns>
- override public UserProfileData GetUserByUUID(UUID uuid)
- {
- using (AutoClosingSqlCommand command = database.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = @uuid"))
- {
- command.Parameters.Add(database.CreateParameter("uuid", uuid));
- try
- {
- using (IDataReader reader = command.ExecuteReader())
- {
- return ReadUserRow(reader);
- }
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error getting user profile by UUID, error: " + e.Message);
- return null;
- }
- }
- }
- /// <summary>
- /// Creates a new users profile
- /// </summary>
- /// <param name="user">The user profile to create</param>
- override public void AddNewUserProfile(UserProfileData user)
- {
- try
- {
- InsertUserRow(user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt,
- user.HomeRegion, user.HomeLocation.X, user.HomeLocation.Y,
- user.HomeLocation.Z,
- user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created,
- user.LastLogin, user.UserInventoryURI, user.UserAssetURI,
- user.CanDoMask, user.WantDoMask,
- user.AboutText, user.FirstLifeAboutText, user.Image,
- user.FirstLifeImage, user.WebLoginKey, user.HomeRegionID,
- user.GodLevel, user.UserFlags, user.CustomType, user.Partner);
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error adding new profile, error: " + e.Message);
- }
- }
- /// <summary>
- /// update a user profile
- /// </summary>
- /// <param name="user">the profile to update</param>
- /// <returns></returns>
- override public bool UpdateUserProfile(UserProfileData user)
- {
- using (AutoClosingSqlCommand command = database.Query("UPDATE " + m_usersTableName + " set UUID = @uuid, " +
- "username = @username, " +
- "lastname = @lastname," +
- "email = @email," +
- "passwordHash = @passwordHash," +
- "passwordSalt = @passwordSalt," +
- "homeRegion = @homeRegion," +
- "homeLocationX = @homeLocationX," +
- "homeLocationY = @homeLocationY," +
- "homeLocationZ = @homeLocationZ," +
- "homeLookAtX = @homeLookAtX," +
- "homeLookAtY = @homeLookAtY," +
- "homeLookAtZ = @homeLookAtZ," +
- "created = @created," +
- "lastLogin = @lastLogin," +
- "userInventoryURI = @userInventoryURI," +
- "userAssetURI = @userAssetURI," +
- "profileCanDoMask = @profileCanDoMask," +
- "profileWantDoMask = @profileWantDoMask," +
- "profileAboutText = @profileAboutText," +
- "profileFirstText = @profileFirstText," +
- "profileImage = @profileImage," +
- "profileFirstImage = @profileFirstImage, " +
- "webLoginKey = @webLoginKey, " +
- "homeRegionID = @homeRegionID, " +
- "userFlags = @userFlags, " +
- "godLevel = @godLevel, " +
- "customType = @customType, " +
- "partner = @partner where " +
- "UUID = @keyUUUID;"))
- {
- command.Parameters.Add(database.CreateParameter("uuid", user.ID));
- command.Parameters.Add(database.CreateParameter("username", user.FirstName));
- command.Parameters.Add(database.CreateParameter("lastname", user.SurName));
- command.Parameters.Add(database.CreateParameter("email", user.Email));
- command.Parameters.Add(database.CreateParameter("passwordHash", user.PasswordHash));
- command.Parameters.Add(database.CreateParameter("passwordSalt", user.PasswordSalt));
- command.Parameters.Add(database.CreateParameter("homeRegion", user.HomeRegion));
- command.Parameters.Add(database.CreateParameter("homeLocationX", user.HomeLocation.X));
- command.Parameters.Add(database.CreateParameter("homeLocationY", user.HomeLocation.Y));
- command.Parameters.Add(database.CreateParameter("homeLocationZ", user.HomeLocation.Z));
- command.Parameters.Add(database.CreateParameter("homeLookAtX", user.HomeLookAt.X));
- command.Parameters.Add(database.CreateParameter("homeLookAtY", user.HomeLookAt.Y));
- command.Parameters.Add(database.CreateParameter("homeLookAtZ", user.HomeLookAt.Z));
- command.Parameters.Add(database.CreateParameter("created", user.Created));
- command.Parameters.Add(database.CreateParameter("lastLogin", user.LastLogin));
- command.Parameters.Add(database.CreateParameter("userInventoryURI", user.UserInventoryURI));
- command.Parameters.Add(database.CreateParameter("userAssetURI", user.UserAssetURI));
- command.Parameters.Add(database.CreateParameter("profileCanDoMask", user.CanDoMask));
- command.Parameters.Add(database.CreateParameter("profileWantDoMask", user.WantDoMask));
- command.Parameters.Add(database.CreateParameter("profileAboutText", user.AboutText));
- command.Parameters.Add(database.CreateParameter("profileFirstText", user.FirstLifeAboutText));
- command.Parameters.Add(database.CreateParameter("profileImage", user.Image));
- command.Parameters.Add(database.CreateParameter("profileFirstImage", user.FirstLifeImage));
- command.Parameters.Add(database.CreateParameter("webLoginKey", user.WebLoginKey));
- //
- command.Parameters.Add(database.CreateParameter("homeRegionID", user.HomeRegionID));
- command.Parameters.Add(database.CreateParameter("userFlags", user.UserFlags));
- command.Parameters.Add(database.CreateParameter("godLevel", user.GodLevel));
- command.Parameters.Add(database.CreateParameter("customType", user.CustomType));
- command.Parameters.Add(database.CreateParameter("partner", user.Partner));
- command.Parameters.Add(database.CreateParameter("keyUUUID", user.ID));
- try
- {
- int affected = command.ExecuteNonQuery();
- return (affected != 0);
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error updating profile, error: " + e.Message);
- }
- }
- return false;
- }
- #endregion
- #region Agent table methods
- /// <summary>
- /// Returns a user session searching by name
- /// </summary>
- /// <param name="name">The account name</param>
- /// <returns>The users session</returns>
- override public UserAgentData GetAgentByName(string name)
- {
- return GetAgentByName(name.Split(' ')[0], name.Split(' ')[1]);
- }
- /// <summary>
- /// Returns a user session by account name
- /// </summary>
- /// <param name="user">First part of the users account name</param>
- /// <param name="last">Second part of the users account name</param>
- /// <returns>The users session</returns>
- override public UserAgentData GetAgentByName(string user, string last)
- {
- UserProfileData profile = GetUserByName(user, last);
- return GetAgentByUUID(profile.ID);
- }
- /// <summary>
- /// Returns an agent session by account UUID
- /// </summary>
- /// <param name="uuid">The accounts UUID</param>
- /// <returns>The users session</returns>
- override public UserAgentData GetAgentByUUID(UUID uuid)
- {
- using (AutoClosingSqlCommand command = database.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = @uuid"))
- {
- command.Parameters.Add(database.CreateParameter("uuid", uuid));
- try
- {
- using (SqlDataReader reader = command.ExecuteReader())
- {
- return readAgentRow(reader);
- }
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error updating agentdata by UUID, error: " + e.Message);
- return null;
- }
- }
- }
- /// <summary>
- /// Creates a new agent
- /// </summary>
- /// <param name="agent">The agent to create</param>
- override public void AddNewUserAgent(UserAgentData agent)
- {
- try
- {
- InsertUpdateAgentRow(agent);
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error adding new agentdata, error: " + e.Message);
- }
- }
- #endregion
- #region User Friends List Data
- /// <summary>
- /// Add a new friend in the friendlist
- /// </summary>
- /// <param name="friendlistowner">UUID of the friendlist owner</param>
- /// <param name="friend">Friend's UUID</param>
- /// <param name="perms">Permission flag</param>
- override public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms)
- {
- int dtvalue = Util.UnixTimeSinceEpoch();
- using (AutoClosingSqlCommand command = database.Query(
- "INSERT INTO " + m_userFriendsTableName + " " +
- "(ownerID,friendID,friendPerms,datetimestamp) " +
- "VALUES " +
- "(@ownerID,@friendID,@friendPerms,@datetimestamp)"))
- {
- command.Parameters.Add(database.CreateParameter("ownerID", friendlistowner));
- command.Parameters.Add(database.CreateParameter("friendID", friend));
- command.Parameters.Add(database.CreateParameter("friendPerms", perms));
- command.Parameters.Add(database.CreateParameter("datetimestamp", dtvalue));
- command.ExecuteNonQuery();
- try
- {
- command.CommandText = string.Format("INSERT INTO {0} (ownerID,friendID,friendPerms,datetimestamp) VALUES (@friendID,@ownerID,@friendPerms,@datetimestamp)",
- m_userFriendsTableName);
- command.ExecuteNonQuery();
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error adding new userfriend, error: " + e.Message);
- return;
- }
- }
- }
- /// <summary>
- /// Remove an friend from the friendlist
- /// </summary>
- /// <param name="friendlistowner">UUID of the friendlist owner</param>
- /// <param name="friend">UUID of the not-so-friendly user to remove from the list</param>
- override public void RemoveUserFriend(UUID friendlistowner, UUID friend)
- {
- using (AutoClosingSqlCommand command = database.Query("delete from " + m_userFriendsTableName + " where ownerID = @ownerID and friendID = @friendID"))
- {
- command.Parameters.Add(database.CreateParameter("@ownerID", friendlistowner));
- command.Parameters.Add(database.CreateParameter("@friendID", friend));
- command.ExecuteNonQuery();
- command.CommandText = "delete from " + m_userFriendsTableName +
- " where ownerID = @friendID and friendID = @ownerID";
- try
- {
- command.ExecuteNonQuery();
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error removing userfriend, error: " + e.Message);
- }
- }
- }
- /// <summary>
- /// Update friendlist permission flag for a friend
- /// </summary>
- /// <param name="friendlistowner">UUID of the friendlist owner</param>
- /// <param name="friend">UUID of the friend</param>
- /// <param name="perms">new permission flag</param>
- override public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms)
- {
- using (AutoClosingSqlCommand command = database.Query(
- "update " + m_userFriendsTableName +
- " SET friendPerms = @friendPerms " +
- "where ownerID = @ownerID and friendID = @friendID"))
- {
- command.Parameters.Add(database.CreateParameter("@ownerID", friendlistowner));
- command.Parameters.Add(database.CreateParameter("@friendID", friend));
- command.Parameters.Add(database.CreateParameter("@friendPerms", perms));
- try
- {
- command.ExecuteNonQuery();
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error updating userfriend, error: " + e.Message);
- }
- }
- }
- /// <summary>
- /// Get (fetch?) the user's friendlist
- /// </summary>
- /// <param name="friendlistowner">UUID of the friendlist owner</param>
- /// <returns>Friendlist list</returns>
- override public List<FriendListItem> GetUserFriendList(UUID friendlistowner)
- {
- List<FriendListItem> friendList = new List<FriendListItem>();
- //Left Join userfriends to itself
- using (AutoClosingSqlCommand command = database.Query(
- "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " + m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" +
- " where a.ownerID = @ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID"))
- {
- command.Parameters.Add(database.CreateParameter("@ownerID", friendlistowner));
- try
- {
- using (IDataReader reader = command.ExecuteReader())
- {
- while (reader.Read())
- {
- FriendListItem fli = new FriendListItem();
- fli.FriendListOwner = new UUID((string)reader["ownerID"]);
- fli.Friend = new UUID((string)reader["friendID"]);
- fli.FriendPerms = (uint)Convert.ToInt32(reader["friendPerms"]);
- // This is not a real column in the database table, it's a joined column from the opposite record
- fli.FriendListOwnerPerms = (uint)Convert.ToInt32(reader["ownerperms"]);
- friendList.Add(fli);
- }
- }
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error updating userfriend, error: " + e.Message);
- }
- }
- return friendList;
- }
- override public Dictionary<UUID, FriendRegionInfo> GetFriendRegionInfos (List<UUID> uuids)
- {
- Dictionary<UUID, FriendRegionInfo> infos = new Dictionary<UUID,FriendRegionInfo>();
- try
- {
- foreach (UUID uuid in uuids)
- {
- using (AutoClosingSqlCommand command = database.Query(
- "select agentOnline,currentHandle from " + m_agentsTableName + " where UUID = @uuid"))
- {
- command.Parameters.Add(database.CreateParameter("@uuid", uuid));
- using (IDataReader reader = command.ExecuteReader())
- {
- while (reader.Read())
- {
- FriendRegionInfo fri = new FriendRegionInfo();
- fri.isOnline = (byte)reader["agentOnline"] != 0;
- fri.regionHandle = Convert.ToUInt64(reader["currentHandle"].ToString());
- infos[uuid] = fri;
- }
- }
- }
- }
- }
- catch (Exception e)
- {
- m_log.Warn("[MSSQL]: Got exception on trying to find friends regions:", e);
- }
- return infos;
- }
- #endregion
- #region Money functions (not used)
- /// <summary>
- /// Performs a money transfer request between two accounts
- /// </summary>
- /// <param name="from">The senders account ID</param>
- /// <param name="to">The receivers account ID</param>
- /// <param name="amount">The amount to transfer</param>
- /// <returns>false</returns>
- override public bool MoneyTransferRequest(UUID from, UUID to, uint amount)
- {
- return false;
- }
- /// <summary>
- /// Performs an inventory transfer request between two accounts
- /// </summary>
- /// <remarks>TODO: Move to inventory server</remarks>
- /// <param name="from">The senders account ID</param>
- /// <param name="to">The receivers account ID</param>
- /// <param name="item">The item to transfer</param>
- /// <returns>false</returns>
- override public bool InventoryTransferRequest(UUID from, UUID to, UUID item)
- {
- return false;
- }
- #endregion
- #region Appearance methods
- /// <summary>
- /// Gets the user appearance.
- /// </summary>
- /// <param name="user">The user.</param>
- /// <returns></returns>
- override public AvatarAppearance GetUserAppearance(UUID user)
- {
- try
- {
- AvatarAppearance appearance = new AvatarAppearance();
- using (AutoClosingSqlCommand command = database.Query("SELECT * FROM avatarappearance WHERE owner = @UUID"))
- {
- command.Parameters.Add(database.CreateParameter("@UUID", user));
- using (IDataReader reader = command.ExecuteReader())
- {
- if (reader.Read())
- appearance = readUserAppearance(reader);
- else
- {
- m_log.WarnFormat("[USER DB] No appearance found for user {0}", user.ToString());
- return null;
- }
- }
- }
- appearance.SetAttachments(GetUserAttachments(user));
- return appearance;
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error updating userfriend, error: " + e.Message);
- }
- return null;
- }
- /// <summary>
- /// Update a user appearence into database
- /// </summary>
- /// <param name="user">the used UUID</param>
- /// <param name="appearance">the appearence</param>
- override public void UpdateUserAppearance(UUID user, AvatarAppearance appearance)
- {
- m_log.Error("[USER DB] updating user appearance for user ID " + user.Guid);
- string sql = String.Empty;
- sql += "DELETE FROM avatarappearance WHERE owner=@owner ";
- sql += "INSERT INTO avatarappearance ";
- sql += "(owner, serial, visual_params, texture, avatar_height, ";
- sql += "body_item, body_asset, skin_item, skin_asset, hair_item, hair_asset, eyes_item, eyes_asset, ";
- sql += "shirt_item, shirt_asset, pants_item, pants_asset, shoes_item, shoes_asset, socks_item, socks_asset, ";
- sql += "jacket_item, jacket_asset, gloves_item, gloves_asset, undershirt_item, undershirt_asset, underpants_item, underpants_asset, ";
- sql += "skirt_item, skirt_asset) values (";
- sql += "@owner, @serial, @visual_params, @texture, @avatar_height, ";
- sql += "@body_item, @body_asset, @skin_item, @skin_asset, @hair_item, @hair_asset, @eyes_item, @eyes_asset, ";
- sql += "@shirt_item, @shirt_asset, @pants_item, @pants_asset, @shoes_item, @shoes_asset, @socks_item, @socks_asset, ";
- sql += "@jacket_item, @jacket_asset, @gloves_item, @gloves_asset, @undershirt_item, @undershirt_asset, @underpants_item, @underpants_asset, ";
- sql += "@skirt_item, @skirt_asset)";
- using (AutoClosingSqlCommand cmd = database.Query(sql))
- {
- cmd.Parameters.Add(database.CreateParameter("@owner", appearance.Owner));
- cmd.Parameters.Add(database.CreateParameter("@serial", appearance.Serial));
- cmd.Parameters.Add(database.CreateParameter("@visual_params", appearance.VisualParams));
- cmd.Parameters.Add(database.CreateParameter("@texture", appearance.Texture.ToBytes()));
- cmd.Parameters.Add(database.CreateParameter("@avatar_height", appearance.AvatarHeight));
- cmd.Parameters.Add(database.CreateParameter("@body_item", appearance.BodyItem));
- cmd.Parameters.Add(database.CreateParameter("@body_asset", appearance.BodyAsset));
- cmd.Parameters.Add(database.CreateParameter("@skin_item", appearance.SkinItem));
- cmd.Parameters.Add(database.CreateParameter("@skin_asset", appearance.SkinAsset));
- cmd.Parameters.Add(database.CreateParameter("@hair_item", appearance.HairItem));
- cmd.Parameters.Add(database.CreateParameter("@hair_asset", appearance.HairAsset));
- cmd.Parameters.Add(database.CreateParameter("@eyes_item", appearance.EyesItem));
- cmd.Parameters.Add(database.CreateParameter("@eyes_asset", appearance.EyesAsset));
- cmd.Parameters.Add(database.CreateParameter("@shirt_item", appearance.ShirtItem));
- cmd.Parameters.Add(database.CreateParameter("@shirt_asset", appearance.ShirtAsset));
- cmd.Parameters.Add(database.CreateParameter("@pants_item", appearance.PantsItem));
- cmd.Parameters.Add(database.CreateParameter("@pants_asset", appearance.PantsAsset));
- cmd.Parameters.Add(database.CreateParameter("@shoes_item", appearance.ShoesItem));
- cmd.Parameters.Add(database.CreateParameter("@shoes_asset", appearance.ShoesAsset));
- cmd.Parameters.Add(database.CreateParameter("@socks_item", appearance.SocksItem));
- cmd.Parameters.Add(database.CreateParameter("@socks_asset", appearance.SocksAsset));
- cmd.Parameters.Add(database.CreateParameter("@jacket_item", appearance.JacketItem));
- cmd.Parameters.Add(database.CreateParameter("@jacket_asset", appearance.JacketAsset));
- cmd.Parameters.Add(database.CreateParameter("@gloves_item", appearance.GlovesItem));
- cmd.Parameters.Add(database.CreateParameter("@gloves_asset", appearance.GlovesAsset));
- cmd.Parameters.Add(database.CreateParameter("@undershirt_item", appearance.UnderShirtItem));
- cmd.Parameters.Add(database.CreateParameter("@undershirt_asset", appearance.UnderShirtAsset));
- cmd.Parameters.Add(database.CreateParameter("@underpants_item", appearance.UnderPantsItem));
- cmd.Parameters.Add(database.CreateParameter("@underpants_asset", appearance.UnderPantsAsset));
- cmd.Parameters.Add(database.CreateParameter("@skirt_item", appearance.SkirtItem));
- cmd.Parameters.Add(database.CreateParameter("@skirt_asset", appearance.SkirtAsset));
- try
- {
- cmd.ExecuteNonQuery();
- }
- catch (Exception e)
- {
- m_log.Error("[USER DB] Error updating user appearance, error: " + e.Message);
- }
- }
- UpdateUserAttachments(user, appearance.GetAttachments());
- }
- #endregion
- #region Attachment methods
- /// <summary>
- /// Gets all attachment of a agent.
- /// </summary>
- /// <param name="agentID">agent ID.</param>
- /// <returns></returns>
- public Hashtable GetUserAttachments(UUID agentID)
- {
- Hashtable returnTable = new Hashtable();
- using (AutoClosingSqlCommand command = database.Query("select attachpoint, item, asset from avatarattachments where UUID = @uuid", database.CreateParameter("@uuid", agentID)))
- {
- using (SqlDataReader reader = command.ExecuteReader())
- {
- while (reader.Read())
- {
- int attachpoint = Convert.ToInt32(reader["attachpoint"]);
- if (returnTable.ContainsKey(attachpoint))
- continue;
- Hashtable item = new Hashtable();
- item.Add("item", reader["item"].ToString());
- item.Add("asset", reader["asset"].ToString());
- returnTable.Add(attachpoint, item);
- }
- }
- }
- return returnTable;
- }
- /// <summary>
- /// Updates all attachments of the agent.
- /// </summary>
- /// <param name="agentID">agentID.</param>
- /// <param name="data">data with all items on attachmentpoints</param>
- public void UpdateUserAttachments(UUID agentID, Hashtable data)
- {
- string sql = "delete from avatarattachments where UUID = @uuid";
- using (AutoClosingSqlCommand command = database.Query(sql))
- {
- command.Parameters.Add(database.CreateParameter("uuid", agentID));
- command.ExecuteNonQuery();
- }
- if (data == null)
- return;
- sql = "insert into avatarattachments (UUID, attachpoint, item, asset) values (@uuid, @attachpoint, @item, @asset)";
- using (AutoClosingSqlCommand command = database.Query(sql))
- {
- bool firstTime = true;
- foreach (DictionaryEntry e in data)
- {
- int attachpoint = Convert.ToInt32(e.Key);
- Hashtable item = (Hashtable)e.Value;
- if (firstTime)
- {
- command.Parameters.Add(database.CreateParameter("@uuid", agentID));
- command.Parameters.Add(database.CreateParameter("@attachpoint", attachpoint));
- command.Parameters.Add(database.CreateParameter("@item", item["item"].ToString()));
- command.Parameters.Add(database.CreateParameter("@asset", item["asset"].ToString()));
- firstTime = false;
- }
- command.Parameters["@uuid"].Value = agentID.ToString();
- command.Parameters["@attachpoint"].Value = attachpoint;
- command.Parameters["@item"].Value = item["item"].ToString();
- command.Parameters["@asset"].Value = item["asset"].ToString();
- try
- {
- command.ExecuteNonQuery();
- }
- catch (Exception ex)
- {
- m_log.DebugFormat("[USER DB] : Error adding user attachment. {0}", ex.Message);
- }
- }
- }
- }
- /// <summary>
- /// Resets all attachments of a agent in the database.
- /// </summary>
- /// <param name="agentID">agentID.</param>
- override public void ResetAttachments(UUID agentID)
- {
- using (AutoClosingSqlCommand command = database.Query("update avatarattachments set asset = '00000000-0000-0000-0000-000000000000' where UUID = @uuid"))
- {
- command.Parameters.Add(database.CreateParameter("uuid", agentID));
- command.ExecuteNonQuery();
- }
- }
- override public void LogoutUsers(UUID regionID)
- {
- }
- #endregion
- #region Other public methods
- /// <summary>
- ///
- /// </summary>
- /// <param name="queryID"></param>
- /// <param name="query"></param>
- /// <returns></returns>
- override public List<AvatarPickerAvatar> GeneratePickerResults(UUID queryID, string query)
- {
- List<AvatarPickerAvatar> returnlist = new List<AvatarPickerAvatar>();
- string[] querysplit = query.Split(' ');
- if (querysplit.Length == 2)
- {
- try
- {
- using (AutoClosingSqlCommand command = database.Query("SELECT UUID,username,lastname FROM " + m_usersTableName + " WHERE username LIKE @first AND lastname LIKE @second"))
- {
- //Add wildcard to the search
- command.Parameters.Add(database.CreateParameter("first", querysplit[0] + "%"));
- command.Parameters.Add(database.CreateParameter("second", querysplit[1] + "%"));
- using (IDataReader reader = command.ExecuteReader())
- {
- while (reader.Read())
- {
- AvatarPickerAvatar user = new AvatarPickerAvatar();
- user.AvatarID = new UUID((string)reader["UUID"]);
- user.firstName = (string)reader["username"];
- user.lastName = (string)reader["lastname"];
- returnlist.Add(user);
- }
- }
- }
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- }
- }
- else if (querysplit.Length == 1)
- {
- try
- {
- using (AutoClosingSqlCommand command = database.Query("SELECT UUID,username,lastname FROM " + m_usersTableName + " WHERE username LIKE @first OR lastname LIKE @first"))
- {
- command.Parameters.Add(database.CreateParameter("first", querysplit[0] + "%"));
- using (IDataReader reader = command.ExecuteReader())
- {
- while (reader.Read())
- {
- AvatarPickerAvatar user = new AvatarPickerAvatar();
- user.AvatarID = new UUID((string)reader["UUID"]);
- user.firstName = (string)reader["username"];
- user.lastName = (string)reader["lastname"];
- returnlist.Add(user);
- }
- }
- }
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- }
- }
- return returnlist;
- }
- /// <summary>
- /// Store a weblogin key
- /// </summary>
- /// <param name="AgentID">The agent UUID</param>
- /// <param name="WebLoginKey">the WebLogin Key</param>
- /// <remarks>unused ?</remarks>
- override public void StoreWebLoginKey(UUID AgentID, UUID WebLoginKey)
- {
- UserProfileData user = GetUserByUUID(AgentID);
- user.WebLoginKey = WebLoginKey;
- UpdateUserProfile(user);
- }
- /// <summary>
- /// Database provider name
- /// </summary>
- /// <returns>Provider name</returns>
- override public string Name
- {
- get { return "MSSQL Userdata Interface"; }
- }
- /// <summary>
- /// Database provider version
- /// </summary>
- /// <returns>provider version</returns>
- override public string Version
- {
- get { return database.getVersion(); }
- }
- #endregion
- #region Private functions
- /// <summary>
- /// Reads a one item from an SQL result
- /// </summary>
- /// <param name="reader">The SQL Result</param>
- /// <returns>the item read</returns>
- private static AvatarAppearance readUserAppearance(IDataReader reader)
- {
- try
- {
- AvatarAppearance appearance = new AvatarAppearance();
- appearance.Owner = new UUID((string)reader["owner"]);
- appearance.Serial = Convert.ToInt32(reader["serial"]);
- appearance.VisualParams = (byte[])reader["visual_params"];
- appearance.Texture = new Primitive.TextureEntry((byte[])reader["texture"], 0, ((byte[])reader["texture"]).Length);
- appearance.AvatarHeight = (float)Convert.ToDouble(reader["avatar_height"]);
- appearance.BodyItem = new UUID((string)reader["body_item"]);
- appearance.BodyAsset = new UUID((string)reader["body_asset"]);
- appearance.SkinItem = new UUID((string)reader["skin_item"]);
- appearance.SkinAsset = new UUID((string)reader["skin_asset"]);
- appearance.HairItem = new UUID((string)reader["hair_item"]);
- appearance.HairAsset = new UUID((string)reader["hair_asset"]);
- appearance.EyesItem = new UUID((string)reader["eyes_item"]);
- appearance.EyesAsset = new UUID((string)reader["eyes_asset"]);
- appearance.ShirtItem = new UUID((string)reader["shirt_item"]);
- appearance.ShirtAsset = new UUID((string)reader["shirt_asset"]);
- appearance.PantsItem = new UUID((string)reader["pants_item"]);
- appearance.PantsAsset = new UUID((string)reader["pants_asset"]);
- appearance.ShoesItem = new UUID((string)reader["shoes_item"]);
- appearance.ShoesAsset = new UUID((string)reader["shoes_asset"]);
- appearance.SocksItem = new UUID((string)reader["socks_item"]);
- appearance.SocksAsset = new UUID((string)reader["socks_asset"]);
- appearance.JacketItem = new UUID((string)reader["jacket_item"]);
- appearance.JacketAsset = new UUID((string)reader["jacket_asset"]);
- appearance.GlovesItem = new UUID((string)reader["gloves_item"]);
- appearance.GlovesAsset = new UUID((string)reader["gloves_asset"]);
- appearance.UnderShirtItem = new UUID((string)reader["undershirt_item"]);
- appearance.UnderShirtAsset = new UUID((string)reader["undershirt_asset"]);
- appearance.UnderPantsItem = new UUID((string)reader["underpants_item"]);
- appearance.UnderPantsAsset = new UUID((string)reader["underpants_asset"]);
- appearance.SkirtItem = new UUID((string)reader["skirt_item"]);
- appearance.SkirtAsset = new UUID((string)reader["skirt_asset"]);
- return appearance;
- }
- catch (SqlException e)
- {
- m_log.Error(e.ToString());
- }
- return null;
- }
- /// <summary>
- /// Insert/Update a agent row in the DB.
- /// </summary>
- /// <param name="agentdata">agentdata.</param>
- private void InsertUpdateAgentRow(UserAgentData agentdata)
- {
- string sql = @"
- IF EXISTS (SELECT * FROM agents WHERE UUID = @UUID)
- BEGIN
- 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
- WHERE UUID = @UUID
- END
- ELSE
- BEGIN
- INSERT INTO
- agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) VALUES
- (@UUID, @sessionID, @secureSessionID, @agentIP, @agentPort, @agentOnline, @loginTime, @logoutTime, @currentRegion, @currentHandle, @currentPos)
- END
- ";
- using (AutoClosingSqlCommand command = database.Query(sql))
- {
- command.Parameters.Add(database.CreateParameter("@UUID", agentdata.ProfileID));
- command.Parameters.Add(database.CreateParameter("@sessionID", agentdata.SessionID));
- command.Parameters.Add(database.CreateParameter("@secureSessionID", agentdata.SecureSessionID));
- command.Parameters.Add(database.CreateParameter("@agentIP", agentdata.AgentIP));
- command.Parameters.Add(database.CreateParameter("@agentPort", agentdata.AgentPort));
- command.Parameters.Add(database.CreateParameter("@agentOnline", agentdata.AgentOnline));
- command.Parameters.Add(database.CreateParameter("@loginTime", agentdata.LoginTime));
- command.Parameters.Add(database.CreateParameter("@logoutTime", agentdata.LogoutTime));
- command.Parameters.Add(database.CreateParameter("@currentRegion", agentdata.Region));
- command.Parameters.Add(database.CreateParameter("@currentHandle", agentdata.Handle));
- command.Parameters.Add(database.CreateParameter("@currentPos", "<" + ((int)agentdata.Position.X) + "," + ((int)agentdata.Position.Y) + "," + ((int)agentdata.Position.Z) + ">"));
- command.Transaction = command.Connection.BeginTransaction(IsolationLevel.Serializable);
- try
- {
- if (command.ExecuteNonQuery() > 0)
- {
- command.Transaction.Commit();
- return;
- }
- command.Transaction.Rollback();
- return;
- }
- catch (Exception e)
- {
- command.Transaction.Rollback();
- m_log.Error(e.ToString());
- return;
- }
- }
- }
- /// <summary>
- /// Reads an agent row from a database reader
- /// </summary>
- /// <param name="reader">An active database reader</param>
- /// <returns>A user session agent</returns>
- private UserAgentData readAgentRow(IDataReader reader)
- {
- UserAgentData retval = new UserAgentData();
- if (reader.Read())
- {
- // Agent IDs
- retval.ProfileID = new UUID((string)reader["UUID"]);
- retval.SessionID = new UUID((string)reader["sessionID"]);
- retval.SecureSessionID = new UUID((string)reader["secureSessionID"]);
- // Agent Who?
- retval.AgentIP = (string)reader["agentIP"];
- retval.AgentPort = Convert.ToUInt32(reader["agentPort"].ToString());
- retval.AgentOnline = Convert.ToInt32(reader["agentOnline"].ToString()) != 0;
- // Login/Logout times (UNIX Epoch)
- retval.LoginTime = Convert.ToInt32(reader["loginTime"].ToString());
- retval.LogoutTime = Convert.ToInt32(reader["logoutTime"].ToString());
- // Current position
- retval.Region = (UUID)(string)reader["currentRegion"];
- retval.Handle = Convert.ToUInt64(reader["currentHandle"].ToString());
- Vector3 tmp_v;
- Vector3.TryParse((string)reader["currentPos"], out tmp_v);
- retval.Position = tmp_v;
- }
- else
- {
- return null;
- }
- return retval;
- }
- /// <summary>
- /// Creates a new user and inserts it into the database
- /// </summary>
- /// <param name="uuid">User ID</param>
- /// <param name="username">First part of the login</param>
- /// <param name="lastname">Second part of the login</param>
- /// <param name="email">Email of person</param>
- /// <param name="passwordHash">A salted hash of the users password</param>
- /// <param name="passwordSalt">The salt used for the password hash</param>
- /// <param name="homeRegion">A regionHandle of the users home region</param>
- /// <param name="homeLocX">Home region position vector</param>
- /// <param name="homeLocY">Home region position vector</param>
- /// <param name="homeLocZ">Home region position vector</param>
- /// <param name="homeLookAtX">Home region 'look at' vector</param>
- /// <param name="homeLookAtY">Home region 'look at' vector</param>
- /// <param name="homeLookAtZ">Home region 'look at' vector</param>
- /// <param name="created">Account created (unix timestamp)</param>
- /// <param name="lastlogin">Last login (unix timestamp)</param>
- /// <param name="inventoryURI">Users inventory URI</param>
- /// <param name="assetURI">Users asset URI</param>
- /// <param name="canDoMask">I can do mask</param>
- /// <param name="wantDoMask">I want to do mask</param>
- /// <param name="aboutText">Profile text</param>
- /// <param name="firstText">Firstlife text</param>
- /// <param name="profileImage">UUID for profile image</param>
- /// <param name="firstImage">UUID for firstlife image</param>
- /// <param name="webLoginKey">web login key</param>
- /// <param name="homeRegionID">homeregion UUID</param>
- /// <param name="godLevel">has the user godlevel</param>
- /// <param name="userFlags">unknown</param>
- /// <param name="customType">unknown</param>
- /// <param name="partnerID">UUID of partner</param>
- /// <returns>Success?</returns>
- private void InsertUserRow(UUID uuid, string username, string lastname, string email, string passwordHash,
- string passwordSalt, UInt64 homeRegion, float homeLocX, float homeLocY, float homeLocZ,
- float homeLookAtX, float homeLookAtY, float homeLookAtZ, int created, int lastlogin,
- string inventoryURI, string assetURI, uint canDoMask, uint wantDoMask,
- string aboutText, string firstText,
- UUID profileImage, UUID firstImage, UUID webLoginKey, UUID homeRegionID,
- int godLevel, int userFlags, string customType, UUID partnerID)
- {
- string sql = "INSERT INTO " + m_usersTableName;
- sql += " ([UUID], [username], [lastname], [email], [passwordHash], [passwordSalt], [homeRegion], ";
- sql += "[homeLocationX], [homeLocationY], [homeLocationZ], [homeLookAtX], [homeLookAtY], [homeLookAtZ], [created], ";
- sql += "[lastLogin], [userInventoryURI], [userAssetURI], [profileCanDoMask], [profileWantDoMask], [profileAboutText], ";
- sql += "[profileFirstText], [profileImage], [profileFirstImage], [webLoginKey], ";
- sql += "[homeRegionID], [userFlags], [godLevel], [customType], [partner]) VALUES ";
- sql += "(@UUID, @username, @lastname, @email, @passwordHash, @passwordSalt, @homeRegion, ";
- sql += "@homeLocationX, @homeLocationY, @homeLocationZ, @homeLookAtX, @homeLookAtY, @homeLookAtZ, @created, ";
- sql += "@lastLogin, @userInventoryURI, @userAssetURI, @profileCanDoMask, @profileWantDoMask, @profileAboutText, ";
- sql += "@profileFirstText, @profileImage, @profileFirstImage, @webLoginKey, ";
- sql += "@homeRegionID, @userFlags, @godLevel, @customType, @partner)";
- try
- {
- using (AutoClosingSqlCommand command = database.Query(sql))
- {
- command.Parameters.Add(database.CreateParameter("UUID", uuid));
- command.Parameters.Add(database.CreateParameter("username", username));
- command.Parameters.Add(database.CreateParameter("lastname", lastname));
- command.Parameters.Add(database.CreateParameter("email", email));
- command.Parameters.Add(database.CreateParameter("passwordHash", passwordHash));
- command.Parameters.Add(database.CreateParameter("passwordSalt", passwordSalt));
- command.Parameters.Add(database.CreateParameter("homeRegion", homeRegion));
- command.Parameters.Add(database.CreateParameter("homeLocationX", homeLocX));
- command.Parameters.Add(database.CreateParameter("homeLocationY", homeLocY));
- command.Parameters.Add(database.CreateParameter("homeLocationZ", homeLocZ));
- command.Parameters.Add(database.CreateParameter("homeLookAtX", homeLookAtX));
- command.Parameters.Add(database.CreateParameter("homeLookAtY", homeLookAtY));
- command.Parameters.Add(database.CreateParameter("homeLookAtZ", homeLookAtZ));
- command.Parameters.Add(database.CreateParameter("created", created));
- command.Parameters.Add(database.CreateParameter("lastLogin", lastlogin));
- command.Parameters.Add(database.CreateParameter("userInventoryURI", inventoryURI));
- command.Parameters.Add(database.CreateParameter("userAssetURI", assetURI));
- command.Parameters.Add(database.CreateParameter("profileCanDoMask", canDoMask));
- command.Parameters.Add(database.CreateParameter("profileWantDoMask", wantDoMask));
- command.Parameters.Add(database.CreateParameter("profileAboutText", aboutText));
- command.Parameters.Add(database.CreateParameter("profileFirstText", firstText));
- command.Parameters.Add(database.CreateParameter("profileImage", profileImage));
- command.Parameters.Add(database.CreateParameter("profileFirstImage", firstImage));
- command.Parameters.Add(database.CreateParameter("webLoginKey", webLoginKey));
- //
- command.Parameters.Add(database.CreateParameter("homeRegionID", homeRegionID));
- command.Parameters.Add(database.CreateParameter("userFlags", userFlags));
- command.Parameters.Add(database.CreateParameter("godLevel", godLevel));
- command.Parameters.Add(database.CreateParameter("customType", customType));
- command.Parameters.Add(database.CreateParameter("partner", partnerID));
-
- command.ExecuteNonQuery();
- return;
- }
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- return;
- }
- }
- /// <summary>
- /// Reads a user profile from an active data reader
- /// </summary>
- /// <param name="reader">An active database reader</param>
- /// <returns>A user profile</returns>
- private static UserProfileData ReadUserRow(IDataReader reader)
- {
- UserProfileData retval = new UserProfileData();
- if (reader.Read())
- {
- retval.ID = new UUID((string)reader["UUID"]);
- retval.FirstName = (string)reader["username"];
- retval.SurName = (string)reader["lastname"];
- retval.PasswordHash = (string)reader["passwordHash"];
- retval.PasswordSalt = (string)reader["passwordSalt"];
- retval.HomeRegion = Convert.ToUInt64(reader["homeRegion"].ToString());
- retval.HomeLocation = new Vector3(
- Convert.ToSingle(reader["homeLocationX"].ToString()),
- Convert.ToSingle(reader["homeLocationY"].ToString()),
- Convert.ToSingle(reader["homeLocationZ"].ToString()));
- retval.HomeLookAt = new Vector3(
- Convert.ToSingle(reader["homeLookAtX"].ToString()),
- Convert.ToSingle(reader["homeLookAtY"].ToString()),
- Convert.ToSingle(reader["homeLookAtZ"].ToString()));
- retval.Created = Convert.ToInt32(reader["created"].ToString());
- retval.LastLogin = Convert.ToInt32(reader["lastLogin"].ToString());
- retval.UserInventoryURI = (string)reader["userInventoryURI"];
- retval.UserAssetURI = (string)reader["userAssetURI"];
- retval.CanDoMask = Convert.ToUInt32(reader["profileCanDoMask"].ToString());
- retval.WantDoMask = Convert.ToUInt32(reader["profileWantDoMask"].ToString());
- retval.AboutText = (string)reader["profileAboutText"];
- retval.FirstLifeAboutText = (string)reader["profileFirstText"];
- retval.Image = new UUID((string)reader["profileImage"]);
- retval.FirstLifeImage = new UUID((string)reader["profileFirstImage"]);
- retval.WebLoginKey = new UUID((string)reader["webLoginKey"]);
- }
- else
- {
- return null;
- }
- return retval;
- }
- #endregion
- }
- }
|