#include #include #include #include "DB_Commands.h" #include "StructItem.h" DB_InsertItem::DB_InsertItem( struct StructItem * pItem ) : DBProc( "DB_InsertItem" ), m_pItem( pItem ) { } bool DB_InsertItem::insertItemToDB( DBConnection & db , ItemUID uid, int owner_id, int account_id, int summon_id, int auction_id, int keeping_id, int code, ItemUID previous_uid, int flag, const __int64 & cnt, int level, int enhance, int ethereal_durability, int endurance, int socket_0, int socket_1, int socket_2, int socket_3, int gcode, int remain_time, unsigned char elemental_effect_type, time_t elemental_effect_expire_time, int elemental_effect_attack_point, int elemental_effect_magic_point, const ItemBase::ItemCode appearance_code, int summon_code ) { _CommandPtr cmd; if( db.CreateCommand( cmd ) == false ) throw XException( "DB_InsertItem : CreateInstance(command) error" ); cmd->CommandType = adCmdStoredProc; cmd->CommandText = _bstr_t( "dbo.smp_insert_item" ); cmd->Parameters->Append( cmd->CreateParameter( "IN_SID", adBigInt, adParamInput, 8, uid ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_OWNER_ID", adInteger, adParamInput, 4, owner_id ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_ACCOUNT_ID", adInteger, adParamInput, 4, account_id ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_SUMMON_ID", adInteger, adParamInput, 4, summon_id ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_AUCTION_ID", adInteger, adParamInput, 4, auction_id ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_KEEPING_ID", adInteger, adParamInput, 4, keeping_id ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_CODE", adInteger, adParamInput, 4, code ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_PREVIOUS_SID", adBigInt, adParamInput, 8, previous_uid ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_FLAG", adInteger, adParamInput, 4, flag ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_CNT", adBigInt, adParamInput, 8, cnt ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_LEVEL", adInteger, adParamInput, 4, level ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_ENHANCE", adInteger, adParamInput, 4, enhance ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_ETHEREAL_DURABILITY", adInteger, adParamInput, 4, ethereal_durability ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_ENDURANCE", adInteger, adParamInput, 4, endurance ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_SOCKET_0", adInteger, adParamInput, 4, socket_0 ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_SOCKET_1", adInteger, adParamInput, 4, socket_1 ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_SOCKET_2", adInteger, adParamInput, 4, socket_2 ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_SOCKET_3", adInteger, adParamInput, 4, socket_3 ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_GCODE", adInteger, adParamInput, 4, gcode ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_REMAIN_TIME", adInteger, adParamInput, 4, remain_time ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_ELEMENTAL_EFFECT_TYPE", adInteger, adParamInput, 4, elemental_effect_type ) ); COleDateTime dtElementalEffectExpire( elemental_effect_expire_time ); cmd->Parameters->Append( cmd->CreateParameter( "IN_ELEMENTAL_EFFECT_EXPIRE_DATE", adDate, adParamInput, sizeof( DATE ), static_cast< DATE >( dtElementalEffectExpire ) ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_ELEMENTAL_EFFECT_ATTACK_POINT", adInteger, adParamInput, 4, elemental_effect_attack_point ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_ELEMENTAL_EFFECT_MAGIC_POINT", adInteger, adParamInput, 4, elemental_effect_magic_point ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_APPEARANCE_CODE", adInteger, adParamInput, 4, appearance_code ) ); cmd->Parameters->Append( cmd->CreateParameter( "IN_SUMMON_CODE", adInteger, adParamInput, 4, summon_code ) ); cmd->Execute( NULL, NULL,adCmdStoredProc ); return true; } bool DB_InsertItem::proc( DBConnection & db ) { time_t remain_time = 0; if( m_pItem->IsExpireItem() ) { if( m_pItem->GetItemBase().decrease_type == ItemBase::DECREASE_ALWAYS ) { remain_time = m_pItem->GetExpireTime(); } else { remain_time = m_pItem->GetExpireTime() - time( NULL ); } } // 어쨋든 Insert 하면 지금 당장 DB 업데이트분까지 반영이 되었으므로 플래그 Off m_pItem->TurnOffDbUpdateFlag(); insertItemToDB( db, m_pItem->GetItemUID(), m_pItem->GetOwnerUID(), m_pItem->GetAccountID(), m_pItem->GetOwnSummonUID(), m_pItem->GetAuctionID(), m_pItem->GetItemKeepingID(), m_pItem->GetItemCode(), m_pItem->GetPreviousUID(), *m_pItem->GetInstanceFlag().GetRawData(), m_pItem->GetCount(), m_pItem->GetItemLevel( true ), m_pItem->GetItemEnhance(), m_pItem->GetCurrentEtherealDurability(), m_pItem->GetCurrentEndurance(), m_pItem->GetSocketCode( 0 ), m_pItem->GetSocketCode( 1 ), m_pItem->GetSocketCode( 2 ), m_pItem->GetSocketCode( 3 ), m_pItem->GetGenerateCode(), remain_time, m_pItem->GetElementalEffectType(), m_pItem->GetElementalEffectExpireTime(), m_pItem->GetElementalEffectAttackPoint(), m_pItem->GetElementalEffectMagicPoint(), m_pItem->GetAppearanceCode(), m_pItem->GetSummonCode() ); return true; } bool DB_InsertItem::onProcess( DBConnection & db ) { try { if( !m_pItem->IsVirtualItem() ) proc( db ); } catch( ... ) { m_pItem->onEndQuery(); throw; } m_pItem->onEndQuery(); return true; }