 /* ====================================================================
 *<
 * 파    일 :	sqlGameStmt.h
 * 목    적 :	
 * 작 성 자 :	곽철중
 * 작 성 일 :	07/01/12
 * 주의사항 :	
 * =================================================================== */
#ifndef __SQL_GAME_STATEMENT_H__
#define __SQL_GAME_STATEMENT_H__

//#ifndef WINVER
//#define WINVER          0x0500
//#endif
//
//#ifndef _WIN32_WINNT
//#define _WIN32_WINNT    0x0500
//#endif

#pragma once
#include "odbcsql.h"
#include "gamesrvdefines.h"
#include "MakeSkill_Common.h"

struct INIT_GAME
{
	long channelNum;
	long removeCoolTimeCount;
	long removeSTallSellCount;
};

struct SHUTDOWN_GAME
{
	long channelNum;
	long removeCoolTimeCount;
	long removeSTallSellCount;
};

struct VERIFY_ITEM_TABLE
{
	long count;
	long retvalue;
};
struct ITEM_DEFINE_TABLE
{
	long           idx;
	TB_ITEM_DEFINE table[1];
};

struct ITEM_ABILITY_TABLE
{
	long            idx;
	TB_ITEM_ABILITY table[1];
};

struct ITEM_COOLTIME2_TABLE
{
	long              idx;
	long              rowCount;
	TB_ITEM_COOLTIME1 table[1];
};

struct ITEM_LIMIT_TABLE
{
	long          idx;
	TB_ITEM_LIMIT table[1];
};

struct ITEM_CARD_TABLE
{
	long         idx;
	TB_ITEM_CARD table[1];
};

struct ITEM_CARD_SLOT_TABLE
{
	long              idx;
	TB_ITEM_CARD_SLOT table[1];
};

struct ITEM_TAROT_TABLE
{
	long          idx;
	TB_ITEM_TAROT table[1];
};

struct ITEM_ENHANCED_TABLE
{
	long             idx;
	TB_ITEM_ENHANCED table[1];
};

struct ITEM_ENHANCED_RATE_TABLE
{
	long                  idx;
	TB_ITEM_ENHANCED_RATE table[1];
};

struct ITEM_DISJOINT_TABLE
{
	long             idx;
	TB_ITEM_DISJOINT table[1];
};

struct ITEM_CHANGE_TABLE
{
	long           idx;
	TB_ITEM_CHANGE table[1];
};

struct VERIFY_DEFAULT_ITEMS
{
	long rowCount;
	long retvalue;
};

struct CHARACTER_LIST
{
	long         userIdx;				// [In]  사용자 인덱스
	long         rowCount;				// [Out] 적용된 행의 수
	TB_CHARACTER table[1];				// [Out] 캐릭터 테이블
};

struct CHARACTER_SELECT
{
	long         characterIdx;			// [In]  캐릭터 인덱스
	long         userIdx;				// [In]  사용자 인덱스
	TB_CHARACTER character;				// [Out] 캐릭터 테이블
};

struct CHARACTER_NAME
{
	wchar_t name[17];					// [In]  캐릭터 이름
	long    retvalue;					// [Out] 결과
};

struct CHARACTER_INSERT
{
	long    idx;						// [Out] 캐릭터 고유번호
	wchar_t name[17];					// [In]  캐릭터 이름
	char    race;						// [In]  캐릭터 종족
	char    gender;						// [In]  캐릭터 성별
	long    job;						// [In]  캐릭터 직업
							
	long    hair;						// [In]  캐릭터 헤어
	long    face;						// [In]  캐릭터 얼굴
							
	float   xPos;						// [In]  캐릭터 X위치
	float   yPos;						// [In]  캐릭터 Y위치
							
	long    hp;							// [In]  HP 기본값
	long    mp;							// [In]  MP 기본값
							
	char    standIdx;					// [In]  생성위치
	long    userIdx;					// [In]  사용자 고유번호
	long    retvalue;					// [Out] 결과
							
	long         rowCount;				// [Out] 영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

struct CHARACTER_DELETE
{
	long  idx;							// [In]  캐릭터 고유번호
	long  userIdx;						// [In]  사용자 고유번호
	long  retvalue;						// [Out] 결과
};

struct CHARACTER_UPDATE
{
	long  idx;							// [In]  캐릭터 고유번호
	short mapNumber;					// [In]  맵 번호
	float xPos;							// [In]  X위치 (소수점 포함)
	float yPos;							// [In]  Y위치 "
	long  exp;							// [In]  경험치
	long  skillExp;						// [In]  스킬 경험치
	long  hp;							// [In]  HP
	long  mp;							// [In]  MP
	long  tarotPoint;					// [In]  타로 포인트
	long  titleIndex;					// [In]  호칭 인덱스
	long  guildIndex;					// [In]  길드 인덱스
	char  guildPosition;				// [In]  길드 직위
	long  retvalue;						// [Out] 결과
};

struct CHARACTER_EQUIP
{
	long idx;							// [In]  캐릭터 고유번호
	long hat;							// [In]  착용중인 아이템 - 모  자
	long body1;							// [In]  "               - 상  의
	long body2;							// [In]  "               - 하  의
	long hand;							// [In]  "               - 장  갑
	long foot;							// [In]  "               - 신  발
	long earring;						// [In]  "               - 귀걸이
	long necklace;						// [In]  "               - 목걸이
	long brooch;						// [In]  "               - 브로치
	long bracelet;						// [In]  "               - 팔  찌
	long ring;							// [In]  "               - 반  지
	long leftHand;						// [In]  "               - 왼  손
	char leftHandEnhanced;				// [In]  "               - 왼  손 강화
	long rightHand;						// [In]  "               - 오른손
	char rightHandEnhanced;				// [In]  "               - 오른손 강화
};

struct CHARACTER_LEVEL
{
	unsigned long	idx;				// [In] 캐릭터 고유번호
	unsigned char	level;				// [In] 캐릭터 레벨
	unsigned char	levelUpPoint;		// [In] 캐릭터 레벨 증가값
	long			retvalue;			// [Out] 반환값
};

struct CHARACTER_SKILLLEVEL
{
	unsigned long	idx;				// [In] 캐릭터 고유번호
	unsigned char	skillLevel;			// [In] 캐릭터 스킬 레벨
	unsigned char	levelUpPoint;		// [In] 캐릭터 스킬 레벨 증가값
	unsigned long	skillPoint;			// [In] 캐릭터 스킬 포인트
	unsigned long	skillTotal;			// [In] 캐릭터 스킬 포인트 총 획득량
	long			skillUpPoint;		// [In] 캐릭터 스킬 포인트 증가값
	long			retvalue;			// [Out] 반환값
};

struct CHARACTER_SKILL_RESET
{
	unsigned long	mCharacterIdx;		// [In] 캐릭터 고유번호
	char			mRace;				// [In]	종족
	unsigned char	mJobStep;			// [In] 단계
	long			mInventoryIdx;		// [In] 인벤토리 고유번호
	long			mRetvalue;			// [Out] 반환값

