Merhabalar bi önceki soru cevap konumda dali offlineshop eklerken yaşadığım sorundan bahsetmiştim offlineshop tablosuna kaydın silindiğini söylemiştim bunun nedeni item tablosunda offlineshop içerisinde boş olarak göründüğü için pazar kapandığı görünüyor o yüzden siliniyormuş neyse konumuza gelelim şimdi
[CODE title="Cache.cpp"]void CItemCache::OnFlush()
{
if (m_data.vnum == 0) // vnum이 0이면 삭제하라고 표시된 것이다.
{
char szQuery[QUERY_MAX_LEN];
snprintf (szQuery, sizeof (szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), m_data.id);
CDBManager::instance().ReturnQuery (szQuery, QID_ITEM_DESTROY, 0, NULL);
if (g_test_server)
{
sys_log (0, "ItemCache::Flush : DELETE %u %s", m_data.id, szQuery);
}
}
else
{
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
bool isSocket = false, isAttr = false;
memset (&alSockets, 0, sizeof (long) * ITEM_SOCKET_MAX_NUM);
memset (&aAttr, 0, sizeof (TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM);
TPlayerItem* p = &m_data;
if (memcmp (alSockets, p->alSockets, sizeof (long) * ITEM_SOCKET_MAX_NUM))
{
isSocket = true;
}
if (memcmp (aAttr, p->aAttr, sizeof (TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM))
{
isAttr = true;
}
char szColumns[QUERY_MAX_LEN];
char szValues[QUERY_MAX_LEN];
char szUpdate[QUERY_MAX_LEN];
int iLen = snprintf (szColumns, sizeof (szColumns), "id, owner_id, `window`, pos, count, vnum");
int iValueLen = snprintf (szValues, sizeof (szValues), "%u, %u, %d, %d, %u, %u",
p->id, p->owner, p->window, p->pos, p->count, p->vnum);
int iUpdateLen = snprintf (szUpdate, sizeof (szUpdate), "owner_id=%u, window=%d, pos=%d, count=%u, vnum=%u",
p->owner, p->window, p->pos, p->count, p->vnum);
if (isSocket)
{
iLen += snprintf (szColumns + iLen, sizeof (szColumns) - iLen, ", socket0, socket1, socket2");
iValueLen += snprintf (szValues + iValueLen, sizeof (szValues) - iValueLen,
", %lu, %lu, %lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);
iUpdateLen += snprintf (szUpdate + iUpdateLen, sizeof (szUpdate) - iUpdateLen,
", socket0=%lu, socket1=%lu, socket2=%lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);
}
if (isAttr)
{
iLen += snprintf (szColumns + iLen, sizeof (szColumns) - iLen,
", attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3"
", attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6");
iValueLen += snprintf (szValues + iValueLen, sizeof (szValues) - iValueLen,
", %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
p->aAttr[0].bType, p->aAttr[0].sValue,
p->aAttr[1].bType, p->aAttr[1].sValue,
p->aAttr[2].bType, p->aAttr[2].sValue,
p->aAttr[3].bType, p->aAttr[3].sValue,
p->aAttr[4].bType, p->aAttr[4].sValue,
p->aAttr[5].bType, p->aAttr[5].sValue,
p->aAttr[6].bType, p->aAttr[6].sValue);
iUpdateLen += snprintf (szUpdate + iUpdateLen, sizeof (szUpdate) - iUpdateLen,
", attrtype0=%d, attrvalue0=%d"
", attrtype1=%d, attrvalue1=%d"
", attrtype2=%d, attrvalue2=%d"
", attrtype3=%d, attrvalue3=%d"
", attrtype4=%d, attrvalue4=%d"
", attrtype5=%d, attrvalue5=%d"
", attrtype6=%d, attrvalue6=%d",
p->aAttr[0].bType, p->aAttr[0].sValue,
p->aAttr[1].bType, p->aAttr[1].sValue,
p->aAttr[2].bType, p->aAttr[2].sValue,
p->aAttr[3].bType, p->aAttr[3].sValue,
p->aAttr[4].bType, p->aAttr[4].sValue,
p->aAttr[5].bType, p->aAttr[5].sValue,
p->aAttr[6].bType, p->aAttr[6].sValue);
}
#ifdef WJ_OFFLINE_SHOP_SYSTEM
if (p->price)
#ifdef iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", price");
iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u", p->price);
iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", price=%u", p->price);
}
#ifdef WJ_CHEQUE_SYSTEM
if (p->cheque_price)
#ifdef iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", cheque_price");
iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u", p->cheque_price);
iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", cheque_price=%u", p->cheque_price);
}
#endif
#endif
char szItemQuery[QUERY_MAX_LEN +#endif #endifrintf (szItemQuery, sizeof (szItemQuery), "REPLACE INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues);
if (g_test_server)
{
sys_log (0, "ItemCache::Flush :REPLACE (%s)", szItemQuery);
}
CDBManager::instance().ReturnQuery (szItemQuery, QID_ITEM_SAVE, 0, NULL);
//g_item_info.Add(p->vnum);
++g_item_count;
}
m_bNeedQuery = false;
}[/CODE]
Cache.cpp dosyamda bu şekilde item tablosuna kayıt yapıyor ama tablodaki enum değerini 13 olarak gönderdiği için tabloya kayıt sağlanmıyor ve böyle bir syserr atıyor
[CODE title="syserr"]SYSERR: Jan 28 15:26:03.725535 :: ChildLoop: AsyncSQL: query failed: Data truncated for column 'window' at row 1 (query: REPLACE INTO item (id, owner_id, `window`, pos, count, vnum, socket0, socket1, socket2, attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, price) VALUES(70000001, 10001, 13, 0, 1, 19, 1, 0, 0, 16, 2, 22, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123) errno: 1265)
[/CODE]
syserr de ki enum değerini OFFLINE_SHOP olarak değiştirince sorun kalmıyor ama neden 13 olarak gönderdiğini bulamadım length.h dosyasını kontrol ettiğimde
[CODE title="length.h"]enum EWindows
{
RESERVED_WINDOW,
INVENTORY,
EQUIPMENT,
SAFEBOX,
MALL,
DRAGON_SOUL_INVENTORY,
BELT_INVENTORY,
#ifdef WJ_OFFLINE_SHOP_SYSTEM
OFFLINE_SHOP,
#endif
#ifdef ENABLE_SPLIT_IN#ifdef SKILL_BOOK_INVENTORY,
UPG#endif#endif#endif#endifN#ifdefY,
BOX_INVENTORY,
EFSUN_INVENTORY,
CICEK_INVENTORY,
#endif
GROUND
};[/CODE]
d#endifrim bu şekilde fakat navicat tablosundaki window değerleri;
[CODE title="enum değerleri"]'INVENTORY','EQUIPMENT','SAFEBOX','MALL','DRAGON_SOUL_INVENTORY','BELT_INVENTORY','OFFLINE_SHOP','GROUND'[/CODE]
bu şekilde :/ işin içinden çıkamadım varmı yardımcı olacak ?
[CODE title="Cache.cpp"]void CItemCache::OnFlush()
{
if (m_data.vnum == 0) // vnum이 0이면 삭제하라고 표시된 것이다.
{
char szQuery[QUERY_MAX_LEN];
snprintf (szQuery, sizeof (szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), m_data.id);
CDBManager::instance().ReturnQuery (szQuery, QID_ITEM_DESTROY, 0, NULL);
if (g_test_server)
{
sys_log (0, "ItemCache::Flush : DELETE %u %s", m_data.id, szQuery);
}
}
else
{
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
bool isSocket = false, isAttr = false;
memset (&alSockets, 0, sizeof (long) * ITEM_SOCKET_MAX_NUM);
memset (&aAttr, 0, sizeof (TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM);
TPlayerItem* p = &m_data;
if (memcmp (alSockets, p->alSockets, sizeof (long) * ITEM_SOCKET_MAX_NUM))
{
isSocket = true;
}
if (memcmp (aAttr, p->aAttr, sizeof (TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM))
{
isAttr = true;
}
char szColumns[QUERY_MAX_LEN];
char szValues[QUERY_MAX_LEN];
char szUpdate[QUERY_MAX_LEN];
int iLen = snprintf (szColumns, sizeof (szColumns), "id, owner_id, `window`, pos, count, vnum");
int iValueLen = snprintf (szValues, sizeof (szValues), "%u, %u, %d, %d, %u, %u",
p->id, p->owner, p->window, p->pos, p->count, p->vnum);
int iUpdateLen = snprintf (szUpdate, sizeof (szUpdate), "owner_id=%u, window=%d, pos=%d, count=%u, vnum=%u",
p->owner, p->window, p->pos, p->count, p->vnum);
if (isSocket)
{
iLen += snprintf (szColumns + iLen, sizeof (szColumns) - iLen, ", socket0, socket1, socket2");
iValueLen += snprintf (szValues + iValueLen, sizeof (szValues) - iValueLen,
", %lu, %lu, %lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);
iUpdateLen += snprintf (szUpdate + iUpdateLen, sizeof (szUpdate) - iUpdateLen,
", socket0=%lu, socket1=%lu, socket2=%lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);
}
if (isAttr)
{
iLen += snprintf (szColumns + iLen, sizeof (szColumns) - iLen,
", attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3"
", attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6");
iValueLen += snprintf (szValues + iValueLen, sizeof (szValues) - iValueLen,
", %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
p->aAttr[0].bType, p->aAttr[0].sValue,
p->aAttr[1].bType, p->aAttr[1].sValue,
p->aAttr[2].bType, p->aAttr[2].sValue,
p->aAttr[3].bType, p->aAttr[3].sValue,
p->aAttr[4].bType, p->aAttr[4].sValue,
p->aAttr[5].bType, p->aAttr[5].sValue,
p->aAttr[6].bType, p->aAttr[6].sValue);
iUpdateLen += snprintf (szUpdate + iUpdateLen, sizeof (szUpdate) - iUpdateLen,
", attrtype0=%d, attrvalue0=%d"
", attrtype1=%d, attrvalue1=%d"
", attrtype2=%d, attrvalue2=%d"
", attrtype3=%d, attrvalue3=%d"
", attrtype4=%d, attrvalue4=%d"
", attrtype5=%d, attrvalue5=%d"
", attrtype6=%d, attrvalue6=%d",
p->aAttr[0].bType, p->aAttr[0].sValue,
p->aAttr[1].bType, p->aAttr[1].sValue,
p->aAttr[2].bType, p->aAttr[2].sValue,
p->aAttr[3].bType, p->aAttr[3].sValue,
p->aAttr[4].bType, p->aAttr[4].sValue,
p->aAttr[5].bType, p->aAttr[5].sValue,
p->aAttr[6].bType, p->aAttr[6].sValue);
}
#ifdef WJ_OFFLINE_SHOP_SYSTEM
if (p->price)
#ifdef iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", price");
iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u", p->price);
iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", price=%u", p->price);
}
#ifdef WJ_CHEQUE_SYSTEM
if (p->cheque_price)
#ifdef iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", cheque_price");
iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u", p->cheque_price);
iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", cheque_price=%u", p->cheque_price);
}
#endif
#endif
char szItemQuery[QUERY_MAX_LEN +#endif #endifrintf (szItemQuery, sizeof (szItemQuery), "REPLACE INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues);
if (g_test_server)
{
sys_log (0, "ItemCache::Flush :REPLACE (%s)", szItemQuery);
}
CDBManager::instance().ReturnQuery (szItemQuery, QID_ITEM_SAVE, 0, NULL);
//g_item_info.Add(p->vnum);
++g_item_count;
}
m_bNeedQuery = false;
}[/CODE]
Cache.cpp dosyamda bu şekilde item tablosuna kayıt yapıyor ama tablodaki enum değerini 13 olarak gönderdiği için tabloya kayıt sağlanmıyor ve böyle bir syserr atıyor
[CODE title="syserr"]SYSERR: Jan 28 15:26:03.725535 :: ChildLoop: AsyncSQL: query failed: Data truncated for column 'window' at row 1 (query: REPLACE INTO item (id, owner_id, `window`, pos, count, vnum, socket0, socket1, socket2, attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, price) VALUES(70000001, 10001, 13, 0, 1, 19, 1, 0, 0, 16, 2, 22, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123) errno: 1265)
[/CODE]
syserr de ki enum değerini OFFLINE_SHOP olarak değiştirince sorun kalmıyor ama neden 13 olarak gönderdiğini bulamadım length.h dosyasını kontrol ettiğimde
[CODE title="length.h"]enum EWindows
{
RESERVED_WINDOW,
INVENTORY,
EQUIPMENT,
SAFEBOX,
MALL,
DRAGON_SOUL_INVENTORY,
BELT_INVENTORY,
#ifdef WJ_OFFLINE_SHOP_SYSTEM
OFFLINE_SHOP,
#endif
#ifdef ENABLE_SPLIT_IN#ifdef SKILL_BOOK_INVENTORY,
UPG#endif#endif#endif#endifN#ifdefY,
BOX_INVENTORY,
EFSUN_INVENTORY,
CICEK_INVENTORY,
#endif
GROUND
};[/CODE]
d#endifrim bu şekilde fakat navicat tablosundaki window değerleri;
[CODE title="enum değerleri"]'INVENTORY','EQUIPMENT','SAFEBOX','MALL','DRAGON_SOUL_INVENTORY','BELT_INVENTORY','OFFLINE_SHOP','GROUND'[/CODE]
bu şekilde :/ işin içinden çıkamadım varmı yardımcı olacak ?
