123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146 |
- /*
- * 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.Generic;
- using System.Data;
- using System.IO;
- using System.Reflection;
- using libsecondlife;
- using log4net;
- using MySql.Data.MySqlClient;
- using OpenSim.Framework;
- namespace OpenSim.Data.MySQL
- {
- /// <summary>
- /// A MySQL Database manager
- /// </summary>
- internal class MySQLManager
- {
- private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- /// <summary>
- /// The database connection object
- /// </summary>
- private MySqlConnection dbcon;
- /// <summary>
- /// Connection string for ADO.net
- /// </summary>
- private string connectionString;
- private const string m_waitTimeoutSelect = "select @@wait_timeout";
-
- /// <summary>
- /// Wait timeout for our connection in ticks.
- /// </summary>
- private long m_waitTimeout;
- /// <summary>
- /// Make our storage of the timeout this amount smaller than it actually is, to give us a margin on long
- /// running database operations.
- /// </summary>
- private long m_waitTimeoutLeeway = 60 * TimeSpan.TicksPerSecond;
- /// <summary>
- /// Holds the last tick time that the connection was used.
- /// </summary>
- private long m_lastConnectionUse;
- /// <summary>
- /// Initialises and creates a new MySQL connection and maintains it.
- /// </summary>
- /// <param name="hostname">The MySQL server being connected to</param>
- /// <param name="database">The name of the MySQL database being used</param>
- /// <param name="username">The username logging into the database</param>
- /// <param name="password">The password for the user logging in</param>
- /// <param name="cpooling">Whether to use connection pooling or not, can be one of the following: 'yes', 'true', 'no' or 'false', if unsure use 'false'.</param>
- /// <param name="port">The MySQL server port</param>
- public MySQLManager(string hostname, string database, string username, string password, string cpooling,
- string port)
- {
- string s = "Server=" + hostname + ";Port=" + port + ";Database=" + database + ";User ID=" +
- username + ";Password=" + password + ";Pooling=" + cpooling + ";";
- Initialise(s);
- }
- /// <summary>
- /// Initialises and creates a new MySQL connection and maintains it.
- /// </summary>
- /// <param name="connect">connectionString</param>
- public MySQLManager(String connect)
- {
- Initialise(connect);
- }
- /// <summary>
- /// Initialises and creates a new MySQL connection and maintains it.
- /// </summary>
- /// <param name="connect">connectionString</param>
- public void Initialise(String connect)
- {
- try
- {
- connectionString = connect;
- dbcon = new MySqlConnection(connectionString);
- try
- {
- dbcon.Open();
- }
- catch(Exception e)
- {
- throw new Exception("Connection error while using connection string ["+connectionString+"]", e);
- }
- m_log.Info("[MYSQL]: Connection established");
- GetWaitTimeout();
- }
- catch (Exception e)
- {
- throw new Exception("Error initialising MySql Database: " + e.ToString());
- }
- }
- /// <summary>
- /// Get the wait_timeout value for our connection
- /// </summary>
- protected void GetWaitTimeout()
- {
- MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, dbcon);
- using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
- {
- if (dbReader.Read())
- {
- m_waitTimeout
- = Convert.ToInt32(dbReader["@@wait_timeout"]) * TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
- }
- dbReader.Close();
- cmd.Dispose();
- }
- m_lastConnectionUse = System.DateTime.Now.Ticks;
- m_log.DebugFormat(
- "[REGION DB]: Connection wait timeout {0} seconds", m_waitTimeout / TimeSpan.TicksPerSecond);
- }
- /// <summary>
- /// Should be called before any db operation. This checks to see if the connection has not timed out
- /// </summary>
- public void CheckConnection()
- {
- //m_log.Debug("[REGION DB]: Checking connection");
- long timeNow = System.DateTime.Now.Ticks;
- if (timeNow - m_lastConnectionUse > m_waitTimeout || dbcon.State != ConnectionState.Open)
- {
- m_log.DebugFormat("[REGION DB]: Database connection has gone away - reconnecting");
- Reconnect();
- }
- // Strictly, we should set this after the actual db operation. But it's more convenient to set here rather
- // than require the code to call another method - the timeout leeway should be large enough to cover the
- // inaccuracy.
- m_lastConnectionUse = timeNow;
- }
-
- /// <summary>
- /// Get the connection being used
- /// </summary>
- /// <returns>MySqlConnection Object</returns>
- public MySqlConnection Connection
- {
- get { return dbcon; }
- }
- /// <summary>
- /// Shuts down the database connection
- /// </summary>
- public void Close()
- {
- dbcon.Close();
- dbcon = null;
- }
- /// <summary>
- /// Reconnects to the database
- /// </summary>
- public void Reconnect()
- {
- m_log.Info("[REGION DB] Reconnecting database");
- lock (dbcon)
- {
- try
- {
- // Close the DB connection
- dbcon.Close();
- // Try reopen it
- dbcon = new MySqlConnection(connectionString);
- dbcon.Open();
- }
- catch (Exception e)
- {
- m_log.Error("Unable to reconnect to database " + e.ToString());
- }
- }
- }
- /// <summary>
- /// Returns the version of this DB provider
- /// </summary>
- /// <returns>A string containing the DB provider</returns>
- public string getVersion()
- {
- Module module = GetType().Module;
- // string dllName = module.Assembly.ManifestModule.Name;
- Version dllVersion = module.Assembly.GetName().Version;
- return
- string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build,
- dllVersion.Revision);
- }
- /// <summary>
- /// Extract a named string resource from the embedded resources
- /// </summary>
- /// <param name="name">name of embedded resource</param>
- /// <returns>string contained within the embedded resource</returns>
- private string getResourceString(string name)
- {
- Assembly assem = GetType().Assembly;
- string[] names = assem.GetManifestResourceNames();
- foreach (string s in names)
- {
- if (s.EndsWith(name))
- {
- using (Stream resource = assem.GetManifestResourceStream(s))
- {
- using (StreamReader resourceReader = new StreamReader(resource))
- {
- string resourceString = resourceReader.ReadToEnd();
- return resourceString;
- }
- }
- }
- }
- throw new Exception(string.Format("Resource '{0}' was not found", name));
- }
- /// <summary>
- /// Execute a SQL statement stored in a resource, as a string
- /// </summary>
- /// <param name="name">name of embedded resource</param>
- public void ExecuteResourceSql(string name)
- {
- CheckConnection();
- MySqlCommand cmd = new MySqlCommand(getResourceString(name), dbcon);
- cmd.ExecuteNonQuery();
- }
- /// <summary>
- /// Execute a MySqlCommand
- /// </summary>
- /// <param name="sql">sql string to execute</param>
- public void ExecuteSql(string sql)
- {
- CheckConnection();
- MySqlCommand cmd = new MySqlCommand(sql, dbcon);
- cmd.ExecuteNonQuery();
- }
- /// <summary>
- /// Given a list of tables, return the version of the tables, as seen in the database
- /// </summary>
- /// <param name="tableList"></param>
- public void GetTableVersion(Dictionary<string, string> tableList)
- {
- lock (dbcon)
- {
- CheckConnection();
-
- MySqlCommand tablesCmd =
- new MySqlCommand(
- "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?dbname",
- dbcon);
- tablesCmd.Parameters.AddWithValue("?dbname", dbcon.Database);
-
- using (MySqlDataReader tables = tablesCmd.ExecuteReader())
- {
- while (tables.Read())
- {
- try
- {
- string tableName = (string) tables["TABLE_NAME"];
- string comment = (string) tables["TABLE_COMMENT"];
- if (tableList.ContainsKey(tableName))
- {
- tableList[tableName] = comment;
- }
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- }
- }
- tables.Close();
- }
- }
- }
- // TODO: at some time this code should be cleaned up
- /// <summary>
- /// Runs a query with protection against SQL Injection by using parameterised input.
- /// </summary>
- /// <param name="sql">The SQL string - replace any variables such as WHERE x = "y" with WHERE x = @y</param>
- /// <param name="parameters">The parameters - index so that @y is indexed as 'y'</param>
- /// <returns>A MySQL DB Command</returns>
- public IDbCommand Query(string sql, Dictionary<string, string> parameters)
- {
- try
- {
- CheckConnection(); // Not sure if this one is necessary
- MySqlCommand dbcommand = (MySqlCommand) dbcon.CreateCommand();
- dbcommand.CommandText = sql;
- foreach (KeyValuePair<string, string> param in parameters)
- {
- dbcommand.Parameters.AddWithValue(param.Key, param.Value);
- }
- return (IDbCommand) dbcommand;
- }
- catch (Exception e)
- {
- // Return null if it fails.
- m_log.Error("Failed during Query generation: " + e.ToString());
- return null;
- }
- }
- /// <summary>
- /// Reads a region row from a database reader
- /// </summary>
- /// <param name="reader">An active database reader</param>
- /// <returns>A region profile</returns>
- public RegionProfileData readSimRow(IDataReader reader)
- {
- RegionProfileData retval = new RegionProfileData();
- if (reader.Read())
- {
- // Region Main gotta-have-or-we-return-null parts
- UInt64 tmp64;
- if (!UInt64.TryParse(reader["regionHandle"].ToString(), out tmp64))
- {
- return null;
- }
- else
- {
- retval.regionHandle = tmp64;
- }
- LLUUID tmp_uuid;
- if (!LLUUID.TryParse((string)reader["uuid"], out tmp_uuid))
- {
- return null;
- }
- else
- {
- retval.UUID = tmp_uuid;
- }
- // non-critical parts
- retval.regionName = (string)reader["regionName"];
- retval.originUUID = new LLUUID((string) reader["originUUID"]);
- // Secrets
- retval.regionRecvKey = (string) reader["regionRecvKey"];
- retval.regionSecret = (string) reader["regionSecret"];
- retval.regionSendKey = (string) reader["regionSendKey"];
- // Region Server
- retval.regionDataURI = (string) reader["regionDataURI"];
- retval.regionOnline = false; // Needs to be pinged before this can be set.
- retval.serverIP = (string) reader["serverIP"];
- retval.serverPort = (uint) reader["serverPort"];
- retval.serverURI = (string) reader["serverURI"];
- retval.httpPort = Convert.ToUInt32(reader["serverHttpPort"].ToString());
- retval.remotingPort = Convert.ToUInt32(reader["serverRemotingPort"].ToString());
- // Location
- retval.regionLocX = Convert.ToUInt32(reader["locX"].ToString());
- retval.regionLocY = Convert.ToUInt32(reader["locY"].ToString());
- retval.regionLocZ = Convert.ToUInt32(reader["locZ"].ToString());
- // Neighbours - 0 = No Override
- retval.regionEastOverrideHandle = Convert.ToUInt64(reader["eastOverrideHandle"].ToString());
- retval.regionWestOverrideHandle = Convert.ToUInt64(reader["westOverrideHandle"].ToString());
- retval.regionSouthOverrideHandle = Convert.ToUInt64(reader["southOverrideHandle"].ToString());
- retval.regionNorthOverrideHandle = Convert.ToUInt64(reader["northOverrideHandle"].ToString());
- // Assets
- retval.regionAssetURI = (string) reader["regionAssetURI"];
- retval.regionAssetRecvKey = (string) reader["regionAssetRecvKey"];
- retval.regionAssetSendKey = (string) reader["regionAssetSendKey"];
- // Userserver
- retval.regionUserURI = (string) reader["regionUserURI"];
- retval.regionUserRecvKey = (string) reader["regionUserRecvKey"];
- retval.regionUserSendKey = (string) reader["regionUserSendKey"];
- // World Map Addition
- LLUUID.TryParse((string)reader["regionMapTexture"], out retval.regionMapTextureID);
- LLUUID.TryParse((string)reader["owner_uuid"], out retval.owner_uuid);
- }
- else
- {
- return null;
- }
- return retval;
- }
- /// <summary>
- /// Reads a reservation row from a database reader
- /// </summary>
- /// <param name="reader">An active database reader</param>
- /// <returns>A reservation data object</returns>
- public ReservationData readReservationRow(IDataReader reader)
- {
- ReservationData retval = new ReservationData();
- if (reader.Read())
- {
- retval.gridRecvKey = (string) reader["gridRecvKey"];
- retval.gridSendKey = (string) reader["gridSendKey"];
- retval.reservationCompany = (string) reader["resCompany"];
- retval.reservationMaxX = Convert.ToInt32(reader["resXMax"].ToString());
- retval.reservationMaxY = Convert.ToInt32(reader["resYMax"].ToString());
- retval.reservationMinX = Convert.ToInt32(reader["resXMin"].ToString());
- retval.reservationMinY = Convert.ToInt32(reader["resYMin"].ToString());
- retval.reservationName = (string) reader["resName"];
- retval.status = Convert.ToInt32(reader["status"].ToString()) == 1;
- LLUUID tmp;
- LLUUID.TryParse((string) reader["userUUID"], out tmp);
- retval.userUUID = tmp;
- }
- else
- {
- return null;
- }
- return retval;
- }
- /// <summary>
- /// Reads an agent row from a database reader
- /// </summary>
- /// <param name="reader">An active database reader</param>
- /// <returns>A user session agent</returns>
- public UserAgentData readAgentRow(IDataReader reader)
- {
- UserAgentData retval = new UserAgentData();
- if (reader.Read())
- {
- // Agent IDs
- LLUUID tmp;
- if (!LLUUID.TryParse((string)reader["UUID"], out tmp))
- return null;
- retval.ProfileID = tmp;
- LLUUID.TryParse((string) reader["sessionID"], out tmp);
- retval.SessionID = tmp;
- LLUUID.TryParse((string)reader["secureSessionID"], out tmp);
- retval.SecureSessionID = tmp;
- // Agent Who?
- retval.AgentIP = (string) reader["agentIP"];
- retval.AgentPort = Convert.ToUInt32(reader["agentPort"].ToString());
- retval.AgentOnline = Convert.ToBoolean(Convert.ToInt16(reader["agentOnline"].ToString()));
- // Login/Logout times (UNIX Epoch)
- retval.LoginTime = Convert.ToInt32(reader["loginTime"].ToString());
- retval.LogoutTime = Convert.ToInt32(reader["logoutTime"].ToString());
- // Current position
- retval.Region = new LLUUID((string)reader["currentRegion"]);
- retval.Handle = Convert.ToUInt64(reader["currentHandle"].ToString());
- LLVector3 tmp_v;
- LLVector3.TryParse((string) reader["currentPos"], out tmp_v);
- retval.Position = tmp_v;
- }
- else
- {
- return null;
- }
- return retval;
- }
- /// <summary>
- /// Reads a user profile from an active data reader
- /// </summary>
- /// <param name="reader">An active database reader</param>
- /// <returns>A user profile</returns>
- public UserProfileData readUserRow(IDataReader reader)
- {
- UserProfileData retval = new UserProfileData();
- if (reader.Read())
- {
- LLUUID id;
- if (!LLUUID.TryParse((string)reader["UUID"], out id))
- return null;
- retval.ID = id;
- 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 LLVector3(
- Convert.ToSingle(reader["homeLocationX"].ToString()),
- Convert.ToSingle(reader["homeLocationY"].ToString()),
- Convert.ToSingle(reader["homeLocationZ"].ToString()));
- retval.HomeLookAt = new LLVector3(
- 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());
- if (reader.IsDBNull(reader.GetOrdinal("profileAboutText")))
- retval.AboutText = "";
- else
- retval.AboutText = (string) reader["profileAboutText"];
- if (reader.IsDBNull(reader.GetOrdinal("profileFirstText")))
- retval.FirstLifeAboutText = "";
- else
- retval.FirstLifeAboutText = (string)reader["profileFirstText"];
- if (reader.IsDBNull(reader.GetOrdinal("profileImage")))
- retval.Image = LLUUID.Zero;
- else {
- LLUUID tmp;
- LLUUID.TryParse((string)reader["profileImage"], out tmp);
- retval.Image = tmp;
- }
- if (reader.IsDBNull(reader.GetOrdinal("profileFirstImage")))
- retval.FirstLifeImage = LLUUID.Zero;
- else {
- LLUUID tmp;
- LLUUID.TryParse((string)reader["profileFirstImage"], out tmp);
- retval.FirstLifeImage = tmp;
- }
- if (reader.IsDBNull(reader.GetOrdinal("webLoginKey")))
- {
- retval.WebLoginKey = LLUUID.Zero;
- }
- else
- {
- LLUUID tmp;
- LLUUID.TryParse((string)reader["webLoginKey"], out tmp);
- retval.WebLoginKey = tmp;
- }
- }
- else
- {
- return null;
- }
- return retval;
- }
- /// <summary>
- /// Reads an avatar appearence from an active data reader
- /// </summary>
- /// <param name="reader">An active database reader</param>
- /// <returns>An avatar appearence</returns>
- public AvatarAppearance readAppearanceRow(IDataReader reader)
- {
- AvatarAppearance appearance = null;
- if (reader.Read())
- {
- appearance = new AvatarAppearance();
- appearance.Owner = new LLUUID((string)reader["owner"]);
- appearance.Serial = Convert.ToInt32(reader["serial"]);
- appearance.VisualParams = (byte[])reader["visual_params"];
- appearance.Texture = new LLObject.TextureEntry((byte[])reader["texture"], 0, ((byte[])reader["texture"]).Length);
- appearance.AvatarHeight = (float)Convert.ToDouble(reader["avatar_height"]);
- appearance.BodyItem = new LLUUID((string)reader["body_item"]);
- appearance.BodyAsset = new LLUUID((string)reader["body_asset"]);
- appearance.SkinItem = new LLUUID((string)reader["skin_item"]);
- appearance.SkinAsset = new LLUUID((string)reader["skin_asset"]);
- appearance.HairItem = new LLUUID((string)reader["hair_item"]);
- appearance.HairAsset = new LLUUID((string)reader["hair_asset"]);
- appearance.EyesItem = new LLUUID((string)reader["eyes_item"]);
- appearance.EyesAsset = new LLUUID((string)reader["eyes_asset"]);
- appearance.ShirtItem = new LLUUID((string)reader["shirt_item"]);
- appearance.ShirtAsset = new LLUUID((string)reader["shirt_asset"]);
- appearance.PantsItem = new LLUUID((string)reader["pants_item"]);
- appearance.PantsAsset = new LLUUID((string)reader["pants_asset"]);
- appearance.ShoesItem = new LLUUID((string)reader["shoes_item"]);
- appearance.ShoesAsset = new LLUUID((string)reader["shoes_asset"]);
- appearance.SocksItem = new LLUUID((string)reader["socks_item"]);
- appearance.SocksAsset = new LLUUID((string)reader["socks_asset"]);
- appearance.JacketItem = new LLUUID((string)reader["jacket_item"]);
- appearance.JacketAsset = new LLUUID((string)reader["jacket_asset"]);
- appearance.GlovesItem = new LLUUID((string)reader["gloves_item"]);
- appearance.GlovesAsset = new LLUUID((string)reader["gloves_asset"]);
- appearance.UnderShirtItem = new LLUUID((string)reader["undershirt_item"]);
- appearance.UnderShirtAsset = new LLUUID((string)reader["undershirt_asset"]);
- appearance.UnderPantsItem = new LLUUID((string)reader["underpants_item"]);
- appearance.UnderPantsAsset = new LLUUID((string)reader["underpants_asset"]);
- appearance.SkirtItem = new LLUUID((string)reader["skirt_item"]);
- appearance.SkirtAsset = new LLUUID((string)reader["skirt_asset"]);
- }
- return appearance;
- }
- /// <summary>
- /// Inserts a new row into the log database
- /// </summary>
- /// <param name="serverDaemon">The daemon which triggered this event</param>
- /// <param name="target">Who were we operating on when this occured (region UUID, user UUID, etc)</param>
- /// <param name="methodCall">The method call where the problem occured</param>
- /// <param name="arguments">The arguments passed to the method</param>
- /// <param name="priority">How critical is this?</param>
- /// <param name="logMessage">Extra message info</param>
- /// <returns>Saved successfully?</returns>
- public bool insertLogRow(string serverDaemon, string target, string methodCall, string arguments, int priority,
- string logMessage)
- {
- string sql = "INSERT INTO logs (`target`, `server`, `method`, `arguments`, `priority`, `message`) VALUES ";
- sql += "(?target, ?server, ?method, ?arguments, ?priority, ?message)";
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- parameters["?server"] = serverDaemon;
- parameters["?target"] = target;
- parameters["?method"] = methodCall;
- parameters["?arguments"] = arguments;
- parameters["?priority"] = priority.ToString();
- parameters["?message"] = logMessage;
- bool returnval = false;
- try
- {
- IDbCommand result = Query(sql, parameters);
- if (result.ExecuteNonQuery() == 1)
- returnval = true;
- result.Dispose();
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- return false;
- }
- return returnval;
- }
- /// <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="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">Ignored</param>
- /// <returns>Success?</returns>
- public bool insertUserRow(LLUUID uuid, string username, string lastname, 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,
- LLUUID profileImage, LLUUID firstImage, LLUUID webLoginKey)
- {
- m_log.Debug("[MySQLManager]: Fetching profile for " + uuid.ToString());
- string sql =
- "INSERT INTO users (`UUID`, `username`, `lastname`, `passwordHash`, `passwordSalt`, `homeRegion`, ";
- sql +=
- "`homeLocationX`, `homeLocationY`, `homeLocationZ`, `homeLookAtX`, `homeLookAtY`, `homeLookAtZ`, `created`, ";
- sql +=
- "`lastLogin`, `userInventoryURI`, `userAssetURI`, `profileCanDoMask`, `profileWantDoMask`, `profileAboutText`, ";
- sql += "`profileFirstText`, `profileImage`, `profileFirstImage`, `webLoginKey`) VALUES ";
- sql += "(?UUID, ?username, ?lastname, ?passwordHash, ?passwordSalt, ?homeRegion, ";
- sql +=
- "?homeLocationX, ?homeLocationY, ?homeLocationZ, ?homeLookAtX, ?homeLookAtY, ?homeLookAtZ, ?created, ";
- sql +=
- "?lastLogin, ?userInventoryURI, ?userAssetURI, ?profileCanDoMask, ?profileWantDoMask, ?profileAboutText, ";
- sql += "?profileFirstText, ?profileImage, ?profileFirstImage, ?webLoginKey)";
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- parameters["?UUID"] = uuid.ToString();
- parameters["?username"] = username.ToString();
- parameters["?lastname"] = lastname.ToString();
- parameters["?passwordHash"] = passwordHash.ToString();
- parameters["?passwordSalt"] = passwordSalt.ToString();
- parameters["?homeRegion"] = homeRegion.ToString();
- parameters["?homeLocationX"] = homeLocX.ToString();
- parameters["?homeLocationY"] = homeLocY.ToString();
- parameters["?homeLocationZ"] = homeLocZ.ToString();
- parameters["?homeLookAtX"] = homeLookAtX.ToString();
- parameters["?homeLookAtY"] = homeLookAtY.ToString();
- parameters["?homeLookAtZ"] = homeLookAtZ.ToString();
- parameters["?created"] = created.ToString();
- parameters["?lastLogin"] = lastlogin.ToString();
- parameters["?userInventoryURI"] = String.Empty;
- parameters["?userAssetURI"] = String.Empty;
- parameters["?profileCanDoMask"] = "0";
- parameters["?profileWantDoMask"] = "0";
- parameters["?profileAboutText"] = aboutText;
- parameters["?profileFirstText"] = firstText;
- parameters["?profileImage"] = profileImage.ToString();
- parameters["?profileFirstImage"] = firstImage.ToString();
- parameters["?webLoginKey"] = string.Empty;
- bool returnval = false;
- try
- {
- IDbCommand result = Query(sql, parameters);
- if (result.ExecuteNonQuery() == 1)
- returnval = true;
- result.Dispose();
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- return false;
- }
- //m_log.Debug("[MySQLManager]: Fetch user retval == " + returnval.ToString());
- return returnval;
- }
- /// <summary>
- /// Update user data into the database where User ID = uuid
- /// </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="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">UUID for weblogin Key</param>
- /// <returns>Success?</returns>
- public bool updateUserRow(LLUUID uuid, string username, string lastname, 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,
- LLUUID profileImage, LLUUID firstImage, LLUUID webLoginKey)
- {
- string sql = "UPDATE users SET `username` = ?username , `lastname` = ?lastname ";
- sql += ", `passwordHash` = ?passwordHash , `passwordSalt` = ?passwordSalt , ";
- sql += "`homeRegion` = ?homeRegion , `homeLocationX` = ?homeLocationX , ";
- sql += "`homeLocationY` = ?homeLocationY , `homeLocationZ` = ?homeLocationZ , ";
- sql += "`homeLookAtX` = ?homeLookAtX , `homeLookAtY` = ?homeLookAtY , ";
- sql += "`homeLookAtZ` = ?homeLookAtZ , `created` = ?created , `lastLogin` = ?lastLogin , ";
- sql += "`userInventoryURI` = ?userInventoryURI , `userAssetURI` = ?userAssetURI , ";
- sql += "`profileCanDoMask` = ?profileCanDoMask , `profileWantDoMask` = ?profileWantDoMask , ";
- sql += "`profileAboutText` = ?profileAboutText , `profileFirstText` = ?profileFirstText, ";
- sql += "`profileImage` = ?profileImage , `profileFirstImage` = ?profileFirstImage , ";
- sql += "`webLoginKey` = ?webLoginKey WHERE UUID = ?UUID";
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- parameters["?UUID"] = uuid.ToString();
- parameters["?username"] = username.ToString();
- parameters["?lastname"] = lastname.ToString();
- parameters["?passwordHash"] = passwordHash.ToString();
- parameters["?passwordSalt"] = passwordSalt.ToString();
- parameters["?homeRegion"] = homeRegion.ToString();
- parameters["?homeLocationX"] = homeLocX.ToString();
- parameters["?homeLocationY"] = homeLocY.ToString();
- parameters["?homeLocationZ"] = homeLocZ.ToString();
- parameters["?homeLookAtX"] = homeLookAtX.ToString();
- parameters["?homeLookAtY"] = homeLookAtY.ToString();
- parameters["?homeLookAtZ"] = homeLookAtZ.ToString();
- parameters["?created"] = created.ToString();
- parameters["?lastLogin"] = lastlogin.ToString();
- parameters["?userInventoryURI"] = inventoryURI;
- parameters["?userAssetURI"] = assetURI;
- parameters["?profileCanDoMask"] = "0";
- parameters["?profileWantDoMask"] = "0";
- parameters["?profileAboutText"] = aboutText;
- parameters["?profileFirstText"] = firstText;
- parameters["?profileImage"] = profileImage.ToString();
- parameters["?profileFirstImage"] = firstImage.ToString();
- parameters["?webLoginKey"] = webLoginKey.ToString();
- bool returnval = false;
- try
- {
- IDbCommand result = Query(sql, parameters);
- if (result.ExecuteNonQuery() == 1)
- returnval = true;
- result.Dispose();
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- return false;
- }
- //m_log.Debug("[MySQLManager]: update user retval == " + returnval.ToString());
- return returnval;
- }
- /// <summary>
- /// Inserts a new region into the database
- /// </summary>
- /// <param name="regiondata">The region to insert</param>
- /// <returns>Success?</returns>
- public bool insertRegion(RegionProfileData regiondata)
- {
- bool GRID_ONLY_UPDATE_NECESSARY_DATA = false;
- string sql = String.Empty;
- if (GRID_ONLY_UPDATE_NECESSARY_DATA)
- {
- sql += "INSERT INTO ";
- }
- else
- {
- sql += "REPLACE INTO ";
- }
- sql += "regions (regionHandle, regionName, uuid, regionRecvKey, regionSecret, regionSendKey, regionDataURI, ";
- sql +=
- "serverIP, serverPort, serverURI, locX, locY, locZ, eastOverrideHandle, westOverrideHandle, southOverrideHandle, northOverrideHandle, regionAssetURI, regionAssetRecvKey, ";
- // part of an initial brutish effort to provide accurate information (as per the xml region spec)
- // wrt the ownership of a given region
- // the (very bad) assumption is that this value is being read and handled inconsistently or
- // not at all. Current strategy is to put the code in place to support the validity of this information
- // and to roll forward debugging any issues from that point
- //
- // this particular section of the mod attempts to implement the commit of a supplied value
- // server for the UUID of the region's owner (master avatar). It consists of the addition of the column and value to the relevant sql,
- // as well as the related parameterization
- sql +=
- "regionAssetSendKey, regionUserURI, regionUserRecvKey, regionUserSendKey, regionMapTexture, serverHttpPort, serverRemotingPort, owner_uuid, originUUID) VALUES ";
- sql += "(?regionHandle, ?regionName, ?uuid, ?regionRecvKey, ?regionSecret, ?regionSendKey, ?regionDataURI, ";
- sql +=
- "?serverIP, ?serverPort, ?serverURI, ?locX, ?locY, ?locZ, ?eastOverrideHandle, ?westOverrideHandle, ?southOverrideHandle, ?northOverrideHandle, ?regionAssetURI, ?regionAssetRecvKey, ";
- sql +=
- "?regionAssetSendKey, ?regionUserURI, ?regionUserRecvKey, ?regionUserSendKey, ?regionMapTexture, ?serverHttpPort, ?serverRemotingPort, ?owner_uuid, ?originUUID)";
- if (GRID_ONLY_UPDATE_NECESSARY_DATA)
- {
- sql += "ON DUPLICATE KEY UPDATE serverIP = ?serverIP, serverPort = ?serverPort, serverURI = ?serverURI, owner_uuid - ?owner_uuid;";
- }
- else
- {
- sql += ";";
- }
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- parameters["?regionHandle"] = regiondata.regionHandle.ToString();
- parameters["?regionName"] = regiondata.regionName.ToString();
- parameters["?uuid"] = regiondata.UUID.ToString();
- parameters["?regionRecvKey"] = regiondata.regionRecvKey.ToString();
- parameters["?regionSecret"] = regiondata.regionSecret.ToString();
- parameters["?regionSendKey"] = regiondata.regionSendKey.ToString();
- parameters["?regionDataURI"] = regiondata.regionDataURI.ToString();
- parameters["?serverIP"] = regiondata.serverIP.ToString();
- parameters["?serverPort"] = regiondata.serverPort.ToString();
- parameters["?serverURI"] = regiondata.serverURI.ToString();
- parameters["?locX"] = regiondata.regionLocX.ToString();
- parameters["?locY"] = regiondata.regionLocY.ToString();
- parameters["?locZ"] = regiondata.regionLocZ.ToString();
- parameters["?eastOverrideHandle"] = regiondata.regionEastOverrideHandle.ToString();
- parameters["?westOverrideHandle"] = regiondata.regionWestOverrideHandle.ToString();
- parameters["?northOverrideHandle"] = regiondata.regionNorthOverrideHandle.ToString();
- parameters["?southOverrideHandle"] = regiondata.regionSouthOverrideHandle.ToString();
- parameters["?regionAssetURI"] = regiondata.regionAssetURI.ToString();
- parameters["?regionAssetRecvKey"] = regiondata.regionAssetRecvKey.ToString();
- parameters["?regionAssetSendKey"] = regiondata.regionAssetSendKey.ToString();
- parameters["?regionUserURI"] = regiondata.regionUserURI.ToString();
- parameters["?regionUserRecvKey"] = regiondata.regionUserRecvKey.ToString();
- parameters["?regionUserSendKey"] = regiondata.regionUserSendKey.ToString();
- parameters["?regionMapTexture"] = regiondata.regionMapTextureID.ToString();
- parameters["?serverHttpPort"] = regiondata.httpPort.ToString();
- parameters["?serverRemotingPort"] = regiondata.remotingPort.ToString();
- parameters["?owner_uuid"] = regiondata.owner_uuid.ToString();
- parameters["?originUUID"] = regiondata.originUUID.ToString();
- bool returnval = false;
- try
- {
- IDbCommand result = Query(sql, parameters);
- //Console.WriteLine(result.CommandText);
- // int x;
- // if ((x = result.ExecuteNonQuery()) > 0)
- // {
- // returnval = true;
- // }
- if (result.ExecuteNonQuery() > 0)
- {
- returnval = true;
- }
- result.Dispose();
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- return false;
- }
- return returnval;
- }
- /// <summary>
- /// Delete a region from the database
- /// </summary>
- /// <param name="uuid">The region to delete</param>
- /// <returns>Success?</returns>
- //public bool deleteRegion(RegionProfileData regiondata)
- public bool deleteRegion(string uuid)
- {
- bool returnval = false;
- string sql = "DELETE FROM regions WHERE uuid = ?uuid;";
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- try
- {
- parameters["?uuid"] = uuid;
- IDbCommand result = Query(sql, parameters);
- // int x;
- // if ((x = result.ExecuteNonQuery()) > 0)
- // {
- // returnval = true;
- // }
- if (result.ExecuteNonQuery() > 0)
- {
- returnval = true;
- }
- result.Dispose();
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- return false;
- }
- return returnval;
- }
- /// <summary>
- /// Creates a new agent and inserts it into the database
- /// </summary>
- /// <param name="agentdata">The agent data to be inserted</param>
- /// <returns>Success?</returns>
- public bool insertAgentRow(UserAgentData agentdata)
- {
- string sql = String.Empty;
- sql += "REPLACE INTO ";
- sql += "agents (UUID, sessionID, secureSessionID, agentIP, agentPort, agentOnline, loginTime, logoutTime, currentRegion, currentHandle, currentPos) VALUES ";
- sql += "(?UUID, ?sessionID, ?secureSessionID, ?agentIP, ?agentPort, ?agentOnline, ?loginTime, ?logoutTime, ?currentRegion, ?currentHandle, ?currentPos);";
- Dictionary<string, string> parameters = new Dictionary<string, string>();
- parameters["?UUID"] = agentdata.ProfileID.ToString();
- parameters["?sessionID"] = agentdata.SessionID.ToString();
- parameters["?secureSessionID"] = agentdata.SecureSessionID.ToString();
- parameters["?agentIP"] = agentdata.AgentIP.ToString();
- parameters["?agentPort"] = agentdata.AgentPort.ToString();
- parameters["?agentOnline"] = (agentdata.AgentOnline == true) ? "1" : "0";
- parameters["?loginTime"] = agentdata.LoginTime.ToString();
- parameters["?logoutTime"] = agentdata.LogoutTime.ToString();
- parameters["?currentRegion"] = agentdata.Region.ToString();
- parameters["?currentHandle"] = agentdata.Handle.ToString();
- parameters["?currentPos"] = "<" + ((int)agentdata.Position.X).ToString() + "," + ((int)agentdata.Position.Y).ToString() + "," + ((int)agentdata.Position.Z).ToString() + ">";
- bool returnval = false;
- try
- {
- IDbCommand result = Query(sql, parameters);
- //Console.WriteLine(result.CommandText);
- // int x;
- // if ((x = result.ExecuteNonQuery()) > 0)
- // {
- // returnval = true;
- // }
- if (result.ExecuteNonQuery() > 0)
- {
- returnval = true;
- }
- result.Dispose();
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- return false;
- }
- return returnval;
- }
- /// <summary>
- /// Create (or replace if existing) an avatar appearence
- /// </summary>
- /// <param name="appearance"></param>
- /// <returns>Succes?</returns>
- public bool insertAppearanceRow(AvatarAppearance appearance)
- {
- string sql = String.Empty;
- sql += "REPLACE INTO ";
- sql += "avatarappearance (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)";
- bool returnval = false;
-
- // we want to send in byte data, which means we can't just pass down strings
- try {
- MySqlCommand cmd = (MySqlCommand) dbcon.CreateCommand();
- cmd.CommandText = sql;
- cmd.Parameters.AddWithValue("?owner", appearance.Owner.ToString());
- cmd.Parameters.AddWithValue("?serial", appearance.Serial);
- cmd.Parameters.AddWithValue("?visual_params", appearance.VisualParams);
- cmd.Parameters.AddWithValue("?texture", appearance.Texture.ToBytes());
- cmd.Parameters.AddWithValue("?avatar_height", appearance.AvatarHeight);
- cmd.Parameters.AddWithValue("?body_item", appearance.BodyItem.ToString());
- cmd.Parameters.AddWithValue("?body_asset", appearance.BodyAsset.ToString());
- cmd.Parameters.AddWithValue("?skin_item", appearance.SkinItem.ToString());
- cmd.Parameters.AddWithValue("?skin_asset", appearance.SkinAsset.ToString());
- cmd.Parameters.AddWithValue("?hair_item", appearance.HairItem.ToString());
- cmd.Parameters.AddWithValue("?hair_asset", appearance.HairAsset.ToString());
- cmd.Parameters.AddWithValue("?eyes_item", appearance.EyesItem.ToString());
- cmd.Parameters.AddWithValue("?eyes_asset", appearance.EyesAsset.ToString());
- cmd.Parameters.AddWithValue("?shirt_item", appearance.ShirtItem.ToString());
- cmd.Parameters.AddWithValue("?shirt_asset", appearance.ShirtAsset.ToString());
- cmd.Parameters.AddWithValue("?pants_item", appearance.PantsItem.ToString());
- cmd.Parameters.AddWithValue("?pants_asset", appearance.PantsAsset.ToString());
- cmd.Parameters.AddWithValue("?shoes_item", appearance.ShoesItem.ToString());
- cmd.Parameters.AddWithValue("?shoes_asset", appearance.ShoesAsset.ToString());
- cmd.Parameters.AddWithValue("?socks_item", appearance.SocksItem.ToString());
- cmd.Parameters.AddWithValue("?socks_asset", appearance.SocksAsset.ToString());
- cmd.Parameters.AddWithValue("?jacket_item", appearance.JacketItem.ToString());
- cmd.Parameters.AddWithValue("?jacket_asset", appearance.JacketAsset.ToString());
- cmd.Parameters.AddWithValue("?gloves_item", appearance.GlovesItem.ToString());
- cmd.Parameters.AddWithValue("?gloves_asset", appearance.GlovesAsset.ToString());
- cmd.Parameters.AddWithValue("?undershirt_item", appearance.UnderShirtItem.ToString());
- cmd.Parameters.AddWithValue("?undershirt_asset", appearance.UnderShirtAsset.ToString());
- cmd.Parameters.AddWithValue("?underpants_item", appearance.UnderPantsItem.ToString());
- cmd.Parameters.AddWithValue("?underpants_asset", appearance.UnderPantsAsset.ToString());
- cmd.Parameters.AddWithValue("?skirt_item", appearance.SkirtItem.ToString());
- cmd.Parameters.AddWithValue("?skirt_asset", appearance.SkirtAsset.ToString());
-
- if (cmd.ExecuteNonQuery() > 0)
- returnval = true;
- cmd.Dispose();
- }
- catch (Exception e)
- {
- m_log.Error(e.ToString());
- return false;
- }
- return returnval;
- }
- }
- }
|