Added SQL_SetCharset native to (re)set character set (bug 5999, r=ds).
This commit is contained in:
parent
19e160117f
commit
3d732bbbb6
|
@ -16,6 +16,7 @@ void FreeConnection(void *p, unsigned int num)
|
|||
free(cn->user);
|
||||
free(cn->pass);
|
||||
free(cn->db);
|
||||
free(cn->charset);
|
||||
|
||||
delete cn;
|
||||
}
|
||||
|
@ -59,6 +60,7 @@ static cell AMX_NATIVE_CALL SQL_MakeDbTuple(AMX *amx, cell *params)
|
|||
{
|
||||
sql->max_timeout = static_cast<unsigned int>(params[5]);
|
||||
}
|
||||
sql->charset = NULL;
|
||||
|
||||
unsigned int num = MakeHandle(sql, Handle_Connection, FreeConnection);
|
||||
|
||||
|
@ -92,6 +94,7 @@ static cell AMX_NATIVE_CALL SQL_Connect(AMX *amx, cell *params)
|
|||
nfo.port = sql->port;
|
||||
nfo.host = sql->host;
|
||||
nfo.max_timeout = sql->max_timeout;
|
||||
nfo.charset = sql->charset;
|
||||
|
||||
char buffer[512];
|
||||
int errcode;
|
||||
|
@ -585,6 +588,37 @@ static cell AMX_NATIVE_CALL SQL_QuoteStringFmt(AMX *amx, cell *params)
|
|||
}
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL SQL_SetCharset(AMX *amx, cell *params)
|
||||
{
|
||||
SQL_Connection *sql = (SQL_Connection *)GetHandle(params[1], Handle_Connection);
|
||||
if (!sql)
|
||||
{
|
||||
IDatabase *pDb = (IDatabase *)GetHandle(params[1], Handle_Database);
|
||||
if (!pDb)
|
||||
{
|
||||
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid info tuple or database handle: %d", params[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int len;
|
||||
return pDb->SetCharacterSet(MF_GetAmxString(amx, params[2], 0, &len));
|
||||
}
|
||||
else
|
||||
{
|
||||
int len;
|
||||
const char *charset = MF_GetAmxString(amx, params[2], 0, &len);
|
||||
|
||||
if (!sql->charset || stricmp(charset, sql->charset))
|
||||
{
|
||||
sql->charset = strdup(charset);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO g_BaseSqlNatives[] =
|
||||
{
|
||||
{"SQL_MakeDbTuple", SQL_MakeDbTuple},
|
||||
|
@ -610,6 +644,7 @@ AMX_NATIVE_INFO g_BaseSqlNatives[] =
|
|||
{"SQL_QuoteString", SQL_QuoteString},
|
||||
{"SQL_QuoteStringFmt", SQL_QuoteStringFmt},
|
||||
{"SQL_NextResultSet", SQL_NextResultSet},
|
||||
{"SQL_SetCharset", SQL_SetCharset},
|
||||
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
|
|
@ -138,6 +138,13 @@ namespace SourceMod
|
|||
* on internal failure.
|
||||
*/
|
||||
virtual int QuoteString(const char *str, char buffer[], size_t maxlen, size_t *newsize) =0;
|
||||
|
||||
/**
|
||||
* @brief Sets the character set of the current connection
|
||||
*
|
||||
* @param characterset The characterset to switch to. e.g. "utf8".
|
||||
*/
|
||||
virtual bool SetCharacterSet(const char *characterset) =0;
|
||||
};
|
||||
|
||||
struct DatabaseInfo
|
||||
|
@ -149,6 +156,7 @@ namespace SourceMod
|
|||
const char *pass;
|
||||
unsigned int port;
|
||||
unsigned int max_timeout;
|
||||
const char *charset;
|
||||
};
|
||||
|
||||
class ISQLDriver
|
||||
|
|
|
@ -83,4 +83,7 @@ int MysqlDatabase::QuoteString(const char *str, char buffer[], size_t maxlen, si
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool MysqlDatabase::SetCharacterSet(const char *characterset)
|
||||
{
|
||||
return mysql_set_character_set(m_pMysql, characterset) == 0 ? true : false;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ namespace SourceMod
|
|||
IQuery *PrepareQueryFmt(const char *fmt, va_list ap);
|
||||
IQuery *PrepareQuery(const char *query);
|
||||
int QuoteString(const char *str, char buffer[], size_t maxlen, size_t *newsize);
|
||||
bool SetCharacterSet(const char *characterset);
|
||||
private:
|
||||
void Disconnect();
|
||||
private:
|
||||
|
|
|
@ -72,6 +72,11 @@ IDatabase *MysqlDriver::_Connect(DatabaseInfo *info, int *errcode, char *error,
|
|||
|
||||
MysqlDatabase *pMysql = new MysqlDatabase(mysql, this);
|
||||
|
||||
if (info->charset && *info->charset)
|
||||
{
|
||||
pMysql->SetCharacterSet(info->charset);
|
||||
}
|
||||
|
||||
return static_cast<IDatabase *>(pMysql);
|
||||
}
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ struct SQL_Connection
|
|||
char *db;
|
||||
int port;
|
||||
unsigned int max_timeout;
|
||||
char *charset;
|
||||
};
|
||||
|
||||
typedef void (*FREEHANDLE)(void *, unsigned int);
|
||||
|
|
|
@ -82,6 +82,7 @@ static cell AMX_NATIVE_CALL SQL_ThreadQuery(AMX *amx, cell *params)
|
|||
kmThread->SetForward(fwd);
|
||||
kmThread->SetQuery(MF_GetAmxString(amx, params[3], 1, &len));
|
||||
kmThread->SetCellData(MF_GetAmxAddr(amx, params[4]), (ucell)params[5]);
|
||||
kmThread->SetCharacterSet(cn->charset);
|
||||
|
||||
g_pWorker->MakeThread(kmThread);
|
||||
|
||||
|
@ -139,6 +140,11 @@ void MysqlThread::SetInfo(const char *host, const char *user, const char *pass,
|
|||
m_qrInfo.queue_time = gpGlobals->time;
|
||||
}
|
||||
|
||||
void MysqlThread::SetCharacterSet(const char *charset)
|
||||
{
|
||||
m_charset.assign(charset);
|
||||
}
|
||||
|
||||
void MysqlThread::SetQuery(const char *query)
|
||||
{
|
||||
m_query.assign(query);
|
||||
|
@ -154,6 +160,7 @@ void MysqlThread::RunThread(IThreadHandle *pHandle)
|
|||
info.host = m_host.c_str();
|
||||
info.port = m_port;
|
||||
info.max_timeout = m_max_timeout;
|
||||
info.charset = m_charset.c_str();
|
||||
|
||||
float save_time = m_qrInfo.queue_time;
|
||||
|
||||
|
|
|
@ -63,6 +63,7 @@ public:
|
|||
~MysqlThread();
|
||||
public:
|
||||
void SetInfo(const char *host, const char *user, const char *pass, const char *db, int port, unsigned int max_timeout);
|
||||
void SetCharacterSet(const char *charset);
|
||||
void SetQuery(const char *query);
|
||||
void SetCellData(cell data[], ucell len);
|
||||
void SetForward(int forward);
|
||||
|
@ -78,6 +79,7 @@ private:
|
|||
SourceHook::String m_pass;
|
||||
SourceHook::String m_db;
|
||||
unsigned int m_max_timeout;
|
||||
SourceHook::String m_charset;
|
||||
int m_port;
|
||||
cell *m_data;
|
||||
ucell m_datalen;
|
||||
|
|
|
@ -137,6 +137,13 @@ namespace SourceMod
|
|||
* on internal failure.
|
||||
*/
|
||||
virtual int QuoteString(const char *str, char buffer[], size_t maxlen, size_t *newsize) =0;
|
||||
|
||||
/**
|
||||
* @brief Sets the character set of the current connection
|
||||
*
|
||||
* @param characterset The characterset to switch to. e.g. "utf8".
|
||||
*/
|
||||
virtual bool SetCharacterSet(const char *characterset) =0;
|
||||
};
|
||||
|
||||
struct DatabaseInfo
|
||||
|
@ -148,6 +155,7 @@ namespace SourceMod
|
|||
const char *pass;
|
||||
unsigned int port;
|
||||
unsigned int max_timeout;
|
||||
const char *charset;
|
||||
};
|
||||
|
||||
class ISQLDriver
|
||||
|
|
|
@ -78,3 +78,9 @@ int SqliteDatabase::QuoteString(const char *str, char buffer[], size_t maxlen, s
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool SqDatabase::SetCharacterSet(const char *characterset)
|
||||
{
|
||||
// sqlite only supports utf8 and utf16 - by the time the database is created. It's too late here.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ namespace SourceMod
|
|||
IQuery *PrepareQueryFmt(const char *fmt, va_list ap);
|
||||
IQuery *PrepareQuery(const char *query);
|
||||
int QuoteString(const char *str, char buffer[], size_t maxlen, size_t *newsize);
|
||||
bool SqDatabase::SetCharacterSet(const char *characterset);
|
||||
private:
|
||||
void Disconnect();
|
||||
private:
|
||||
|
|
|
@ -54,6 +54,22 @@ native SQL_FreeHandle(Handle:h);
|
|||
native Handle:SQL_Connect(Handle:cn_tuple, &errcode, error[], maxlength);
|
||||
|
||||
|
||||
/**
|
||||
* Sets the character set of the current connection.
|
||||
* Like SET NAMES .. in mysql, but stays after connection problems.
|
||||
*
|
||||
* If a connection tuple is supplied, this should be called before SQL_Connect or SQL_ThreadQuery.
|
||||
* Also note the change will remain until you call this function with another value.
|
||||
*
|
||||
* Example: "utf8", "latin1"
|
||||
*
|
||||
* @param h Database or connection tuple Handle.
|
||||
* @param charset The character set string to change to.
|
||||
* @return True, if character set was changed, false otherwise.
|
||||
*/
|
||||
native bool:SQL_SetCharset(Handle:h, const charset[]);
|
||||
|
||||
|
||||
/**
|
||||
* Prepares a query.
|
||||
* The query must always be freed.
|
||||
|
|
Loading…
Reference in New Issue
Block a user