コード例 #1
0
ファイル: Storage.cs プロジェクト: Invertika/server
        public void flush(ISL.Server.Account.Account account)
        {
            //assert(account.getID() >= 0);

            #if !DEBUG
            try
            {
            #endif
            mDb.StartTransaction();
            //PerformTransaction transaction(mDb);

            // Update the account
            string sqlUpdateAccountTable=String.Format("UPDATE {0} SET username=\"{1}\", password=\"{2}\", email=\"{3}\", level=\"{4}\", lastlogin=\"{5}\" WHERE id = {6}",
                                                           ACCOUNTS_TBL_NAME, account.getName(), account.getPassword(), account.getEmail(), account.getLevel(), account.getLastLogin(), account.getID());
            mDb.ExecuteNonQuery(sqlUpdateAccountTable);

            // Get the list of characters that belong to this account.
            Dictionary<uint, Character> characters=account.getCharacters();

            // Insert or update the characters.
            foreach(KeyValuePair<uint, Character> pair in characters)
            {
                Character character=pair.Value;

                if(character.getDatabaseID()>=0)
                {
                    updateCharacter(character);
                }
                else
                {
                    // Insert the character
                    // This assumes that the characters name has been checked for
                    // uniqueness
                    string sqlInsertCharactersTable=String.Format("insert into {0} (user_id, name, gender, hair_style, hair_color, level, char_pts, correct_pts, x, y, map_id, slot) values (", CHARACTERS_TBL_NAME);
                    sqlInsertCharactersTable+=String.Format("{0}, \"{1}\", {2}, {3}, {4}, ", account.getID(), character.getName(), character.getGender(), (int)character.getHairStyle(), (int)character.getHairColor());
                    sqlInsertCharactersTable+=String.Format("{0}, {1}, {2}, ", (int)character.getLevel(), character.getCharacterPoints(), character.getCorrectionPoints());
                    sqlInsertCharactersTable+=String.Format("{0}, {1}, {2}, {3});", character.getPosition().x, character.getPosition().y, character.getMapId(), character.getCharacterSlot());

                    //mDb.ExecuteNonQuery(sqlInsertCharactersTable);
                    mDb.ExecuteNonQuery(sqlInsertCharactersTable);

                    //charID ermitteln
                    string sqlGetCharId=String.Format("SELECT id FROM {0} WHERE user_id={1} AND name='{2}'", CHARACTERS_TBL_NAME, account.getID(), character.getName());
                    DataTable tmp=mDb.ExecuteQuery(sqlGetCharId);
                    int lastID=Convert.ToInt32(tmp.Rows[0]["id"]);

                    // Update the character ID.
                    character.setDatabaseID(lastID);

                    // Update all attributes.
                    foreach(KeyValuePair<uint, AttributeValue> attributePair in character.mAttributes)
                    {
                        updateAttribute(character.getDatabaseID(), attributePair.Key, attributePair.Value.@base, attributePair.Value.modified);
                    }

                    // Update the characters skill
                    foreach(KeyValuePair<int, int> experiencePair in character.mExperience)
                    {
                        updateExperience(character.getDatabaseID(), experiencePair.Key, experiencePair.Value);
                    }
                }
            }

            // Existing characters in memory have been inserted
            // or updated in database.
            // Now, let's remove those who are no more in memory from database.
            string sqlSelectNameIdCharactersTable=String.Format("select name, id from {0} where user_id = '{1}';", CHARACTERS_TBL_NAME, account.getID());
            DataTable charInMemInfo=mDb.ExecuteQuery(sqlSelectNameIdCharactersTable);

            // We compare chars from memory and those existing in db,
            // and delete those not in mem but existing in db.
            bool charFound;
            for(uint i = 0;i < charInMemInfo.Rows.Count;++i) // In database
            {
                charFound=false;

                foreach(Character characterInMemory in characters.Values) // In memory
                {
                    if(charInMemInfo.Rows[(int)i][0].ToString()==characterInMemory.getName())
                    {
                        charFound=true;
                        break;
                    }
                }

                if(!charFound)
                {
                    // The char is in db but not in memory,
                    // it will be removed from database.
                    // We store the id of the char to delete,
                    // because as deleted, the RecordSet is also emptied,
                    // and that creates an error.
                    uint charId=(uint)(charInMemInfo.Rows[(int)i][1]);
                    delCharacter((int)charId);
                }
            }

            mDb.CommitTransaction();

            #if !DEBUG
            }
            catch(Exception e)
            {
                Logger.Write(LogLevel.Error, "SQL query failure: {0}", e);
            }
            #endif
        }
