#ifndef ALLSRV_STANDALONE

// fedsrvsql.h
// curtc
// sql stuff 

#define CSTATEMENTS 100 // we will assert if we add more statements than defined here
#define CCOLPARMMAX 20 // same for columns or parameters (combined)
enum SQLPARM
{
  SQL_IN_PARM,    // input parameters to sql statements OR stored procs
  SQL_OUT_PARM,   // output parameter to sql statement, NOT stored procedure
  SQL_OUT_PROC,   // stored proc return values or stored proc out-only parameters
  SQL_INOUT_PROC  // stored proc in/out parameters
};

class ISQLSite : public IObject
{
public:
  virtual int OnMessageBox(const char * strText, const char * strCaption, UINT nType) = 0;
};

SQLHSTMT AddStatement(SQLCHAR * scSQL);
int AddCol(void * pvBuff, SQLSMALLINT ssiCType, SQLPARM parmtype, int cbBuff);
SQLRETURN SqlGo(SQLHSTMT hstmt);
SQLRETURN SqlGetRow(SQLHSTMT hstmt);
int InitSql(char * szRegKey, ISQLSite * pSQLSite);
void ShutDownSQL();

// KGJV : added REGKEY so server & club dont share same reg key anymore
#define BEGIN_SQL_DEF(REGKEY,SQLSITE) \
  const int fooinitsql = InitSql(REGKEY /*HKLM_FedSrv*/, SQLSITE); // defining variable just so we can call function

#define END_SQL_DEF

#define DEF_STMT(NAME, SQL) \
  SQLHSTMT g_hstmt##NAME = AddStatement((SQLCHAR *) SQL); 

#define SQL_PARM(STORAGE, NAME, CTYPE, INOUT) \
  STORAGE NAME = AddCol(&NAME, CTYPE, INOUT, sizeof(STORAGE)) ? NAME : NAME; // big stupid hack to always call AddCol

#define SQL_STR_PARM(NAME, LENGTH, INOUT) \
  SQLCHAR NAME [LENGTH + 1] = {AddCol(NAME, SQL_C_CHAR, INOUT, LENGTH + 1)};

#define SQL_INT4_PARM(NAME, INOUT)\
  SQL_PARM(SQLINTEGER, NAME, SQL_C_LONG, INOUT)

#define SQL_INT2_PARM(NAME, INOUT) \
  SQL_PARM(SQLSMALLINT, NAME, SQL_C_SHORT, INOUT)

#define SQL_INT1_PARM(NAME, INOUT) \
  SQL_PARM(SQLCHAR, NAME, SQL_C_TINYINT, INOUT)

#define SQL_FLT4_PARM(NAME, INOUT) \
  SQL_PARM(SQLREAL, NAME, SQL_C_FLOAT, INOUT)

#define SQL_FLT8_PARM(NAME, INOUT) \
  SQL_PARM(SQLFLOAT, NAME, SQL_C_DOUBLE, INOUT)

#define SQL_DATE_PARM(NAME, INOUT) \
  SQL_PARM(TIMESTAMP_STRUCT, NAME, SQL_C_TIMESTAMP, INOUT)

// Binary doesn't quite fit the pattern
#define SQL_BIN_PARM(NAME, LENGTH, INOUT) \
  SQLCHAR NAME[LENGTH] = {(char) AddCol(NAME, SQL_C_BINARY, INOUT, sizeof(NAME))};

#define SQL_GO(NAME) \
  SqlGo(g_hstmt##NAME)

#define SQL_GETROW(NAME) \
  SqlGetRow(g_hstmt##NAME)

#define FEDSTR(str) "ISNULL(RTRIM(" #str "), '~')"
#define FEDNUM(num) "ISNULL(" #num ", -1)"

void SqlStrCpy(char * szDest, SQLCHAR * szSrc, unsigned int cbSrc);

// but all the sql strings are fixed length, so give them a shortcut
#define SQLSTRCPY(szDest, szSrc) SqlStrCpy((szDest), (szSrc), sizeof(szSrc))


#endif // !ALLSRV_STANDALONE