using System.Collections.Generic;
using Holo.Virtual.Item;
using System.Data;
using System;
using System.Text;
namespace Holo.Source.Virtual.Users.ItemManagement
{
class HandItemManager
{
///
/// The user this handitem manager belongs to
///
private int userID;
///
/// The list of items, with the ID as key field
///
private Dictionary Items;
private List itemIDsAdded;
private List itemIDsRemoved;
private List itemIDsStart;
///
/// The list of handitems, can be approached as an array
///
private List handItems;
///
/// Generates the users new list of items
///
/// The items in Datatable format
public HandItemManager(DataTable Items, int userID)
{
this.Items = new Dictionary();
handItems = new List();
itemIDsAdded = new List();
itemIDsRemoved = new List();
itemIDsStart = new List();
this.userID = userID;
makeItemList(Items);
}
///
/// Generates the list of items
///
/// the item list in DataTable format
public void makeItemList(DataTable itemTable)
{
genericItem toAdd;
string Var;
int templateID;
int itemID;
string wallPos;
foreach (DataRow dRow in itemTable.Rows)
{
Var = dRow["var"].ToString();
templateID = Convert.ToInt32(dRow["tid"]);
itemID = Convert.ToInt32(dRow["id"]);
wallPos = dRow["wallpos"].ToString();
toAdd = new genericItem(itemID, templateID, Var, wallPos);
Items.Add(itemID, toAdd);
handItems.Add(toAdd);
itemIDsStart.Add(itemID);
}
}
///
/// returns the item
///
///
///
public genericItem getItem(int itemID)
{
if (Items.ContainsKey(itemID))
return Items[itemID];
else
return null;
}
///
/// Looks if a user has an item or not
///
/// the ID of the item
/// True if it has an item, False if it doesn't
public bool hasItem(int itemID)
{
return Items.ContainsKey(itemID);
}
///
/// Adds a list of items
///
/// The list which should be added
public void addItemList(List toAdd)
{
foreach (genericItem toadd in toAdd)
{
addItem(toadd);
}
}
///
/// Adds an item to the list of items to delete from the database.
///
/// The item which is beeing deleted
private void deleteDatabaseEntry(genericItem item)
{
if (itemIDsAdded.Contains(item.ID))
itemIDsAdded.Remove(item.ID);
if (itemIDsRemoved.Contains(item.ID))
return;
itemIDsRemoved.Add(item.ID);
}
///
/// Adds an item to the list of "inserts" for the database
///
/// The item which is beeing added
private void addDatabaseEntry(genericItem item)
{
if (itemIDsRemoved.Contains(item.ID))
itemIDsRemoved.Remove(item.ID);
if (itemIDsStart.Contains(item.ID))
return;
if (itemIDsAdded.Contains(item.ID))
return;
itemIDsAdded.Add(item.ID);
}
///
/// Clears all items in this hand item manager
///
public void clearItems(bool purge)
{
if (purge)
{
foreach (genericItem item in Items.Values)
{
deleteDatabaseEntry(item);
}
}
Items.Clear();
handItems.Clear();
}
///
/// adds an item to the collection
///
/// The item to add
public void addItem(genericItem item)
{
if (!Items.ContainsKey(item.ID))
{
Items.Add(item.ID, item);
handItems.Add(item);
addDatabaseEntry(item);
}
}
///
/// Updates an given item
///
/// The item that needed the update
public void updateItem(genericItem item)
{
if (Items.ContainsKey(item.ID))
{
removeItem(item.ID);
}
addItem(item);
}
///
/// removes an item in the item manager
///
/// The id of the item
/// The item that was removed
public genericItem removeItem(int itemID)
{
if (Items.ContainsKey(itemID))
{
genericItem backupItem = Items[itemID];
Items.Remove(itemID);
deleteDatabaseEntry(backupItem);
if (handItems.Contains(backupItem))
handItems.Remove(backupItem);
return backupItem;
}
else
{
return null;
}
}
///
/// Gets a handitem at the desired location
///
/// The location of the item
/// A Handitem
public genericItem getHandItem(int location)
{
if (location < handItems.Count)
{
return handItems[location];
}
return null;
}
///
/// Returns the length of the list of items
///
/// The amount of items
public int handLength()
{
return handItems.Count;
}
///
/// Destroys this instance.
///
internal void destroy()
{
clearItems(false);
handItems = null;
Items = null;
doDatabaseUpdate(false);
}
internal void update()
{
doDatabaseUpdate(true);
}
///
/// Does an database update
///
internal void doDatabaseUpdate(bool update)
{
lock (this)
{
if (itemIDsAdded.Count > 0 || itemIDsRemoved.Count > 0)
{
StringBuilder sb = new StringBuilder();
if (itemIDsAdded.Count > 0)
{
sb.Append("INSERT INTO user_furniture (user_id,furniture_id) VALUES ");
foreach (int id in itemIDsAdded)
{
sb.Append("('" + userID + "','" + id + "'), ");
}
sb.Remove(sb.Length - 2, 2);
sb.Append(";\r\n");
}
if (itemIDsRemoved.Count > 0)
{
sb.Append("DELETE FROM user_furniture WHERE ");
foreach (int id in itemIDsRemoved)
{
sb.Append("(user_id = '" + userID + "' AND furniture_id = '" + id + "') OR ");
}
sb.Remove(sb.Length - 3, 3);
}
using (Ion.Storage.DatabaseClient dbClient = Eucalypt.dbManager.GetClient())
{
dbClient.runQuery(sb.ToString());
}
if (update)
{
foreach (int i in itemIDsAdded)
{
itemIDsStart.Add(i);
}
foreach (int i in itemIDsRemoved)
{
itemIDsStart.Remove(i);
}
}
itemIDsAdded.Clear();
itemIDsRemoved.Clear();
}
}
}
///
/// Returns all items of this instance
///
///
internal List getAllItems()
{
return handItems;
}
}
}