コード例 #2
0
ファイル: Storage.cs プロジェクト: Invertika/server
        void delAccount(ISL.Server.Account.Account account)
        {
            // Sync the account info into the database.
            flush(account);

            string sql=String.Format("DELETE FROM {0} WHERE id = '{1}';", ACCOUNTS_TBL_NAME, account.getID());
            mDb.ExecuteNonQuery(sql);

            // Remove the account's characters.
            account.setCharacters(account.getCharacters()); //TODO Überprüfen ob das so funktioniert?
        }
コード例 #3
0
ファイル: Storage.cs プロジェクト: Invertika/server
        Character getCharacterBySQL(ISL.Server.Account.Account owner)
        {
            Character character=null;

            string sql=String.Format("SELECT * FROM {0} WHERE user_id = {1}", CHARACTERS_TBL_NAME, owner.getID());
            DataTable charInfo=mDb.ExecuteQuery(sql);

            // If the character is not even in the database then
            // we have no choice but to return nothing.
            if(charInfo.Rows.Count==0)
                return null;

            character=new Character(charInfo.Rows[0]["name"].ToString(), Convert.ToInt32(charInfo.Rows[0]["id"]));
            character.setGender(Convert.ToInt32(charInfo.Rows[0]["gender"]));
            character.setHairStyle(Convert.ToInt32(charInfo.Rows[0]["hair_style"]));
            character.setHairColor(Convert.ToInt32(charInfo.Rows[0]["hair_color"]));
            character.setLevel(Convert.ToInt32(charInfo.Rows[0]["level"]));
            character.setCharacterPoints(Convert.ToInt32(charInfo.Rows[0]["char_pts"]));
            character.setCorrectionPoints(Convert.ToInt32(charInfo.Rows[0]["correct_pts"]));

            Point pos=new Point(Convert.ToInt32(charInfo.Rows[0]["x"]), Convert.ToInt32(charInfo.Rows[0]["y"]));
            character.setPosition(pos);

            int mapId=Convert.ToInt32(charInfo.Rows[0]["map_id"]);
            if(mapId>0)
            {
                character.setMapId(mapId);
            }
            else
            {
                // Set character to default map and one of the default location
                // Default map is to be 1, as not found return value will be 0.
                character.setMapId(Configuration.getValue("char_defaultMap", 1));
            }

            character.setCharacterSlot(Convert.ToUInt32(charInfo.Rows[0]["slot"]));

            // Fill the account-related fields. Last step, as it may require a new
            // SQL query.
            if(owner!=null)
            {
                character.setAccount(owner);
            }
            else
            {
                int id=Convert.ToInt32(charInfo.Rows[0]["user_id"]);
                character.setAccountID(id);

                string s=String.Format("SELECT level FROM {0} WHERE id = '{1}';", ACCOUNTS_TBL_NAME, id);
                DataTable levelInfo=mDb.ExecuteQuery(s);

                character.setAccountLevel(Convert.ToInt32(levelInfo.Rows[0]["level"]), true);
            }

            // Load attributes."
            string s2=String.Format("SELECT attr_id, attr_base, attr_mod FROM {0} WHERE char_id = {1};", CHAR_ATTR_TBL_NAME, character.getDatabaseID());
            DataTable attrInfo=mDb.ExecuteQuery(s2);

            if(attrInfo.Rows.Count>0)
            {
                uint nRows=(uint)attrInfo.Rows.Count;

                for(uint row = 0;row < nRows;++row)
                {
                    uint id=Convert.ToUInt32(charInfo.Rows[0]["attr_id"]);
                    character.setAttribute(id, Convert.ToDouble(charInfo.Rows[0]["attr_base"]));
                    character.setModAttribute(id, Convert.ToDouble(charInfo.Rows[0]["attr_mod"]));
                }
            }

            // Load the skills of the char from CHAR_SKILLS_TBL_NAME
            string s3=String.Format("SELECT status_id, status_time FROM {0} WHERE char_id = {1};", CHAR_STATUS_EFFECTS_TBL_NAME, character.getDatabaseID());
            DataTable skillInfo=mDb.ExecuteQuery(s3);

            if(skillInfo.Rows.Count>0)
            {
                uint nRows=(uint)skillInfo.Rows.Count;
                for(uint row = 0;row < nRows;row++)
                {
                    character.setExperience(
                            Convert.ToInt32(skillInfo.Rows[0]["status_id"]),  // Skill Id
                            Convert.ToInt32(skillInfo.Rows[0]["status_time"])); // Experience
                }
            }

            // Load the status effect
            string s4=String.Format("SELECT status_id, status_time FROM {0} WHERE char_id = {1};", CHAR_STATUS_EFFECTS_TBL_NAME, character.getDatabaseID());
            DataTable statusInfo=mDb.ExecuteQuery(s4);

            if(statusInfo.Rows.Count>0)
            {
                uint nRows=(uint)statusInfo.Rows.Count;
                for(uint row = 0;row < nRows;row++)
                {
                    character.applyStatusEffect(
                            Convert.ToInt32(statusInfo.Rows[0]["status_id"]), // Status Id
                            Convert.ToInt32(statusInfo.Rows[0]["status_time"])); // Time
                }
            }

            // Load the kill stats
            string s5=String.Format("SELECT monster_id, kills FROM {0} WHERE char_id = {1};", CHAR_KILL_COUNT_TBL_NAME, character.getDatabaseID());
            DataTable killsInfo=mDb.ExecuteQuery(s5);

            if(killsInfo.Rows.Count>0)
            {
                uint nRows=(uint)killsInfo.Rows.Count;
                for(uint row = 0;row < nRows;row++)
                {
                    character.setKillCount(
                            Convert.ToInt32(killsInfo.Rows[0]["monster_id"]), // MonsterID
                            Convert.ToInt32(killsInfo.Rows[0]["kills"])); // Kills
                }
            }

            // Load the special status
            string s6=String.Format("SELECT special_id FROM {0} WHERE char_id = {1};", CHAR_SPECIALS_TBL_NAME, character.getDatabaseID());
            DataTable specialsInfo=mDb.ExecuteQuery(s6);

            if(specialsInfo.Rows.Count>0)
            {
                uint nRows=(uint)specialsInfo.Rows.Count;
                for(uint row = 0;row < nRows;row++)
                {
                    character.giveSpecial(Convert.ToInt32(specialsInfo.Rows[0]["special_id"]));
                }
            }

            Possessions poss=character.getPossessions();

            string s7=String.Format("SELECT slot_type, item_id, item_instance FROM {0} WHERE owner_id = '{1}' ORDER BY slot_type desc;", CHAR_EQUIPS_TBL_NAME, character.getDatabaseID());
            DataTable equipInfo=mDb.ExecuteQuery(s7);

            Dictionary< uint, EquipmentItem > equipData=new Dictionary<uint, EquipmentItem>();

            if(equipInfo.Rows.Count>0)
            {
                EquipmentItem equipItem=new EquipmentItem();

                for(int k = 0, size = equipInfo.Rows.Count;k < size;++k)
                {
                    equipItem.itemId=Convert.ToUInt32(equipInfo.Rows[0]["item_id"]);
                    equipItem.itemInstance=Convert.ToUInt32(equipInfo.Rows[0]["item_instance"]);
                    equipData.Add(Convert.ToUInt32(equipInfo.Rows[0]["slot_type"]), equipItem);
                }
            }

            poss.setEquipment(equipData);

            string s8=String.Format("SELECT * FROM {0} WHERE owner_id = '{1}' ORDER by slot ASC", INVENTORIES_TBL_NAME, character.getDatabaseID());
            DataTable itemInfo=mDb.ExecuteQuery(s8);

            Dictionary<uint, InventoryItem > inventoryData=new Dictionary<uint, InventoryItem>();

            if(itemInfo.Rows.Count>0)
            {
                for(int k = 0, size = itemInfo.Rows.Count;k < size;++k)
                {
                    InventoryItem item=new InventoryItem();
                    ushort slot=Convert.ToUInt16(itemInfo.Rows[0]["slot"]);
                    item.itemId=Convert.ToUInt32(itemInfo.Rows[0]["class_id"]);
                    item.amount=Convert.ToUInt32(itemInfo.Rows[0]["amount"]);
                    inventoryData[slot]=item;
                }
            }

            poss.setInventory(inventoryData);

            return character;
        }
コード例 #4
0
ファイル: Storage.cs プロジェクト: Invertika/server
 public void updateLastLogin(ISL.Server.Account.Account account)
 {
     string sql=String.Format("UPDATE {0} SET lastlogin = '******' WHERE id = '{2}';", ACCOUNTS_TBL_NAME, account.getLastLogin(), account.getID());
     mDb.ExecuteNonQuery(sql);
 }