package com.planet_ink.coffee_mud.core.database;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
import com.planet_ink.coffee_mud.core.database.DBConnector.DBPreparedBatchEntry;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.sql.*;
import java.util.*;
/**
* Portions Copyright (c) 2003 Jeremy Vyska
* Portions Copyright (c) 2004-2016 Bo Zimmerman
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class ClanLoader
{
protected DBConnector DB=null;
public ClanLoader(DBConnector newDB)
{
DB=newDB;
}
protected int currentRecordPos=1;
protected int recordCount=0;
public void updateBootStatus(String loading)
{
CMProps.setUpLowVar(CMProps.Str.MUDSTATUS,"Booting: Loading "+loading+" ("+currentRecordPos+" of "+recordCount+")");
}
public void DBRead()
{
DBConnection D=null;
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCLAN");
recordCount=DB.getRecordCount(D,R);
final Map<String,Clan> clans=new Hashtable<String,Clan>();
while(R.next())
{
currentRecordPos=R.getRow();
final String name=DBConnections.getRes(R,"CMCLID");
final Clan C=(Clan)CMClass.getCommon("DefaultClan");
C.setName(name);
C.setPremise(DBConnections.getRes(R,"CMDESC"));
C.setAcceptanceSettings(DBConnections.getRes(R,"CMACPT"));
C.setPolitics(DBConnections.getRes(R,"CMPOLI"));
C.setRecall(DBConnections.getRes(R,"CMRCLL"));
C.setDonation(DBConnections.getRes(R,"CMDNAT"));
C.setStatus(CMath.s_int(DBConnections.getRes(R, "CMSTAT")));
C.setMorgue(DBConnections.getRes(R,"CMMORG"));
C.setTrophies(CMath.s_int(DBConnections.getRes(R, "CMTROP")));
CMLib.clans().addClan(C);
clans.put(C.clanID(), C);
updateBootStatus("Clans");
}
R.close();
R=D.query("SELECT * FROM CMCLIT");
while(R.next())
{
final String clanID=DBConnections.getRes(R,"CMCLID");
final Clan C=clans.get(clanID);
if(C==null)
Log.errOut("Clan","Couldn't find clan '"+clanID+"'");
else
{
final String itemID=DBConnections.getRes(R,"CMITID");
final Item newItem=CMClass.getItem(itemID);
if(newItem==null)
Log.errOut("Clan","Couldn't find item '"+itemID+"'");
else
{
String text=DBConnections.getResQuietly(R,"CMITTX");
int roomX;
if(text.startsWith("<ROOM") && ((roomX=text.indexOf("/>"))>=0))
{
final String roomXML=text.substring(0,roomX+2);
text=text.substring(roomX+2);
newItem.setMiscText(text);
final List<XMLLibrary.XMLTag> xml=CMLib.xml().parseAllXML(roomXML);
if((xml!=null)&&(xml.size()>0))
{
final String roomID=xml.get(0).parms().get("ID");
final long expirationDate=CMath.s_long(xml.get(0).parms().get("EXPIRE"));
if(roomID.startsWith("SPACE.") && (newItem instanceof SpaceObject))
CMLib.map().addObjectToSpace((SpaceObject)newItem,CMParms.toLongArray(CMParms.parseCommas(roomID.substring(6), true)));
else
{
final Room itemR=CMLib.map().getRoom(roomID);
if(itemR!=null)
{
if(newItem instanceof BoardableShip)
((BoardableShip)newItem).dockHere(itemR);
else
itemR.addItem(newItem);
newItem.setExpirationDate(expirationDate);
}
}
}
}
else
{
newItem.setMiscText(text);
}
newItem.setUsesRemaining((int)DBConnections.getLongRes(R,"CMITUR"));
newItem.basePhyStats().setLevel((int)DBConnections.getLongRes(R,"CMITLV"));
newItem.basePhyStats().setAbility((int)DBConnections.getLongRes(R,"CMITAB"));
newItem.basePhyStats().setHeight((int)DBConnections.getLongRes(R,"CMHEIT"));
newItem.recoverPhyStats();
CMLib.map().registerWorldObjectLoaded(null, null, newItem);
C.getExtItems().addItem(newItem);
}
}
updateBootStatus("Clan Items");
}
}
catch(final Exception sqle)
{
Log.errOut("Clan",sqle);
}
finally
{
DB.DBDone(D);
}
// log comment
}
public void DBUpdate(Clan C)
{
final String sql="UPDATE CMCLAN SET "
+"CMDESC='"+C.getPremise()+"',"
+"CMACPT='"+C.getAcceptanceSettings()+"',"
+"CMPOLI=?,"
+"CMRCLL='"+C.getRecall()+"',"
+"CMDNAT='"+C.getDonation()+"',"
+"CMSTAT="+C.getStatus()+","
+"CMMORG='"+C.getMorgue()+"',"
+"CMTROP="+C.getTrophies()+""
+" WHERE CMCLID='"+C.clanID()+"'";
DB.updateWithClobs(sql, C.getPolitics());
}
protected String getDBItemUpdateString(final Clan C, final Item thisItem)
{
CMLib.catalog().updateCatalogIntegrity(thisItem);
final String container=((thisItem.container()!=null)?(""+thisItem.container()):"");
return "INSERT INTO CMCLIT (CMCLID, CMITNM, CMITID, CMITTX, CMITLO, CMITWO, "
+"CMITUR, CMITLV, CMITAB, CMHEIT"
+") values ('"+C.clanID()+"','"+(thisItem)+"','"+thisItem.ID()+"',?,'"+container+"',"+thisItem.rawWornCode()+","
+thisItem.usesRemaining()+","+thisItem.basePhyStats().level()+","+thisItem.basePhyStats().ability()+","
+thisItem.basePhyStats().height()+")";
}
private List<DBPreparedBatchEntry> getDBItemUpdateStrings(final Clan C)
{
final HashSet<String> done=new HashSet<String>();
final List<DBPreparedBatchEntry> strings=new LinkedList<DBPreparedBatchEntry>();
final ItemCollection coll=C.getExtItems();
final List<Item> finalCollection=new LinkedList<Item>();
final List<Item> extraItems=new LinkedList<Item>();
for(int i=coll.numItems()-1;i>=0;i--)
{
final Item thisItem=coll.getItem(i);
if((thisItem!=null)&&(!thisItem.amDestroyed()))
{
final Item cont=thisItem.ultimateContainer(null);
if(cont.owner() instanceof Room)
finalCollection.add(thisItem);
}
}
for(final Item thisItem : finalCollection)
{
if(thisItem instanceof Container)
{
final List<Item> contents=((Container)thisItem).getDeepContents();
for(final Item I : contents)
if(!finalCollection.contains(I))
extraItems.add(I);
}
}
finalCollection.addAll(extraItems);
for(final Item thisItem : finalCollection)
{
if(!done.contains(""+thisItem))
{
CMLib.catalog().updateCatalogIntegrity(thisItem);
final Item cont=thisItem.ultimateContainer(null);
final String sql=getDBItemUpdateString(C,thisItem);
final String roomID=((cont.owner()==null)&&(thisItem instanceof SpaceObject)&&(CMLib.map().isObjectInSpace((SpaceObject)thisItem)))?
("SPACE."+CMParms.toListString(((SpaceObject)thisItem).coordinates())):CMLib.map().getExtendedRoomID((Room)cont.owner());
final String text="<ROOM ID=\""+roomID+"\" EXPIRE="+thisItem.expirationDate()+" />"+thisItem.text();
strings.add(new DBPreparedBatchEntry(sql,text));
done.add(""+thisItem);
}
}
return strings;
}
public void DBUpdateItems(final Clan C)
{
if((C==null)||(C.clanID()==null)||(C.clanID().length()==0))
return;
final List<DBPreparedBatchEntry> statements=new LinkedList<DBPreparedBatchEntry>();
statements.add(new DBPreparedBatchEntry("DELETE FROM CMCLIT WHERE CMCLID='"+C.clanID()+"'"));
statements.addAll(getDBItemUpdateStrings(C));
DB.updateWithClobs(statements);
}
public void DBCreate(Clan C)
{
if(C.clanID().length()==0)
return;
final String sql="INSERT INTO CMCLAN ("
+"CMCLID,"
+"CMTYPE,"
+"CMDESC,"
+"CMACPT,"
+"CMPOLI,"
+"CMRCLL,"
+"CMDNAT,"
+"CMSTAT,"
+"CMMORG,"
+"CMTROP"
+") values ("
+"'"+C.clanID()+"',"
+"0,"
+"'"+C.getPremise()+"',"
+"'"+C.getAcceptanceSettings()+"',"
+"?,"
+"'"+C.getRecall()+"',"
+"'"+C.getDonation()+"',"
+""+C.getStatus()+","
+"'"+C.getMorgue()+"',"
+""+C.getTrophies()
+")";
DB.updateWithClobs(sql, C.getPolitics());
}
public void DBDelete(Clan C)
{
DBConnection D=null;
try
{
D=DB.DBFetch();
D.update("DELETE FROM CMCLAN WHERE CMCLID='"+C.clanID()+"'",0);
D.update("DELETE FROM CMCLIT WHERE CMCLID='"+C.clanID()+"'",0);
D.update("DELETE FROM CMCHCL WHERE CMCLAN='"+C.clanID()+"'",0);
}
catch(final Exception sqle)
{
Log.errOut("Clan",sqle);
}
finally
{
DB.DBDone(D);
}
}
}