	long				mRowCount;		// [Out]	영향받은 행 수
	TB_CHARACTER_SKILL	mTable[1];		// [Out] TB_CHARACTER_SKILL
};

struct CHARACTER_MONEY
{
	// DB 처리를 위한 데이터.
	long          idx;					// [In]  캐릭터 고유번호
	__int64       money;				// [In]  변경금액 (부호포함)

	// LOG 처리를 위한 데이터.
	long          objectType;			// [In]  Object 종    류 - 출처
	long          objectIndex;			// [In]  Object 인 덱 스 - 출처
	long          objectRaceGender;     // [In]  Object Detail   - 출처
	unsigned long befor;				// [In]  변경전
	unsigned long after;				// [In]  변경후

	// DB 처리후 결과 데이터.
	long          retvalue;				// [Out] 반환값
};

struct CHARACTER_DEPOSIT
{
	// DB 처리를 위한 데이터.
	long          idx;					// [In]  캐릭터 고유번호
	__int64       money;				// [In]  변경금액 (부호포함)

	// LOG 처리를 위한 데이터.
	long          objectType;			// [In]  Object 종    류 - 출처
	long          objectIndex;			// [In]  Object 인 덱 스 - 출처
	long          objectRaceGender;     // [In]  Object Detail   - 출처
	unsigned long befor;				// [In]  변경전
	unsigned long after;				// [In]  변경후

