Beispiel #1
0
bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList<Spawn2*> &spawn2_list, int16 version, uint32 repopdelay) {
	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

	const char *zone_name = database.GetZoneName(zoneid);

	MakeAnyLenString(&query, "SELECT id, spawngroupID, x, y, z, heading, respawntime, variance, pathgrid, _condition, cond_value, enabled, animation FROM spawn2 WHERE zone='%s' AND version=%u", zone_name, version);
	if (RunQuery(query, strlen(query), errbuf, &result))
	{
		safe_delete_array(query);
		while((row = mysql_fetch_row(result)))
		{
			Spawn2* newSpawn = 0;

			bool perl_enabled = atoi(row[11]) == 1 ? true : false;
			uint32 spawnLeft = (GetSpawnTimeLeft(atoi(row[0]), zone->GetInstanceID()) * 1000);
			newSpawn = new Spawn2(atoi(row[0]), atoi(row[1]), atof(row[2]), atof(row[3]), atof(row[4]), atof(row[5]), atoi(row[6]), atoi(row[7]), spawnLeft, atoi(row[8]), atoi(row[9]), atoi(row[10]), perl_enabled, (EmuAppearance)atoi(row[12]));
			spawn2_list.Insert( newSpawn );
		}
		mysql_free_result(result);
	}
	else
	{
		LogFile->write(EQEMuLog::Error, "Error in PopulateZoneLists query '%s': %s", query, errbuf);
		safe_delete_array(query);
		return false;
	}

	return true;
}
Beispiel #2
0
Ground_Spawns* ZoneDatabase::LoadGroundSpawns(uint32 zone_id, int16 version, Ground_Spawns* gs){
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

	if (RunQuery(query, MakeAnyLenString(&query, "SELECT max_x,max_y,max_z,min_x,min_y,heading,name,item,max_allowed,respawn_timer from ground_spawns where zoneid=%i and (version=%u OR version=-1) limit 50", zone_id, version), errbuf, &result))
	{
		safe_delete_array(query);
		int i=0;
		while( (row=mysql_fetch_row(result) ) ) {
			gs->spawn[i].max_x=atof(row[0]);
			gs->spawn[i].max_y=atof(row[1]);
			gs->spawn[i].max_z=atof(row[2]);
			gs->spawn[i].min_x=atof(row[3]);
			gs->spawn[i].min_y=atof(row[4]);
			gs->spawn[i].heading=atof(row[5]);
			strcpy(gs->spawn[i].name,row[6]);
			gs->spawn[i].item=atoi(row[7]);
			gs->spawn[i].max_allowed=atoi(row[8]);
			gs->spawn[i].respawntimer=atoi(row[9]);
			i++;
		}
		mysql_free_result(result);
	}
	else {
		std::cerr << "Error in LoadGroundSpawns query '" << query << "' " << errbuf << std::endl;
		safe_delete_array(query);
	}
	return gs;
}
Beispiel #3
0
bool WorldDatabase::GetCharacterLevel(const char *name, int &level)
{
	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

	if(RunQuery(query, MakeAnyLenString(&query, "SELECT level FROM character_ WHERE name='%s'", name), errbuf, &result))
	{
		if(row = mysql_fetch_row(result))
		{
			level = atoi(row[0]);
			mysql_free_result(result);
			safe_delete_array(query);
			return true;
		}
		mysql_free_result(result);
	}
	else
	{
		LogFile->write(EQEMuLog::Error, "WorldDatabase::GetCharacterLevel: %s", errbuf);
	}
	safe_delete_array(query);
	return false;
}
Beispiel #4
0
bool WorldDatabase::LoadCharacterCreateCombos() {
	character_create_race_class_combos.clear();

	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;
	if(RunQuery(query, MakeAnyLenString(&query, "select * from char_create_combinations order by race, class, deity, start_zone"), errbuf, &result)) {
		safe_delete_array(query);
		while(row = mysql_fetch_row(result)) {
			RaceClassCombos combo;
			int r = 0;
			combo.AllocationIndex = atoi(row[r++]);
			combo.Race = atoi(row[r++]);
			combo.Class = atoi(row[r++]);
			combo.Deity = atoi(row[r++]);
			combo.Zone = atoi(row[r++]);
			combo.ExpansionRequired = atoi(row[r++]);
			character_create_race_class_combos.push_back(combo);
		}
		mysql_free_result(result);
	} else {
		safe_delete_array(query);
		return false;
	}

	return true;
}
Beispiel #5
0
bool Database::LoadChatChannels() {

	_log(UCS__INIT, "Loading chat channels from the database.");

	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

	if (!RunQuery(query,MakeAnyLenString(&query, "select `name`,`owner`,`password`, `minstatus` from `chatchannels`"),errbuf,&result)){

		_log(UCS__ERROR, "Failed to load channels. %s %s", query, errbuf);
		safe_delete_array(query);

		return false;
	}

	safe_delete_array(query);

	while((row = mysql_fetch_row(result))) {

		std::string ChannelName = row[0];
		std::string ChannelOwner = row[1];
		std::string ChannelPassword = row[2];

		ChannelList->CreateChannel(ChannelName, ChannelOwner, ChannelPassword, true, atoi(row[3]));
	}

	mysql_free_result(result);

	return true;
}
Beispiel #6
0
int32 ZoneDatabase::GetDoorsDBCountPlusOne(const char *zone_name, int16 version) {
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	uint32 oMaxID = 0;

	MYSQL_RES *result;
	MYSQL_ROW row;
	query = new char[256];
	sprintf(query, "SELECT MAX(doorid) FROM doors WHERE zone='%s' AND (version=%u OR version=-1)", zone_name, version);
	if (RunQuery(query, strlen(query), errbuf, &result)) {
		safe_delete_array(query);
		row = mysql_fetch_row(result);
		if (row != nullptr && row[1] != 0) {
				if (row[0])
					oMaxID = atoi(row[0]) + 1;
				else
					oMaxID = 0;
			mysql_free_result(result);
			return oMaxID;
		}
		mysql_free_result(result);
	}
	else {
		std::cerr << "Error in GetDoorsCountPlusOne query '" << query << "' " << errbuf << std::endl;
		safe_delete_array(query);
		return -1;
	}

	return -1;
}
Beispiel #7
0
void Database::SendBody(Client *c, int MessageNumber) {

	int CharacterID = FindCharacter(c->MailBoxName().c_str());

	_log(UCS__TRACE, "SendBody: MsgID %i, to %s, CharID is %i", MessageNumber, c->MailBoxName().c_str(), CharacterID);

	if(CharacterID <= 0)
		return;

	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

	if (!RunQuery(query,MakeAnyLenString(&query, "select `msgid`, `body`, `to` from `mail` "
							"where `charid`=%i and `msgid`=%i", CharacterID, MessageNumber), errbuf, &result)){
		safe_delete_array(query);

		return ;
	}

	safe_delete_array(query);

	if (mysql_num_rows(result) != 1) {

		mysql_free_result(result);

		return;
	}

	row = mysql_fetch_row(result);

	_log(UCS__TRACE, "Message: %i  body (%i bytes)", MessageNumber, strlen(row[1]));

	int PacketLength = 12 + strlen(row[0]) + strlen(row[1]) + strlen(row[2]);

	EQApplicationPacket *outapp = new EQApplicationPacket(OP_MailSendBody,PacketLength);

	char *PacketBuffer = (char *)outapp->pBuffer;

	VARSTRUCT_ENCODE_INTSTRING(PacketBuffer, c->GetMailBoxNumber());
	VARSTRUCT_ENCODE_STRING(PacketBuffer,row[0]);
	VARSTRUCT_ENCODE_STRING(PacketBuffer,row[1]);
	VARSTRUCT_ENCODE_STRING(PacketBuffer,"1");
	VARSTRUCT_ENCODE_TYPE(uint8, PacketBuffer, 0);
	VARSTRUCT_ENCODE_TYPE(uint8, PacketBuffer, 0x0a);
	VARSTRUCT_ENCODE_STRING(PacketBuffer, "TO:"); PacketBuffer--;
	VARSTRUCT_ENCODE_STRING(PacketBuffer, row[2]); PacketBuffer--; // Overwrite the null terminator
	VARSTRUCT_ENCODE_TYPE(uint8, PacketBuffer, 0x0a);

	mysql_free_result(result);

	_pkt(UCS__PACKETS, outapp);

	c->QueuePacket(outapp);

	safe_delete(outapp);


}
Beispiel #8
0
bool ZoneDatabase::CreateSpawn2(Client *c, uint32 spawngroup, const char* zone, float heading, float x, float y, float z, uint32 respawn, uint32 variance, uint16 condition, int16 cond_value)
{
	char errbuf[MYSQL_ERRMSG_SIZE];

	char *query = 0;
	uint32 affected_rows = 0;

	//	if(GetInverseXY()==1) {
	//		float temp=x;
	//		x=y;
	//		y=temp;
	//	}
	if (RunQuery(query, MakeAnyLenString(&query,
		"INSERT INTO spawn2 (spawngroupID,zone,x,y,z,heading,respawntime,variance,_condition,cond_value) Values (%i, '%s', %f, %f, %f, %f, %i, %i, %u, %i)",
		spawngroup, zone, x, y, z, heading, respawn, variance, condition, cond_value
		), errbuf, 0, &affected_rows)) {
		safe_delete_array(query);
		if (affected_rows == 1) {
			if(c) c->LogSQL(query);
			return true;
		}
		else {
			return false;
		}
	}
	else {
		LogFile->write(EQEMuLog::Error, "Error in CreateSpawn2 query '%s': %s", query, errbuf);
		safe_delete_array(query);
		return false;
	}

	return false;
}
Beispiel #9
0
bool Database::GetVariable(const char* varname, char* varvalue, uint16 varvalue_len) {

	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

	if (!RunQuery(query,MakeAnyLenString(&query, "select `value` from `variables` where `varname`='%s'", varname), errbuf, &result)) {

		_log(UCS__ERROR, "Unable to get message count from database. %s %s", query, errbuf);

		safe_delete_array(query);

		return false;
	}

	safe_delete_array(query);

	if (mysql_num_rows(result) != 1) {

		mysql_free_result(result);

		return false;
	}

	row = mysql_fetch_row(result);

	snprintf(varvalue, varvalue_len, "%s", row[0]);

	mysql_free_result(result);

	return true;
}
Beispiel #10
0
bool ZoneDatabase::CheckGuildDoor(uint8 doorid,uint16 guild_id,const char* zone) {
	MYSQL_ROW row;
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
    MYSQL_RES *result;
	if (!RunQuery(query, MakeAnyLenString(&query, 
		"SELECT guild FROM doors where doorid=%i AND zone='%s'", 
		doorid-128, zone), errbuf, &result))
	{
		LogFile->write(EQEMuLog::Error, "Error in CheckGuildDoor query '%s': %s", query, errbuf);
		safe_delete_array(query);
		return false;
	} else { 
		if (mysql_num_rows(result) == 1) {
			row = mysql_fetch_row(result);
			if (atoi(row[0]) == guild_id)
			{
				mysql_free_result(result);
				return true;
			}
			else
			{
				mysql_free_result(result);
				return false;
			}
			
			// code below will never be reached
			mysql_free_result(result);
			return false;
		}
	}
	return false;
}
Beispiel #11
0
bool ZoneDatabase::LoadDoors(int32 iDoorCount, Door *into, const char *zone_name, int16 version) {
	LogFile->write(EQEMuLog::Status, "Loading Doors from database...");
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

//	Door tmpDoor;
	MakeAnyLenString(&query, "SELECT id,doorid,zone,name,pos_x,pos_y,pos_z,heading,"
		"opentype,guild,lockpick,keyitem,nokeyring,triggerdoor,triggertype,dest_zone,dest_instance,dest_x,"
		"dest_y,dest_z,dest_heading,door_param,invert_state,incline,size,is_ldon_door,client_version_mask "
		"FROM doors WHERE zone='%s' AND (version=%u OR version=-1) ORDER BY doorid asc", zone_name, version);
	if (RunQuery(query, strlen(query), errbuf, &result)) {
		safe_delete_array(query);
		int32 r;
		for(r = 0; (row = mysql_fetch_row(result)); r++) {
			if(r >= iDoorCount) {
				std::cerr << "Error, Door Count of " << iDoorCount << " exceeded." << std::endl;
				break;
			}
			memset(&into[r], 0, sizeof(Door));
			into[r].db_id = atoi(row[0]);
			into[r].door_id = atoi(row[1]);
			strn0cpy(into[r].zone_name,row[2],32);
			strn0cpy(into[r].door_name,row[3],32);
			into[r].pos_x = (float)atof(row[4]);
			into[r].pos_y = (float)atof(row[5]);
			into[r].pos_z = (float)atof(row[6]);
			into[r].heading = (float)atof(row[7]);
			into[r].opentype = atoi(row[8]);
			into[r].guild_id = atoi(row[9]);
			into[r].lockpick = atoi(row[10]);
			into[r].keyitem = atoi(row[11]);
			into[r].nokeyring = atoi(row[12]);
			into[r].trigger_door = atoi(row[13]);
			into[r].trigger_type = atoi(row[14]);
			strn0cpy(into[r].dest_zone, row[15], 32);
			into[r].dest_instance_id = atoi(row[16]);
			into[r].dest_x = (float) atof(row[17]);
			into[r].dest_y = (float) atof(row[18]);
			into[r].dest_z = (float) atof(row[19]);
			into[r].dest_heading = (float) atof(row[20]);
			into[r].door_param=atoi(row[21]);
			into[r].invert_state=atoi(row[22]);
			into[r].incline=atoi(row[23]);
			into[r].size=atoi(row[24]);
			into[r].is_ldon_door=atoi(row[25]);
			into[r].client_version_mask = (uint32)strtoul(row[26], nullptr, 10);
		}
		mysql_free_result(result);
	}
	else
	{
		std::cerr << "Error in DBLoadDoors query '" << query << "' " << errbuf << std::endl;
		safe_delete_array(query);
		return false;
	}
	return true;
}
Beispiel #12
0
void Database::ItterateQuery(const char *runQuery, std::function<void(mysqlpp::StoreQueryResult::const_iterator)>& ittFunct)
{
    auto queryResults = RunQuery(runQuery);
    mysqlpp::StoreQueryResult::const_iterator it;
    for (it = queryResults.begin(); it != queryResults.end(); ++it) {
        ittFunct(it);
    }
}
Beispiel #13
0
void Database::SetMessageStatus(int MessageNumber, int Status) {

	_log(UCS__TRACE, "SetMessageStatus %i %i", MessageNumber, Status);

	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;

	if(Status == 0)
		RunQuery(query, MakeAnyLenString(&query, "delete from `mail` where `msgid`=%i", MessageNumber), errbuf);
	else if (!RunQuery(query, MakeAnyLenString(&query, "update `mail` set `status`=%i where `msgid`=%i", Status, MessageNumber), errbuf)) {

		_log(UCS__ERROR, "Error updating status %s, %s", query, errbuf);

	}

	safe_delete_array(query);
}
Beispiel #14
0
void Database::LogPlayerNPCKill(QSPlayerLogNPCKill_Struct* QS, uint32 Members){
	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;
	uint32 lastid = 0;
	if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_npc_kill_record` SET `npc_id`='%i', `type`='%i', `zone_id`='%i', `time`=NOW()", QS->s1.NPCID, QS->s1.Type, QS->s1.ZoneID), errbuf, 0, 0, &lastid)) {
		_log(NET__WORLD, "Failed NPC Kill Log Record Insert: %s", errbuf);
		_log(NET__WORLD, "%s", query);
	}

	if(Members > 0){
		for (int i = 0; i < Members; i++) {
			if(!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO `qs_player_npc_kill_record_entries` SET `event_id`='%i', `char_id`='%i'", lastid, QS->Chars[i].char_id, errbuf, 0, 0))) {
				_log(NET__WORLD, "Failed NPC Kill Log Entry Insert: %s", errbuf);
				_log(NET__WORLD, "%s", query);
			}
		}
	}
}
Beispiel #15
0
extern void
CommandRelationalSelect(char *sz)
{
    unsigned int i, j;
    RowSet *rs;

    if (!sz || !*sz) {
        outputl(_("You must specify a sql query to run."));
        return;
    }

    rs = RunQuery(sz);
    if (!rs)
        return;

    if (rs->rows == 0) {
        outputl(_("No rows found.\n"));
        return;
    }
#if USE_GTK
    if (fX)
        GtkShowQuery(rs);
    else
#endif
        for (i = 0; i < rs->rows; i++) {
            if (i == 1) {       /* Underline headings */
                char *line, *p;
                unsigned int k;
                int totalwidth = 0;
                for (k = 0; k < rs->cols; k++) {
                    totalwidth += rs->widths[k] + 1;
                    if (k != 0)
                        totalwidth += 2;
                }
                line = malloc(totalwidth + 1);
                memset(line, '-', totalwidth);
                p = line;
                for (k = 0; k < rs->cols - 1; k++) {
                    p += rs->widths[k];
                    p[1] = '|';
                    p += 3;
                }
                line[totalwidth] = '\0';
                outputl(line);
                free(line);
            }

            for (j = 0; j < rs->cols; j++) {
                if (j > 0)
                    output(" | ");

                outputf("%*s", (int) rs->widths[j], rs->data[i][j]);
            }
            outputl("");
        }
    FreeRowset(rs);
}
Beispiel #16
0
// This allows EqEmu to have zone specific foraging - BoB
uint32 ZoneDatabase::GetZoneForage(uint32 ZoneID, uint8 skill) {
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

	uint8 index = 0;
	uint32 item[FORAGE_ITEM_LIMIT];
	uint32 chance[FORAGE_ITEM_LIMIT];
	uint32 ret;

	for (int c=0; c < FORAGE_ITEM_LIMIT; c++) {
		item[c] = 0;
	}

	uint32 chancepool = 0;

	if (RunQuery(query, MakeAnyLenString(&query, "SELECT itemid,chance FROM forage WHERE zoneid= '%i' and level <= '%i' LIMIT %i", ZoneID, skill, FORAGE_ITEM_LIMIT), errbuf, &result))
	{
		safe_delete_array(query);
		while ((row = mysql_fetch_row(result)) && (index < FORAGE_ITEM_LIMIT)) {
			item[index] = atoi(row[0]);
			chance[index] = atoi(row[1])+chancepool;
LogFile->write(EQEMuLog::Error, "Possible Forage: %d with a %d chance", item[index], chance[index]);
			chancepool = chance[index];
			index++;
		}

		mysql_free_result(result);
	}
	else {
		LogFile->write(EQEMuLog::Error, "Error in Forage query '%s': %s", query, errbuf);
		safe_delete_array(query);
		return 0;
	}

	if(chancepool == 0 || index < 1)
		return(0);

	if(index == 1) {
		return(item[0]);
	}

	ret = 0;

	uint32 rindex = MakeRandomInt(1, chancepool);

	for(int i = 0; i < index; i++) {
		if(rindex <= chance[i]) {
			ret = item[i];
			break;
		}
	}

	return ret;
}
Beispiel #17
0
//o--------------------------------------------------------------
//| Name: SetCharacterFactionLevel; rembrant, Dec. 20, 2001
//o--------------------------------------------------------------
//| Purpose: Update characters faction level with specified
//|          faction_id to specified value.
//|          Returns false on failure.
//o--------------------------------------------------------------
bool Database::SetCharacterFactionLevel(int32 char_id, sint32 faction_id, sint32 value,LinkedList<FactionValue*>* val_list)
{
	char errbuf[MYSQL_ERRMSG_SIZE];
    char *query = 0;
	int32 affected_rows = 0;
	
	if (!RunQuery(query, MakeAnyLenString(&query, "DELETE FROM faction_values WHERE char_id=%i AND faction_id = %i", char_id, faction_id), errbuf)) {
		cerr << "Error in SetCharacterFactionLevel query '" << query << "' " << errbuf << endl;
		delete[] query;
		return false;
	}
	
	if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO faction_values (char_id,faction_id,current_value) VALUES (%i,%i,%i)", char_id, faction_id,value), errbuf, 0, &affected_rows)) {
		cerr << "Error in SetCharacterFactionLevel query '" << query << "' " << errbuf << endl;
		delete[] query;
		return false;
	}
	
	delete[] query;
	
	if (affected_rows == 0)
	{
		return false;
	}
	
	LinkedListIterator<FactionValue*> iterator(*val_list);	
	iterator.Reset();
	while(iterator.MoreElements())
	{
		if ((int32)(iterator.GetData()->factionID) == faction_id)
		{
			iterator.GetData()->value = value;
			return true;
		}
		iterator.Advance();
	}
	FactionValue* facval = new FactionValue;
	facval->factionID = faction_id;
	facval->value = value;
	val_list->Insert(facval);	
	return true;
}
Beispiel #18
0
 bool ODThumbInfo::InsertThumbForMedia(thumb_description_t& thumb)
 {
     try {
         std::string query = "BEGIN TRANSACTION";
         RunQuery(query.c_str());
         
         std::string insertQuery;
         insertQuery += "INSERT INTO thumb_info (\"media_id\", \"width\", \"height\", \"thumbnailPath\") ";
         insertQuery += "VALUES (?, ?, ?, ?);";
         
         sqlite3_stmt* statement;
         if (sqlite3_prepare_v2(mDBHandle, insertQuery.c_str(), -1, &statement, 0) == SQLITE_OK){
             sqlite3_bind_int64(statement, 1, thumb.media_id);
             
             sqlite3_bind_int(statement, 2, thumb.width);
             sqlite3_bind_int(statement, 3, thumb.height);
             
             sqlite3_bind_text(statement, 4, thumb.thumbnailPath.c_str(), -1, NULL);
             
             int result = 0;
             while (true)
             {
                 result = sqlite3_step(statement);
                 if (result != SQLITE_ROW)
                     break;
             }
             sqlite3_finalize(statement);
         }
         std::string error = sqlite3_errmsg(mDBHandle);
         NSLog(@"%s", error.c_str());
         query = "END TRANSACTION";
         RunQuery(query.c_str());
         
     }
     catch (...) {
         return false;
     }
     
     thumb.thumb_id = GetThumbId(thumb.media_id, thumb.width, thumb.height);
     
     return true;
 }
Beispiel #19
0
const LootDrop_Struct* Database::GetLootDrop(int32 lootdrop_id) {
#ifdef SHAREMEM
	return EMuShareMemDLL.Loot.GetLootDrop(lootdrop_id);
#else
	int32 i;
	if (lootdrop_array == 0) {
		lootdrop_array = new LootDrop_Struct*[lootdrop_max+1];
		lootdrop_inmem = new bool[lootdrop_max+1];
		for (i=0; i<=lootdrop_max; i++) {
			lootdrop_array[i] = 0;
			lootdrop_inmem[i] = false;
		}
	}
	if (lootdrop_id > lootdrop_max || lootdrop_id == 0)
		return 0;
	if (lootdrop_inmem[lootdrop_id]) {
		if (lootdrop_array[lootdrop_id])
			return lootdrop_array[lootdrop_id];
		else
			return 0;
	}
	char errbuf[MYSQL_ERRMSG_SIZE];
    char *query = 0;
    MYSQL_RES *result;
    MYSQL_ROW row;
	if (RunQuery(query, MakeAnyLenString(&query, "SELECT lootdrop_id, item_id, item_charges, equip_item, chance FROM lootdrop_entries WHERE lootdrop_id=%i order by chance desc", lootdrop_id), errbuf, &result)) {
		safe_delete(query);
		lootdrop_array[lootdrop_id] = (LootDrop_Struct*) new uchar[sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * mysql_num_rows(result))];
		memset(lootdrop_array[lootdrop_id], 0, sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * mysql_num_rows(result)));
		lootdrop_inmem[lootdrop_id] = true;
		lootdrop_array[lootdrop_id]->NumEntries = mysql_num_rows(result);
		i=0;
		while ((row = mysql_fetch_row(result))) {
			if (i >= lootdrop_array[lootdrop_id]->NumEntries) {
				mysql_free_result(result);
				cerr << "Error in Database::GetLootDrop, i >= NumEntries" << endl;
				return 0;
			}
			lootdrop_array[lootdrop_id]->Entries[i].item_id = atoi(row[1]);
			lootdrop_array[lootdrop_id]->Entries[i].item_charges = atoi(row[2]);
			lootdrop_array[lootdrop_id]->Entries[i].equip_item = atoi(row[3]);
			lootdrop_array[lootdrop_id]->Entries[i].chance = atoi(row[4]);
			i++;
		}
		mysql_free_result(result);
	}
	else {
		cerr << "Error in AddLootTableToNPC get items query '" << query << "' " << errbuf << endl;
		safe_delete(query);
		return 0;
	}
	return lootdrop_array[lootdrop_id];
#endif
}
Beispiel #20
0
int WorldDatabase::MoveCharacterToBind(int CharID, uint8 bindnum) {
	// if an invalid bind point is specified, use the primary bind
	if (bindnum > 4)
		bindnum = 0;

	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;
	uint32	affected_rows = 0;
	PlayerProfile_Struct pp;

	bool PPValid = false;

	if (RunQuery(query, MakeAnyLenString(&query, "SELECT profile from character_ where id='%i'", CharID), errbuf, &result)) {
		row = mysql_fetch_row(result);
		unsigned long* lengths = mysql_fetch_lengths(result);
		if (lengths[0] == sizeof(PlayerProfile_Struct)) {
			memcpy(&pp, row[0], sizeof(PlayerProfile_Struct));
			PPValid = true;
		}
		mysql_free_result(result);
	}
	safe_delete_array(query);

	if(!PPValid) return 0;

	const char *BindZoneName = StaticGetZoneName(pp.binds[bindnum].zoneId);

	if(!strcmp(BindZoneName, "UNKNWN")) return pp.zone_id;

	if (!RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET zonename = '%s',zoneid=%i,x=%f, y=%f, z=%f, instanceid=0 WHERE id='%i'",
							BindZoneName, pp.binds[bindnum].zoneId, pp.binds[bindnum].x, pp.binds[bindnum].y, pp.binds[bindnum].z,
							CharID), errbuf, 0,&affected_rows)) {

		return pp.zone_id;
	}
	safe_delete_array(query);

	return pp.binds[bindnum].zoneId;
}
Beispiel #21
0
void Frame::RunQueries(const wxString& text)
{
  if (text.empty())
  {
    return;
  }
  
  if (m_Results->IsShown())
  {
    m_Results->ClearGrid();
  }

  // Skip sql comments.
  wxString output = text;
  wxRegEx("--.*$", wxRE_NEWLINE).ReplaceAll(&output, "");

  // Queries are seperated by ; character.
  wxStringTokenizer tkz(output, ";");
  int no_queries = 0;

  wxStopWatch sw;
  m_Running = true;

  // Run all queries.
  while (tkz.HasMoreTokens() && !m_Stopped)
  {
    wxString query = tkz.GetNextToken();
    query.Trim(true);
    query.Trim(false);

    if (!query.empty())
    {
      try
      {
        RunQuery(query, no_queries == 0);
        no_queries++;
      }
      catch (otl_exception& p)
      {
        m_Statistics.Inc(_("Number of query errors"));
        m_Shell->AppendText(
          _("\nerror: ") +  wxExQuoted(p.msg) + 
          _(" in: ") + wxExQuoted(query));
      }
    }
  }

  m_Shell->Prompt(wxString::Format(_("\n%d queries (%.3f seconds)"),
    no_queries,
    (float)sw.Time() / (float)1000));

  m_Running = false;
}
Beispiel #22
0
/*--------------------------------------------------------------------------------*/
bool PostgresDatabase::TableExists(const AString& name)
{
	SQLQuery *query = NULL;

	if ((query = RunQuery(AString("select count(*) from %").Arg(name))) != NULL) {
		bool success = query->GetResult();
		delete query;
		return success;
	}

	return false;
}
Beispiel #23
0
 bool ODThumbInfo::UpdateThumbForMedia(thumb_description_t& thumb)
 {
     bool success = true;
     try {
         std::string query = "BEGIN TRANSACTION";
         RunQuery(query.c_str());
         
         std::string updateQuery;
         updateQuery += "UPDATE thumb_info SET thumbnailPath = ?";
         updateQuery += "WHERE thumb_id = ?;";
         
         sqlite3_stmt* statement;
         if (sqlite3_prepare_v2(mDBHandle, updateQuery.c_str(), -1, &statement, 0) == SQLITE_OK){
             sqlite3_bind_text(statement, 1, thumb.thumbnailPath.c_str(),-1,NULL);
             sqlite3_bind_int64(statement, 2, thumb.thumb_id);
             
             int result = 0;
             while (true)
             {
                 result = sqlite3_step(statement);
                 if (result != SQLITE_ROW)
                     break;
             }
             sqlite3_finalize(statement);
         }
         std::string error = sqlite3_errmsg(mDBHandle);
         NSLog(@"%s", error.c_str());
         query = "END TRANSACTION";
         RunQuery(query.c_str());
     }
     catch (...) {
         success = false;
     }
     
     return success;
     
 }
Beispiel #24
0
void ZoneDatabase::UpdateRecipeMadecount(uint32 recipe_id, uint32 char_id, uint32 madecount)
{
	char *query = 0;
	uint32 qlen;
	char errbuf[MYSQL_ERRMSG_SIZE];
	
	qlen = MakeAnyLenString(&query, "INSERT INTO char_recipe_list "
		" SET recipe_id = %u, char_id = %u, madecount = %u "
		" ON DUPLICATE KEY UPDATE madecount = %u;"
	, recipe_id, char_id, madecount, madecount);

	if (!RunQuery(query, qlen, errbuf)) {
		LogFile->write(EQEMuLog::Error, "Error in UpdateRecipeMadecount query '%s': %s", query, errbuf);
	}
	safe_delete_array(query);
}
Beispiel #25
0
void Database::SetChannelOwner(std::string ChannelName, std::string Owner) {

	_log(UCS__TRACE, "Database::SetChannelOwner(%s, %s)", ChannelName.c_str(), Owner.c_str());

	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;

	if(!RunQuery(query, MakeAnyLenString(&query, "UPDATE `chatchannels` set `owner`='%s' where `name`='%s'", Owner.c_str(),
						ChannelName.c_str()), errbuf)) {

		_log(UCS__ERROR, "Error updating Owner in database: %s, %s", query, errbuf);

	}

	safe_delete_array(query);
}
Beispiel #26
0
void Database::RemoveFriendOrIgnore(int CharID, int Type, std::string Name) {

	const char *FriendsQuery="DELETE FROM `friends` WHERE `charid`=%i AND `type`=%i and `name`='%s'";

	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;

	if(!RunQuery(query, MakeAnyLenString(&query, FriendsQuery, CharID, Type, CapitaliseName(Name).c_str()), errbuf, 0, 0))
		_log(UCS__ERROR, "Error removing friend/ignore, query was %s", query);
	else
		_log(UCS__TRACE, "Removed Friend/Ignore entry for charid %i, type %i, name %s from database.",
			CharID, Type, Name.c_str());


	safe_delete_array(query);
}
Beispiel #27
0
bool Database::LoadFactionValues(int32 char_id, LinkedList<FactionValue*>* val_list) {
	char errbuf[MYSQL_ERRMSG_SIZE];
    char *query = 0;
    MYSQL_RES *result;
	if (RunQuery(query, MakeAnyLenString(&query, "SELECT faction_id,current_value FROM faction_values WHERE char_id = %i",char_id), errbuf, &result)) {
		delete[] query;
		bool ret = LoadFactionValues_result(result, val_list);
		mysql_free_result(result);
		return ret;
	}
	else {
		cerr << "Error in LoadFactionValues query '" << query << "' " << errbuf << endl;
		delete[] query;
	}
	return false;
}
Beispiel #28
0
void Database::AddFriendOrIgnore(int CharID, int Type, std::string Name) {

	const char *FriendsQuery="INSERT INTO `friends` (`charid`, `type`, `name`) VALUES ('%i', %i, '%s')";

	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;


	if(!RunQuery(query, MakeAnyLenString(&query, FriendsQuery, CharID, Type, CapitaliseName(Name).c_str()), errbuf, 0, 0))
		_log(UCS__ERROR, "Error adding friend/ignore, query was %s : %s", query, errbuf);
	else
		_log(UCS__TRACE, "Wrote Friend/Ignore entry for charid %i, type %i, name %s to database.",
			CharID, Type, Name.c_str());


	safe_delete_array(query);
}
Beispiel #29
0
void Database::GeneralQueryReceive(ServerPacket *pack) {
	/*
		These are general queries passed from anywhere in zone instead of packing structures and breaking them down again and again
	*/
	char *Query = nullptr;
	Query = new char[pack->ReadUInt32() + 1];
	pack->ReadString(Query);
	char errbuf[MYSQL_ERRMSG_SIZE];
	char* query = 0;
	uint32 lastid = 0;
	if (!RunQuery(query, MakeAnyLenString(&query, Query), errbuf, 0, 0, &lastid)) { 
		_log(QUERYSERV__ERROR, "Failed Delete Log Record Insert: %s", errbuf);
		_log(QUERYSERV__ERROR, "%s", query); 
	}
	safe_delete_array(query);
	safe_delete(pack); 
	safe_delete(Query); 
}
Beispiel #30
0
//todo: rewrite this to not need direct access to trap members.
bool ZoneDatabase::LoadTraps(const char* zonename, int16 version) {
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	MYSQL_RES *result;
	MYSQL_ROW row;

	//	int char_num = 0;
	unsigned long* lengths;

	if (RunQuery(query, MakeAnyLenString(&query, "SELECT id,x,y,z,effect,effectvalue,effectvalue2,skill,maxzdiff,radius,chance,message,respawn_time,respawn_var,level FROM traps WHERE zone='%s' AND version=%u", zonename, version), errbuf, &result)) {
		safe_delete_array(query);
		while ((row = mysql_fetch_row(result)))
		{
			lengths = mysql_fetch_lengths(result);
			Trap* trap = new Trap();
			trap->trap_id = atoi(row[0]);
			trap->x = atof(row[1]);
			trap->y = atof(row[2]);
			trap->z = atof(row[3]);
			trap->effect = atoi(row[4]);
			trap->effectvalue = atoi(row[5]);
			trap->effectvalue2 = atoi(row[6]);
			trap->skill = atoi(row[7]);
			trap->maxzdiff = atof(row[8]);
			trap->radius = atof(row[9]);
			trap->chance = atoi(row[10]);
			trap->message = row[11];
			trap->respawn_time = atoi(row[12]);
			trap->respawn_var = atoi(row[13]);
			trap->level = atoi(row[14]);
			entity_list.AddTrap(trap);
			trap->CreateHiddenTrigger();
		}
		mysql_free_result(result);
	}
	else {
		LogFile->write(EQEMuLog::Error, "Error in LoadTraps query '%s': %s", query, errbuf);
		safe_delete_array(query);
		return false;
	}

	return true;
}