	// DB 처리후 결과 데이터.
	long          retvalue;				// [Out] 반환값
};

struct CHARACTER_TAROT_POINT
{
	long idx;							// [In]  캐릭터 고유번호
	long point;							// [In]  변경포인트 (부호포함)
};

struct CHARACTER_PVP_POINT
{
	long idx;							// [In]  캐릭터 고유번호
	long point;							// [In]  변경포인트 (부호포함)
};

struct CHARACTER_ACTIVE_WEAPON
{
	long idx;							// [In]  캐릭터 고유번호
	char activeWeapon;					// [In]  캐릭터 활성 무기정보 (0 Front, 1Back)
	long retvalue;						// [Out] 반환값
};

struct CHARACTER_OPTION
{
	long idx;							// [In]  캐릭터 고유번호
	long option1;						// [In]  캐릭터 옵션1
	long retvalue;						// [Out] 반환값
};

struct CHARACTER_FORCE
{
	unsigned long		mIdx;			// [In]  캐릭터 고유번호
	unsigned char		mForceType;		// [In]  세력
	long				mRetValue;		// [Out] 반환값
};

struct CHARACTER_BLOCK_SELECT
{
	long characterIdx;					// [In]  캐릭터 고유번호
	int  rowCount;						// [In]  적용행수(적용여부)
	long validTrue;						// [In]  유효만기(분 단위)
};

struct CHARACTER_BLOCK_INSERT
{
	long blockCharacterIdx;				// [In]  블록 캐릭터 고유번호
	long adminCharacterIdx;	            // [In]  관리 캐릭터 고유번호
	long validTrue;						// [In]  유효만기(분 단위)
};

/*-- 아이템 / 인벤토리
*/
enum INVENTORY_WARNING
{
	IW_ERROR_DUPLICATE_NUMBER = 0,		// 인벤토리 번호(슬롯) 중복
	IW_ERROR_ITEM_DEFINE_INDEX,			// 아이템 정의 인덱스 오류
	IW_ERROR_UNDER_COUNT,				// 인벤토리 수량 오류
};
struct INVENTORY_INSERT
{
	long         characterIdx;			// [In]     캐릭터 고유번호
	long         rowCount;				// [In]  영향받은 행 수
	TB_INVENTORY table[1];				// [In/Out] TB_INVENTORY 레코드
};

struct INVENTORY_SELECT
{
	long         characterIdx;			// [In]  캐릭터 고유번호
	long         rowCount;				// [In]  영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_DELETE
{
	INVENTORY_WARNING	 warning;		// [In]  삭제원인
	long				 characterIdx;	// [In]  캐릭터 고유번호
	long				 inventoryIdx;	// [In]  고유번호
	TB_INVENTORY		 table;			// [Out] TB_INVENTORY 레코드
	long				 retvalue;		// [Out] 결과
};

struct INVENTORY_COOLTIME_SELECT
{
	long                  characterIdx;	// [In]  캐릭터 고유번호
	long                  rowCount;		// [In]  영향받은 행 수
	TB_INVENTORY_COOLTIME table[1];		// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_COOLTIME_INSERT
{
	long                  characterIdx;	// [In]  캐릭터 고유번호
	TB_INVENTORY_COOLTIME table[1];		// [In]  TB_INVENTORY 레코드
};

struct INVENTORY_USE
{
	long          idx;					// [In]  고유번호
	TB_INVENTORY  table[1];				// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_REMOVE
{
	long  idx;							// [In]  고유번호
	short number;						// [In]  번호
	long  retvalue;						// [Out] 결과

	TB_INVENTORY table;					// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_SWAP
{
	long  idx1;							// [In]  고유번호
	short number1;						// [In]  번호

	long  idx2;							// [In]  고유번호
	short number2;						// [In]  번호

	TB_INVENTORY table[2];				// [In/Out] TB_INVENTORY 레코드
	long         retvalue;				// [Out] 결과
};

struct INVENTORY_MOVE
{
	long         characterIdx;			// [In]  캐릭터 고유번호
	long         idx;					// [In]  고유번호
	short        number;				// [In]  이동할 번호
	TB_INVENTORY table;					// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_EXCEPT
{
	long         characterIdx;			// [In]  캐릭터 고유번호
	long         idx;					// [In]  고유번호
	short        number;				// [In]  이동할 번호
	TB_INVENTORY table;					// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_MERGE
{
	long         idx1;					// [In]  고유번호1
	long         idx2;					// [In]  고유번호2

	long         rowCount;				// [Out] 영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_DIVIDE
{
	long         characterIdx;			// [In]  캐릭터 고유번호
	long         rowCount;				// [In]  영향받은 행 수
	TB_INVENTORY table[2];				// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_MOVE2
{
	long         characterIdx;			// [In]  캐릭터 고유번호
	long         rowCount;				// [In]  영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

#define RESULT_INVENTORY_ENHANCED_SUCCESS	0	// 성공
#define RESULT_INVENTORY_ENHANCED_DOWN		1	// 감소
#define RESULT_INVENTORY_ENHANCED_DESTRUCT	2	// 파괴
#define RESULT_INVENTORY_ENHANCED_FAIL		3	// 실패

struct INVENTORY_ENHANCED
{
	long         idx1;					// [In]  고유번호 (강화장비)
	long         idx2;					// [In]  고유번호 (강화카드)
	char         result;				// [In]  결과(0성공/1감소/2파괴/3없음)
	long         retvalue;				// [Out] 반환값
	TB_INVENTORY table[2];				// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_DISJOINT
{
	// 분해아이템
	long characterIdx;					// [In]  캐릭터 고유번호
	long characterMoney;				// [In]  캐릭터 변경금액 (부호포함)
	long retvalue;						// [In]  [Out] 결과

	long         rowCount;				// [Out] 영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_PUT_CARD
{
	long         idx1;					// [In]  고유번호1(장비)
	BYTE         cardSlot;              // [In]  카드슬롯 번호(1~5)
	long         idx2;					// [In]  고유번호2(카드)
	long         itemDefineIndex;		// [In]  아이템 인덱스(TB_ITEM_DEFINE::INDEX [기획:분류번호])
	long         retvalue;				// [Out] 반환값
	TB_INVENTORY table[2];				// [Out] TB_INVENTORY 레코드
};

struct INVENTORY_CHANGE
{
	// 교환아이템
	long characterIdx;					// [In]  캐릭터 고유번호
	long characterMoney;				// [In]  캐릭터 변경금액 (부호포함)
	long retvalue;						// [In]  [Out] 결과

	long         rowCount;				// [Out] 영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

struct ITEM_SELL
{
	long         characterIdx;			// [In]  캐릭터 고유번호
	long         npcIdx;				// [In]  NPC    고유번호
	long         sellType;				// [In]  판매방식
	long         sellPrice;				// [In]  판매가격

	long         rowCount;				//  
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

struct ITEM_BUY
{
	long         characterIdx;			// [In]  캐릭터   고유번호
	long         npcIdx;				// [In]  NPC      고유번호
	long         buyType;				// [In]  구입방식
	long         buyPrice;				// [In]  구입가격

	long         rowCount;				// [In]  영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

struct ITEM_COLLECT
{
	struct {
		long         inventoryIdx;		// [In]  인벤토리 고유번호
		TB_INVENTORY table;				// [Out] TB_INVENTORY 레코드
	} update;

	struct {
		long         inventoryIdx;		// [In]  인벤토리 고유번호
		TB_INVENTORY table;				// [Out] TB_INVENTORY 레코드
	} remove;
	short inventoryNumber1;				// [In]  인벤토리 번호
	short inventoryNumber2;				// [In]  인벤토리 번호
	long retvalue;						// [Out] 결과
};

struct ITEM_GET
{
	long             characterIdx;		// [In]  캐릭터   고유번호

	long             rowCount;			// [In]  영향받은 행 수
	struct {
		bool         newOrUpdate;		// [In]  갱신 또는 생성(0 new, 1 update)
		long         itemDefineIndex;	// [In]  아이템 정의 인덱스
		short        inventoryNumber;	// [In]  인벤토리 번호
		short        count;				// [In]  수량

		long         retvalue;			// [Out] 반환값
		TB_INVENTORY table;				// [Out] TB_INVENTORY 레코드
	} table[ 1 ];
};

struct ITEM_GET_QUEST
{
	long         characterIdx;			// [In]  캐릭터   고유번호
	bool         newOrUpdate;			// [In]  갱신 또는 생성(0 new, 1 update)
	long         itemDefineIndex;		// [In]  아이템 정의 인덱스
	short        inventoryNumber;		// [In]  인벤토리 번호
	short        count;					// [In]  수량

	long         retvalue;				// [Out] 반환값
	TB_INVENTORY table;					// [Out] TB_INVENTORY 레코드
};

struct ITEM_USE
{
	long             characterIdx;		// [In]  캐 릭 터 고유번호
	long             rowCount;			// [In]  영향받은 행 수
	struct {
		long         inventoryIdx;		// [In]  인벤토리 고유번호
		short        count;				// [In]  수량

		long         retvalue;			// [Out] 반환값
		TB_INVENTORY table;				// [Out] TB_INVENTORY 레코드
	} table[ 1 ];
};


/*-- 거래
*/
struct ITEM_EXCHANGE
{
	long rowCount;
	struct {
		long         characterIdx;		// [In]     캐릭터 고유번호
		long         characterMoney;	// [In]     변경금액(부호포함)
		long         characterFrom;		// [In]     캐릭터 고유번호(대상)
		long         characterBefor;	// [In]     캐릭터 변경전 금액
		long         characterAfter;	// [In]     캐릭터 변경후 금액
		long         retvalue;			// [Out]    반환값

		long         rowCount;						// [In]     영향받은 행 수
		TB_INVENTORY table[ MAX_ITEM_EXCHANGE ];	// [In&Out] TB_INVENTORY 레코드
	} table[ 2 ];
};

/*-- 아이템 조합
*/
struct ITEM_MIX
{
	long         characterIdx;			// [In]  캐릭터   고유번호
	long         rowCount;				// [In]  영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};


/*-- 쪽지
*/
struct NOTE_SELECT
{
	long    characterIdx;				// [In] 캐릭터 고유번호
	long    rowCount;					// [Out] 영향받은 행 수
	TB_NOTE table[1];					// TB_NOTE 레코드
};

struct NOTE_INSERT
{
	long    characterIdx1;				// [In]  보낸 캐릭터(고유번호)
	long    characterIdx2;				// [Out] 받는 캐릭터(고유번호)
	wchar_t characterName2[ 17 ];		// [In]  받는 캐릭터(이름)
	wchar_t message[ 200 ];				// [In]  메시지
	long    retvalue;					// [Out] 결과

	TB_NOTE	table;						// [Out] 쪽지 내용
};

struct GUILDNOTE_INSERT
{
	long    characterIdx1;				// [In]  보낸 캐릭터(고유번호)

	wchar_t message[ 200 ];				// [In]  메시지
	long    characterIdx2[50];			// [In] 받는 캐릭터(고유번호)

	long    rowCount;					// [In]  영향받은 행 수
	TB_NOTE	table[1];					// [Out] 쪽지 내용
};

struct NOTE_DELETE
{
	long    characterIdx;				// [In]  캐릭터 고유번호
	long    rowCount;					// [In]  영향받은 행 수
	long    idx[ 1 ];					// [In]  고유번호
};

struct FRIEND_SELECT
{
	long      characterIdx;				// [In]  캐릭터 고유번호
	long      rowCount;					// [Out] 영향받은 행 수
	TB_FRIEND table[1];					// [Out] TB_FRIEND 레코드
};

struct FRIEND_INSERT
{
	long    characterIdx1;				// [In]  캐릭터(고유번호)
	long    characterIdx2;				// [Out] 캐릭터(고유번호)
	wchar_t characterName[ 17 ];		// [In]  캐릭터 이름(친구)
	long    retvalue;					// [Out] 결과
};

struct FRIEND_UPDATE
{
	long    idx;						// [In]  고유번호
	long    characterIdx1;				// [In]  캐릭터 고유번호
	long    characterIdx2;				// [Out] 캐릭터(고유번호)
};

struct FRIEND_DELETE
{
	long    idx;						// [In]  고유번호
	long    characterIdx1;				// [In]  캐릭터 고유번호
	long    characterIdx2;				// [Out] 캐릭터(고유번호)
};

/*-- Etc
*/
struct ITEM_SPREAD_VALUE
{
	long  itemDefineIndex;              // [In]  TB_ITEM_DEFINE::Index-아 이 템 인덱스
	long  spreadIndex;					// [In]  TB_ITEM_SPREAD::Index-스프레드 인덱스
	long  spreadValue;					// [Out] 스트레드 적용후 타로카드 값
	struct
	{
		long  itemDefineIndex;			// [In]  타로카드 인덱스
		BYTE  dir;						// [In]  타로카드 방향
		long  tarot;					// [In]  타로카드 값
		long  spread;					// [In]  스프레드 값
	} values[ 10 ];

};

struct ITEM_TAROT_RESULT
{
	long itemDefineIndex;				// [In]  TB_ITEM_DEFINE::Index 아이템 인덱스
	long value;							// [In]  입력값(타로결과값)

	long influence_idx1;				// [Out] 스킬효과[스킬인덱스참조]
	long influence_idx2;				// [Out] 스킬효과[스킬인덱스참조]
	long influence_idx3;				// [Out] 스킬효과[스킬인덱스참조]
};

// 스킬
struct SKILL_SELECT
{
	long				mCharacterIdx;	// [In]	캐릭터 고유번호
	long				mRowCount;		// [Out]	영향받은 행 수
	TB_CHARACTER_SKILL	mTable[1];		// [Out]	TB_CHARACTER_SKILL
};

struct SKILL_INSERT
{
	unsigned long		mCharacterIdx;	// [In]	캐릭터 고유번호
	unsigned long		mSkillClassIdx;	// [In]	스킬 종류번호
	unsigned long		mMoney;			// [In]	소모금액
	unsigned short		mSP;			// [In]	소모SP
	unsigned char		skillLevel;		// [In] 스킬 레벨
	unsigned long		skillPoint;		// [In] 스킬 포인트
	long				mRetvalue;		// [Out]	결과
};

struct SKILL_UPDATE
{
	unsigned long		mCharacterIdx;	// [In]	캐릭터 고유번호
	unsigned long		mSkillClassIdx;	// [In]	스킬 종류번호
	unsigned char		mSkillStep;		// [In]	스킬 단계
	unsigned long		mMoney;			// [In]	소모금액
	unsigned short		mSP;			// [In]	소모SP
	unsigned char		skillLevel;		// [In] 스킬 레벨
	unsigned long		skillPoint;		// [In] 스킬 포인트
	long				mRetvalue;		// [Out]	결과
};

struct SKILL_COOLTIME
{
	unsigned long		mCharacterIdx;	// [In]	캐릭터 고유번호
	long				mRowCount;		// [Out]	입력 행 수
	long				mRetvalue;		// [Out]	결과
	TB_CHARACTER_SKILL	mTable[1];		// [Out]	TB_CHARACTER_SKILL
};


// 효과
struct SKILL_INFLUENCE_SELECT
{
	long				mCharacterIdx;	// [In]	캐릭터 고유번호
	long				mRowCount;		// [Out]	영향받은 행 수
	TB_CHARACTER_INFLUENCE	mTable[1];	// [Out]	TB_CHARACTER_INFLUENCE
};

struct SKILL_INFLUENCE_DELETE
{
	unsigned long		mCharacterIdx;	// [In]	캐릭터 고유번호
	long				mRetvalue;		// [Out]	결과
};

struct SKILL_INFLUENCE_INSERT
{
	unsigned long		mCharacterIdx;	// [In]	캐릭터 고유번호
	long				mRowCount;		// [Out]	입력 행 수
	long				mRetvalue;		// [Out]	결과
	TB_CHARACTER_INFLUENCE	mTable[1];	// [In]	TB_CHARACTER_INFLUENCE
};

struct RECIPE_COOLTIME
{
	unsigned long		mCharacterIdx;	// [In]	캐릭터 고유번호
	long				mRowCount;		// [Out]	입력 행 수
	long				mRetvalue;		// [Out]	결과
	TB_RECIPE_COOLTIME	mTable[1];		// [Out]	TB_CHARACTER_SKILL
};

struct STALL_SELL_SEARCH
{
	long          channelNum;			// [In]  채널 번호
	long          itemDefineIndex;		// [In]  아이템 정의 인덱스
	BYTE          enhanced;				// [In]  강화단계
	long          rowCount;				// [Out] 영향받은 행 수
	TB_STALL_SELL table[ 1 ];			// [Out] TB_STALL_SELL 레코드
};

struct STALL_SELL_INSERT
{
	long channelNum;					// [In]  채널번호
	long characterIdx;					// [In]  캐릭터 고유번호
	long inventoryIdx;					// [In]  인벤토리 고유번호
	long itemDefineIndex;				// [In]  아이템 정의 인덱스
	BYTE enhanced;						// [In]  강화단계
	long price;							// [In]  가격
	long retvalue;						// [Out] 반환값
};

struct STALL_SELL_REMOVE
{
	long inventoryIdx;					// [In]  캐릭터 고유번호
	long retvalue;						// [Out] 반환값
};

struct STALL_SELL_CLEAR
{
	long characterIdx;					// [In]  캐릭터 고유번호
	long retvalue;						// [Out] 반환값
};

struct STALL_SELL_GET
{
	long         fCharacterIdx;		// [In]  캐 릭 터 고유번호
	sObject      fObject;           // [In]  캐 릭 터 오프젝트 정보
	long         fCharacterMoney;	// [In]  캐 릭 터 변경금액 (부호포함)
	long         fInventoryIdx;		// [In]  인벤토리 고유번호
	TB_INVENTORY fInventory;		// [Out] TB_INVENTORY 레코드

	long         tCharacterIdx;		// [In]  캐 릭 터 고유번호
	long         tCharacterMoney;	// [In]  캐 릭 터 변경금액 (부호포함)
	short        tInventoryNumber;	// [In]  인벤토리 번호(슬롯)
	short        tInventoryCount;	// [In]  인벤토리 수량
	TB_INVENTORY tInventory;		// [Out] TB_INVENTORY 레코드

	long         retvalue;				// [Out] 반환값
};

/*-- 큇슬롯
*/
struct SHORTCUT_SELECT
{
	long        characterIdx;			// [In]  캐릭터 고유번호
	long		rowCount;				// [Out] select 카운트
	TB_SHORTCUT table;					// [In]  TB_SHORTCUT
};

struct SHORTCUT_UPDATE
{
	long        characterIdx;			// [In]  캐릭터 고유번호
	TB_SHORTCUT table;					// [In]  TB_SHORTCUT
};

/*-- 퀘스트
*/
struct QUEST_INSERT
{
	long    characterIdx;				// [In]  캐릭터 고유번호
	long	questIdx;					//
	__int64 check;						// [In]  정보 업뎃
	char	timeType;					// [In]  퀘스트 시간 타입
	long	restTime;					// [In]  퀘스트 남은시간
	long	retvalue;					// [Out] 결과

	TB_QUEST_PROGRESS quest;			// [Out] TB_QUEST_PROGRESS 레코드

	long         rowCount;				// [In/Out] 영향받은 행 수
	TB_INVENTORY inventory[1];			// [In/Out] TB_INVENTORY 레코드
};

struct QUEST_INSERTBYITEM
{
	long    characterIdx;				// [In]  캐릭터 고유번호
	long	questIdx;					//
	__int64 check;						// [In]  정보 업뎃
	char	timeType;					// [In]  퀘스트 시간 타입
	long	restTime;					// [In]  퀘스트 남은시간
	long	retvalue;					// [Out] 결과

	TB_QUEST_PROGRESS quest;			// [Out] TB_QUEST_PROGRESS 레코드

	long         rowCount;				// [In]     영향받은 행 수
	TB_INVENTORY inventory[1];			// [In/Out] TB_INVENTORY 레코드
};

struct QUEST_UPDATE
{
	long	characterIdx;				// [In]  캐릭터 고유번호
	long	rowCount;
	char	titmeType;					// [In]  시간제한 타입
	TB_QUEST_PROGRESS table[1];			// [In]  TB_QUEST_PROGRESS 레코드
};

struct QUEST_SELECT
{
	long	characterIdx;				// [In]  캐릭터 고유번호
	long	rowCount;
	TB_QUEST_PROGRESS table[1];
};

struct QUEST_DELETE
{
	long    idx;						// [In]  db 고유인덱스
	int		arrIdx;						// [In]  배열인덱스
	long	characterIdx;				// [In]  캐릭터 고유번호
	long	retvalue;					// [Out] 결과

	// 회수 [아이템]
	long         rowCount;				// [In]     영향받은 행 수
	TB_INVENTORY table[1];				// [In/Out] TB_INVENTORY 레코드
};

// 퀘스트 진행 완료 요청
struct QUEST_COMPLETE
{
	long idx;							// [In]  db 고유인덱스
	int  arrIdx;						// [In]  배열인덱스
	long characterIdx;					// [In]  캐릭터 고유번호
	char repeatType;					// [In]  반복타입
	char status;						// [Out] 상태값
	long retvalue;						// [Out] 결과

	/// 업데이트할 정보
	__int64 check;						// [In]  정보 업뎃

	// 회수 [아이템]
	long         rowCount;				// [Out] 영향받은 행 수
	TB_INVENTORY table[1];				// [Out] TB_INVENTORY 레코드
};

// 보상 및 완료 요청
struct QUEST_REWARD
{
	long idx;							// [In&out] db 고유인덱스
	int  arrIdx;						// [In]     배열인덱스
	long characterIdx;					// [In]     캐릭터 고유번호

	// 보상 [버  프]
	long bufRowCount;					// [In]     영향받은 행 수
	long bufIndex[ 3 ];					// [In]     버프인덱스

	// 보상 [금  액]
	long characterMoney;				// [In]     캐릭터 변경금액 (부호포함)

	// 보상 [전  직]
	long jobIdx;						// [In]     전직인덱스
	char race;							// [In]		종족
    
	// 보상 스킬
	unsigned int skillPoint;			// [In]		스킬 포인트

	// 보상 [세  력]
	unsigned char forceType;			// [In]     세력 타입

	// 보상 [호  칭]
	long titleIdx;						// [In]		호칭 인덱스

	// 보상 [아이템]
	long         itemRowCount;			// [In/Out] 영향받은 행 수
	TB_INVENTORY table[5];				// [In/Out] TB_INVENTORY 레코드
	
	char skillRowCount;					// [Out] 영향받은 행 수
	unsigned long skillClassIdx[1];		// [Out] 전직시 자동습득된 스킬목록
};

// 완전히 종료한 퀘스트 목록받기
struct QUEST_ENDLIST
{
	long	characterIdx;				// [In]  캐릭터 고유번호
	long	rowCount;
	long	questIdx[1];				// [Out] 결과	
};

// 퀘스트 제거
struct QUEST_REMOVE
{
	long idx;							// [In]  고유번호
};

/// 호칭 삽입
struct TITLE_INSERT
{
	long	characterIdx;				// [In] 캐릭터 인덱스
	long	titleIdx;					// [In] 호칭 인덱스
	long	retvalue;					// [Out] 결과
};

/// 호칭 리스트 받기
struct TITLE_SELECT
{
	long	characterIdx;				// [In] 캐릭터 인덱스
	long	rowCount;					// [Out] 영향받은 행수 
	TB_TITLE	table[1];				// [Out] TB_TITLE 레코드
};

struct VERIFY_GUILD
{
	long		 count;					// 실제로 존재하는 길드수
	long		 total;					// 전체 길드수
	long         retvalue;			
};

/// 분할 select
struct GUILD_SELECT
{
	long		 idx;					// [In] 고유번호 (길드 인덱스)
	TB_GUILD	 table[1];				// [Out] 길드 테이블
};

// 길드 유저 정보
struct GUILDUSER_SELECT
{
	long			idx;				// [In]  고유번호 (길드 인덱스)
	long			rowCount;			// [Out] 적용된 행의 수
	TB_GUILD_USER	table[1];			// [Out] 길드 유저 정보
};

// 길드 생성
struct GUILD_CREATE
{
	long	idx;						// [Out] 고유번호 (길드 인덱스)
	long	characterIdx;				// [In] 캐릭터 인덱스
	wchar_t name[13];					// [In] 길드명
	wchar_t masterName[17];				// [In] 길드장 명
	long	money;						// [In] 길드생성 금액
	long	retvalue;					// [Out] 결과	
};

// 길드원 추가
struct GUILDUSER_ADD
{
	long	idx;						// [In] 고유번호 (길드 인덱스)
	long	charaterIdx;				// [In] 캐릭터 인덱스
	long	retvalue;					// [Out] 결과	
};

// 길드원 삭제
struct GUILDUSER_OUT
{
	long	idx;						// [In] 고유번호 (길드 인덱스)
	long	charaterIdx;				// [In] 캐릭터 인덱스
	long	retvalue;					// [Out] 결과	
};

// 길드 해체
struct GUILD_DELETE
{
	long	idx;						// [In] 고유번호 (길드 인덱스)
	long	charaterIdx;				// [In] 캐릭터 인덱스
	long	retvalue;					// [Out] 결과	
};

// 길드정보 갱신
struct GUILD_UPDATE
{
	long	idx;						// [In] 고유번호 (길드 인덱스)
	wchar_t notice[41];					// [In] 길드 공지
	long	retvalue;					// [Out] 결과	
};

// 길드유저 직위 부여
struct GUILDUSER_GIVEPOSITION
{
	long	idx;						// [In] 고유번호 (길드 인덱스)	
	long	characterIdx;				// [In] 캐릭터 인덱스
	char	position;					// [In] 변경할 직위
	long	retvalue;					// [Out] 결과	
};

// 길드마크 갱신
struct GUILDMARK_UPDATE
{
	long			idx;						// [In] 길드인덱스
	long			markIdx;					// [In] 길드마크 인덱스
	TB_GUILDMARK	mark;						// [In] 길드마크 24 * 24 * (32/8)
	long			retvalue;					// [Out] 결과
};

// 제조스킬
struct MAKESKILL_INSERT
{
	unsigned long	mCharacterIdx;		// [In] 캐릭터 고유번호
	bool			mIsFirstSkill;		// [In] 2개 직업중 1,2번 위치
	unsigned char	mMakeSkillIdx;		// [In] 전문 직업 스킬 idx	
	long			mInventoryIdx;		// [In] 인벤토리 고유번호
	long			mRetvalue;			// [Out] 결과
	TB_INVENTORY	mInventory;			// [Out] TB_INVENTORY 레코드
};

struct MAKESKILL_SELECT
{
	unsigned long	mCharacterIdx;		// [In]		캐릭터 고유번호
	long			mRowCount;			// [Out]	영향받은 행 수
	TB_MAKESKILL	mTable[1];			// [Out]	TB_MAKESKILL
};

struct MAKESKILL_DELETE
{
	unsigned long	mCharacterIdx;		// [In]		캐릭터 고유번호
	unsigned char	mMakeSkillIdx;		// [In]		전문직업
	long			mRetvalue;			// [Out]	결과	
};

struct RECIPE_INSERT
{
	unsigned long	mCharacterIdx;		// [In] 캐릭터 고유번호
	unsigned char	mMakeSkillIdx;		// [In] 전문 직업 스킬 idx	
	unsigned long	mRecipeIdx;			// [In] 레시피 idx
	long			mInventoryIdx;		// [In] 인벤토리 고유번호
	long			retvalue;			// [Out] 결과
	TB_INVENTORY	mInventory;			// [Out] TB_INVENTORY 레코드
};

struct RECIPE_GROUP_INSERT
{
	unsigned long	mCharacterIdx;		// [In] 캐릭터 고유번호
	unsigned char	mMakeSkillIdx;		// [In] 전문 직업 스킬 idx	
	long			mInventoryIdx;		// [In] 인벤토리 고유번호
	TB_INVENTORY	mInventory;			// [Out] TB_INVENTORY 레코드
	long			mRetvalue;			// [Out] 결과
	unsigned long	mRowCnt;			// [in] 레시피 입력 갯수
	sRecipeGroupInfo mRecipeGroup[1];	// [In] 레시피 idx

	unsigned long GetMsgLength() { return sizeof(RECIPE_GROUP_INSERT) - sizeof(mRecipeGroup) + (mRowCnt * sizeof(sRecipeGroupInfo));} 
};

/// 운세 속성
struct FORTUNE_SELECT
{
	long				characterIdx;				// [In] 캐릭터 인덱스
	TIMESTAMP_STRUCT	thru[5];					// [Out] 결과	
	wchar_t				word[13];					// [Out] 오늘의 한마디
	unsigned long		color;						// [Out] 오늘의 한마디 컬러
};

struct FORTUNE_UPDATE
{
	long				characterIdx;				// [In] 캐릭터 인덱스
	TIMESTAMP_STRUCT	thru[5];					// [In] 시간정보	
	wchar_t				word[13];					// [In] 오늘의 한마디
	unsigned long		color;						// [In] 오늘의 한마디 컬러
	long				retvalue;					// [Out] 결과
};

class cSQLGameStmt :
	public cSQLStatement
{
private:
	SQLRETURN SQLClose                 ( SQLRETURN sqlReturn, SQLHSTMT sqlHStmt );
	void      SQLClose                 ( SQLHSTMT sqlHStmt );

	void      SQLGetFullInv            ( SQLHSTMT sqlHStmt, TB_INVENTORY* table );
	void      SQLGetBaseInv            ( SQLHSTMT sqlHStmt, TB_INVENTORY* table );

public:
// 클래스 생성 및 공용 메소드.
	cSQLGameStmt(void);

	// Init Game Database
	SQLRETURN Init                     ( INIT_GAME* initGame );

	// Shutdown Game Database
	SQLRETURN Shutdown                 ( SHUTDOWN_GAME* shutdownGame );

	// Item
	SQLRETURN TruncateItemDefine       ( void );
	SQLRETURN TruncateItemAbility      ( void );
	SQLRETURN TruncateItemLimit        ( void );
	SQLRETURN TruncateItemCard         ( void );
	SQLRETURN TruncateItemCardSlot     ( void );
	SQLRETURN TruncateItemTarot        ( void );
	SQLRETURN TruncateItemTarotResult  ( void );
	SQLRETURN TruncateItemSpread       ( void );
	SQLRETURN TruncateItemDisjoint     ( void );
	SQLRETURN TruncateItemEnhanced     ( void );
	SQLRETURN TruncateItemEnhancedRate ( void );
	SQLRETURN TruncateItemChange       ( void );
	SQLRETURN TruncateDefaultItems     ( void );

	SQLRETURN InsertItemDefine         ( TB_ITEM_DEFINE* tbItemDefine, long& retvalue );
	SQLRETURN InsertItemAbility        ( TB_ITEM_ABILITY* tbItemAbility, long& retvalue );
	SQLRETURN InsertItemLimit          ( TB_ITEM_LIMIT* tbItemLimit, long& retvalue );
	SQLRETURN InsertItemCard           ( TB_ITEM_CARD* tbItemCard, long& retvalue );
	SQLRETURN InsertItemCardSlot       ( TB_ITEM_CARD_SLOT* tbItemCardSlot, long& retvalue );
	SQLRETURN InsertItemTarot          ( TB_ITEM_TAROT* tbItemTarot, long& retvalue );
	SQLRETURN InsertItemTarotResult    ( TB_ITEM_TAROT_RESULT* tbItemTarotResult, long& retvalue );
	SQLRETURN InsertItemSpread         ( TB_ITEM_SPREAD* tbItemSpread, long& retvalue );
	SQLRETURN InsertItemDisjoint       ( TB_ITEM_DISJOINT* tbItemDisjoint, long& retvalue );
	SQLRETURN InsertItemEnhanced       ( TB_ITEM_ENHANCED* tbItemEnhanced, long& retvalue );
	SQLRETURN InsertItemEnhancedRate   ( TB_ITEM_ENHANCED_RATE* tbItemEnhancedRate, long& retvalue );
	SQLRETURN InsertItemChange         ( TB_ITEM_CHANGE* tbItemChange, long& retvalue );
	SQLRETURN InsertDefaultItems       ( TB_DEFAULT_ITEMS* tbDefaultItems, long& retvalue );

	SQLRETURN VerifyItemDefine         ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemAbility        ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemCooltime2      ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemLimit          ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemCard           ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemCardSlot       ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemTarot          ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemEnhanced       ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemEnhancedRate   ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemDisjoint       ( VERIFY_ITEM_TABLE* verifyItemTable );
	SQLRETURN VerifyItemChange         ( VERIFY_ITEM_TABLE* verifyItemTable );

	SQLRETURN ItemDefine               ( ITEM_DEFINE_TABLE* itemDefineTable );
	SQLRETURN ItemAbility              ( ITEM_ABILITY_TABLE* itemAbilityTable );
	SQLRETURN ItemCooltime2            ( ITEM_COOLTIME2_TABLE* itemCooltime2Table, u_long& cbLength );
	SQLRETURN ItemLimit                ( ITEM_LIMIT_TABLE* itemLimitTable );
	SQLRETURN ItemCard                 ( ITEM_CARD_TABLE* itemCardTable );
	SQLRETURN ItemCardSlot             ( ITEM_CARD_SLOT_TABLE* itemCardSlotTable );
	SQLRETURN ItemTarot                ( ITEM_TAROT_TABLE* itemTarotTable );
	SQLRETURN ItemEnhanced             ( ITEM_ENHANCED_TABLE* itemEnhancedTable );
	SQLRETURN ItemEnhancedRate         ( ITEM_ENHANCED_RATE_TABLE* itemEnhancedRateTable );
	SQLRETURN ItemDisjoint             ( ITEM_DISJOINT_TABLE* itemDisjointTable );
	SQLRETURN ItemChange               ( ITEM_CHANGE_TABLE* itemChangeTable );

	SQLRETURN VerifyDefaultItems       ( VERIFY_DEFAULT_ITEMS* verifyDefaultItems );

	// Character
	SQLRETURN CharacterList            ( CHARACTER_LIST* characterList, u_long& cbLength );
	SQLRETURN CharacterName            ( CHARACTER_NAME* characterName );
	SQLRETURN CharacterInsert          ( CHARACTER_INSERT* characterInsert, u_long& cbLength );
	SQLRETURN CharacterDelete          ( CHARACTER_DELETE* characterDelete );
	SQLRETURN CharacterUpdate          ( CHARACTER_UPDATE* characterUpdate );
	SQLRETURN CharacterSelect          ( CHARACTER_SELECT* characterSelect );
	SQLRETURN CharacterEquip           ( CHARACTER_EQUIP* characterEquip );
	SQLRETURN CharacterMoney           ( CHARACTER_MONEY* characterMoney );
	SQLRETURN CharacterDeposit         ( CHARACTER_DEPOSIT* characterDeposit );
	SQLRETURN CharacterTarotPoint      ( CHARACTER_TAROT_POINT* characterTarotPoint );
	SQLRETURN CharacterPvpPoint        ( CHARACTER_PVP_POINT* characterPvpPoint );
	SQLRETURN CharacterLevel           ( CHARACTER_LEVEL* characterLevel );
	SQLRETURN CharacterSkillLevel      ( CHARACTER_SKILLLEVEL* characterSkillLevel );
	SQLRETURN CharacterActiveWeapon    ( CHARACTER_ACTIVE_WEAPON* characterActiveWeapon );
	SQLRETURN CharacterOption          ( CHARACTER_OPTION* characterOption );
	SQLRETURN CharacterForce           ( CHARACTER_FORCE* characterForce );
	SQLRETURN CharacterSkillReset      ( CHARACTER_SKILL_RESET* reset, u_long& cbLength );
	SQLRETURN CharacterBlockSelect     ( CHARACTER_BLOCK_SELECT* characterBlockSelect );
	SQLRETURN CharacterBlockInsert     ( CHARACTER_BLOCK_INSERT* characterBlockInsert );

	// Inventory&Item
	SQLRETURN InventoryInsert          ( INVENTORY_INSERT* inventoryInsert );
	SQLRETURN InventorySelect          ( INVENTORY_SELECT* inventorySelect, u_long& cbLength );
	SQLRETURN InventoryDelete          ( INVENTORY_DELETE* inventoryDelete );
	SQLRETURN InventoryCooltimeSelect  ( INVENTORY_COOLTIME_SELECT* inventoryCooltimeSelect, u_long& cbLength );
	SQLRETURN InventoryCooltimeInsert  ( INVENTORY_COOLTIME_INSERT* inventoryCooltimeInsert );
	SQLRETURN InventoryRemove          ( INVENTORY_REMOVE* inventoryRemove );
	SQLRETURN InventoryUse             ( INVENTORY_USE* inventoryUse );
	SQLRETURN InventorySwap            ( INVENTORY_SWAP* inventorySwap );
	SQLRETURN InventoryMove            ( INVENTORY_MOVE* inventoryMove );
	SQLRETURN InventoryExcept          ( INVENTORY_EXCEPT* inventoryExcept );
	SQLRETURN InventoryMerge           ( INVENTORY_MERGE* inventoryMerge, u_long& cbLength );
	SQLRETURN InventoryDivide          ( INVENTORY_DIVIDE* inventoryDivide );
	SQLRETURN InventoryMove2           ( INVENTORY_MOVE2* inventoryMove2 );
	SQLRETURN InventoryEnhanced        ( INVENTORY_ENHANCED* inventoryEnhanced );
	SQLRETURN InventoryDisjoint        ( INVENTORY_DISJOINT* inventoryDisjoint );
	SQLRETURN InventoryPutCard         ( INVENTORY_PUT_CARD* inventoryPutCard );
	SQLRETURN InventoryChange          ( INVENTORY_CHANGE* inventoryChange );
	SQLRETURN ItemSell                 ( ITEM_SELL* itemSell );
	SQLRETURN ItemBuy                  ( ITEM_BUY* itemBuy );
	SQLRETURN ItemCollect              ( ITEM_COLLECT* itemCollect );
	SQLRETURN ItemGet                  ( ITEM_GET* itemGet );
	SQLRETURN ItemGetQuest             ( ITEM_GET_QUEST* itemGetQuest );
	SQLRETURN ItemUse                  ( ITEM_USE* itemUse );
	SQLRETURN ItemExchange             ( ITEM_EXCHANGE* itemExchange );
	SQLRETURN ItemMix                  ( ITEM_MIX* itemMix );

	// Note
	SQLRETURN NoteSelect               ( NOTE_SELECT* noteSelect, u_long& cbLength );
	SQLRETURN NoteInsert               ( NOTE_INSERT* noteInsert );
	SQLRETURN NoteDelete               ( NOTE_DELETE* noteDelete );
	SQLRETURN GuildNoteInsert          ( GUILDNOTE_INSERT* guildNoteInsert );

	// Friend
	SQLRETURN FriendSelect             ( FRIEND_SELECT* friendSelect, u_long& cbLength );
	SQLRETURN FriendInsert             ( FRIEND_INSERT* friendInsert );
	SQLRETURN FriendUpdate             ( FRIEND_UPDATE* friendUpdate );
	SQLRETURN FriendDelete             ( FRIEND_DELETE* friendDelete );
	
	// 캐릭터 SKILL
	SQLRETURN SkillSelect              ( SKILL_SELECT* skillSelect, u_long& cbLength );
	SQLRETURN SkillInsert              ( SKILL_INSERT* skillInsert );
	SQLRETURN SkillUpdate              ( SKILL_UPDATE* skillUpdate );
	SQLRETURN SkillCoolTime            ( SKILL_COOLTIME* skillCoolTime );

	// 캐릭터 스킬 효과
	SQLRETURN SkillInfluenceSelect     ( SKILL_INFLUENCE_SELECT* influenceSelect, u_long& cbLength );
	SQLRETURN SkillInfluenceDelete     ( SKILL_INFLUENCE_DELETE* influenceDelete );
	SQLRETURN SkillInfluenceInsert     ( SKILL_INFLUENCE_INSERT* influenceInsert );
	// Skill 스크립트
	SQLRETURN TruncateSkillListPc      ( void );
	SQLRETURN SkillListPcInsert        ( void* pPlayerSkillBaseInfo );
	// 직업별 기본스킬 스크립트
	SQLRETURN TruncateDefalultSkill    ( void );
	SQLRETURN DefalultSkillInsert      ( unsigned long jobStep, unsigned long skillIdx, unsigned char race );

	/// 퀘스트 정보
	SQLRETURN TruncateQuestDefine      ( void );
	SQLRETURN TruncateQuestProgress    ( void );

	SQLRETURN InsertQuestDefine        ( void* questDefine );
	
	SQLRETURN QuestInsert              ( QUEST_INSERT* questInsert );
	SQLRETURN QuestInsertByItem        ( QUEST_INSERTBYITEM* questInsert );
	SQLRETURN QuestSelect              ( QUEST_SELECT* questSelect, u_long& cbLength );
	SQLRETURN QuestDelete              ( QUEST_DELETE* questDelete );
	SQLRETURN QuestComplete            ( QUEST_COMPLETE* questComplete );
	SQLRETURN QuestReward              ( QUEST_REWARD* questReward, u_long& cbLength );
	SQLRETURN QuestUpdate              ( QUEST_UPDATE* questUpdate );
	SQLRETURN QuestEndListSelect       ( QUEST_ENDLIST* questEndList, u_long& cbLength );
	SQLRETURN QuestRemove              ( QUEST_REMOVE* questRemove );
	
	// Etc
	SQLRETURN ItemSpreadValue          ( ITEM_SPREAD_VALUE* itemSpreadValue );
	SQLRETURN ItemTarotResult          ( ITEM_TAROT_RESULT* itemTarotResult );

	// 노점 [판매 / 구입]
	SQLRETURN StallSellSearch          ( STALL_SELL_SEARCH* stallSellSearch, u_long& cbLength );
	SQLRETURN StallSellInsert          ( STALL_SELL_INSERT* stallSellInsert );
	SQLRETURN StallSellRemove          ( STALL_SELL_REMOVE* stallSellRemove );
	SQLRETURN StallSellClear           ( STALL_SELL_CLEAR* stallSellClear );
	SQLRETURN StallSellGet             ( STALL_SELL_GET* stallSellGet );

	// 큇슬롯
	SQLRETURN ShortcutSelect           ( SHORTCUT_SELECT* shortcutSelect );
	SQLRETURN ShortcutUpdate           ( SHORTCUT_UPDATE* shortcutUpdate );

	/// 호칭
	SQLRETURN TitleInsert			   ( TITLE_INSERT* titleInsert );
	SQLRETURN TitleSelect			   ( TITLE_SELECT* titleSelect, u_long& cbLength );

	/// 길드
	SQLRETURN VerifyGuild			   ( VERIFY_GUILD* verifyGuild );
	SQLRETURN GuildSelect			   ( GUILD_SELECT* guildSelect );
	SQLRETURN GuildUserSelect		   ( GUILDUSER_SELECT* guildUserSelect, u_long& cbLength );

	SQLRETURN GuildCreate			   ( GUILD_CREATE* guildCreate );
	SQLRETURN GuildDelete			   ( GUILD_DELETE* guildDelete );
	SQLRETURN GuildUpdate			   ( GUILD_UPDATE* guildUpdate );
	SQLRETURN GuildUserAdd			   ( GUILDUSER_ADD* guildUserAdd );
	SQLRETURN GuildUserOut			   ( GUILDUSER_OUT* guildUserOut );
	SQLRETURN GuildUserGivePosition	   ( GUILDUSER_GIVEPOSITION* guildUserGivePosition );
	SQLRETURN GuildMarkUpdate		   ( GUILDMARK_UPDATE* guildMarkUpdate );

	/// 전문직업
	SQLRETURN MakeSkillInsert          ( MAKESKILL_INSERT* pInsert );
	SQLRETURN MakeSkillSelect          ( MAKESKILL_SELECT* pSelect, u_long& cbLength );
	SQLRETURN MakeSkillDelete          ( MAKESKILL_DELETE* pDelete );
	SQLRETURN RecipeInsert             ( RECIPE_INSERT* pInsert );
	SQLRETURN RecipeGroupInsert        ( RECIPE_GROUP_INSERT* pRecipeGroup );
	SQLRETURN RecipeCoolTime           ( RECIPE_COOLTIME* recipeCoolTime );

	/// NPC 점집 운세
	SQLRETURN FortuneSelect			   ( FORTUNE_SELECT* fortuneSelect );
	SQLRETURN FortuneUpdate			   ( FORTUNE_UPDATE* fortuneUpdate );

public:
// 클래스 파괴 메소드.
	virtual ~cSQLGameStmt(void);
};

inline SQLRETURN cSQLGameStmt::SQLClose(SQLRETURN sqlReturn, SQLHSTMT sqlHStmt)
{
	if ( SQL_SUCCEEDED( sqlReturn ) )
	{
		while ( SQLMoreResults( sqlHStmt ) == SQL_SUCCESS );	// 저장프로시저 쿼리 마무리.
		SQLCloseCursor( sqlHStmt );								// 열려있는 결과 닫기.
	}
	return sqlReturn;
}
inline void cSQLGameStmt::SQLClose(SQLHSTMT sqlHStmt)
{
	while ( SQLMoreResults( sqlHStmt ) == SQL_SUCCESS );		// 저장프로시저 쿼리 마무리.
	SQLCloseCursor( sqlHStmt );									// 열려있는 결과 닫기.
}

// SQLGetFullInv Method
inline void cSQLGameStmt::SQLGetFullInv(SQLHSTMT sqlHStmt, TB_INVENTORY* table)
{
	SQLINTEGER  strLenOrInd;
	SQLSMALLINT param;

	SQLGetData( sqlHStmt, param=1, SQL_C_SLONG,   &table->idx,             0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->itemDefineIdx,   0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->itemDefineIndex, 0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SSHORT,  &table->number,          0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SSHORT,  &table->count,           0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_TINYINT, &table->enhanced,        0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot1,       0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot2,       0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot3,       0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot4,       0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot5,       0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_TINYINT, &table->seal,            0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_TINYINT, &table->apply,           0, &(strLenOrInd=0) );
}

// SQLGetBaseInv Method
inline void cSQLGameStmt::SQLGetBaseInv(SQLHSTMT sqlHStmt, TB_INVENTORY* table)
{
	SQLINTEGER  strLenOrInd;
	SQLSMALLINT param;

	SQLGetData( sqlHStmt, param=1, SQL_C_SLONG,   &table->idx,             0, &(strLenOrInd=0) );
//	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->itemDefineIdx,   0, &(strLenOrInd=0) ); SKIP
	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->itemDefineIndex, 0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SSHORT,  &table->number,          0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_SSHORT,  &table->count,           0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_TINYINT, &table->enhanced,        0, &(strLenOrInd=0) );
//	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot1,       0, &(strLenOrInd=0) ); SKIP
//	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot2,       0, &(strLenOrInd=0) ); SKIP
//	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot3,       0, &(strLenOrInd=0) ); SKIP
//	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot4,       0, &(strLenOrInd=0) ); SKIP
//	SQLGetData( sqlHStmt, ++param, SQL_C_SLONG,   &table->cardSlot5,       0, &(strLenOrInd=0) ); SKIP
	SQLGetData( sqlHStmt, ++param, SQL_C_TINYINT, &table->seal,            0, &(strLenOrInd=0) );
	SQLGetData( sqlHStmt, ++param, SQL_C_TINYINT, &table->apply,           0, &(strLenOrInd=0) );
}

#endif // __SQL_GAME_STATEMENT_H__
