aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/shared/Database/QueryResult.cpp54
-rwxr-xr-xsrc/server/shared/Database/QueryResult.h8
2 files changed, 42 insertions, 20 deletions
diff --git a/src/server/shared/Database/QueryResult.cpp b/src/server/shared/Database/QueryResult.cpp
index 93c685e0447..9a0cf6293c6 100644
--- a/src/server/shared/Database/QueryResult.cpp
+++ b/src/server/shared/Database/QueryResult.cpp
@@ -108,21 +108,27 @@ enum Field::DataTypes ResultSet::ConvertNativeType(enum_field_types mysqlType) c
void ResultBind::BindResult(uint32& num_rows)
{
FreeBindBuffer();
- m_fieldCount = mysql_stmt_field_count(m_stmt);
- if (!m_fieldCount)
+
+ m_res = mysql_stmt_result_metadata(m_stmt);
+ if (!m_res)
return;
- m_rBind = new MYSQL_BIND[m_fieldCount];
- memset(m_rBind, 0, sizeof(MYSQL_BIND) * m_fieldCount);
+ m_fieldCount = mysql_stmt_field_count(m_stmt);
- m_isNull = new my_bool[m_fieldCount];
- memset(m_isNull, 0, sizeof(my_bool) * m_fieldCount);
+ if (m_stmt->bind_result_done)
+ {
+ delete[] m_stmt->bind->length;
+ delete[] m_stmt->bind->is_null;
+ }
+ m_rBind = new MYSQL_BIND[m_fieldCount];
+ m_isNull = new my_bool[m_fieldCount];
m_length = new unsigned long[m_fieldCount];
+
+ memset(m_isNull, 0, sizeof(my_bool) * m_fieldCount);
+ memset(m_rBind, 0, sizeof(MYSQL_BIND) * m_fieldCount);
memset(m_length, 0, sizeof(unsigned long) * m_fieldCount);
- m_res = mysql_stmt_result_metadata(m_stmt);
-
//- This is where we store the (entire) resultset
if (mysql_stmt_store_result(m_stmt))
{
@@ -136,11 +142,9 @@ void ResultBind::BindResult(uint32& num_rows)
while ((field = mysql_fetch_field(m_res)))
{
size_t size = SizeForType(field);
- if (size == 0)
- size = field->max_length + 1;
m_rBind[i].buffer_type = field->type;
- m_rBind[i].buffer = new char[size];
+ m_rBind[i].buffer = malloc(size);
memset(m_rBind[i].buffer, 0, size);
m_rBind[i].buffer_length = size;
m_rBind[i].length = &m_length[i];
@@ -155,6 +159,9 @@ void ResultBind::BindResult(uint32& num_rows)
if (mysql_stmt_bind_result(m_stmt, m_rBind))
{
sLog.outSQLDriver("%s:mysql_stmt_bind_result, cannot bind result from MySQL server. Error: %s", __FUNCTION__, mysql_stmt_error(m_stmt));
+ delete[] m_rBind;
+ delete[] m_isNull;
+ delete[] m_length;
return;
}
@@ -164,18 +171,13 @@ void ResultBind::BindResult(uint32& num_rows)
void ResultBind::FreeBindBuffer()
{
for (uint32 i = 0; i < m_fieldCount; ++i)
- {
- delete[] (char *) m_rBind[i].buffer;
- m_rBind[i].buffer = NULL;
- }
- m_rBind = NULL;
+ free (m_rBind[i].buffer);
}
void ResultBind::CleanUp()
{
FreeBindBuffer();
- delete[] m_isNull;
- delete[] m_length;
+ mysql_stmt_free_result(m_stmt);
}
uint8 PreparedResultSet::GetUInt8(uint32 index)
@@ -234,6 +236,22 @@ float PreparedResultSet::GetFloat(uint32 index)
return *reinterpret_cast<float*>(rbind->m_rBind[index].buffer);
}
+uint64 PreparedResultSet::GetUInt64(uint32 index)
+{
+ if (!CheckFieldIndex(index))
+ return 0;
+
+ return *reinterpret_cast<uint64*>(rbind->m_rBind[index].buffer);
+}
+
+int64 PreparedResultSet::GetInt64(uint32 index)
+{
+ if (!CheckFieldIndex(index))
+ return 0;
+
+ return *reinterpret_cast<int64*>(rbind->m_rBind[index].buffer);
+}
+
std::string PreparedResultSet::GetString(uint32 index)
{
if (!CheckFieldIndex(index))
diff --git a/src/server/shared/Database/QueryResult.h b/src/server/shared/Database/QueryResult.h
index 7a503869cb1..bb1a4684acc 100755
--- a/src/server/shared/Database/QueryResult.h
+++ b/src/server/shared/Database/QueryResult.h
@@ -101,15 +101,17 @@ class ResultBind
friend class PreparedResultSet;
public:
- ResultBind(MYSQL_STMT* stmt) : m_rBind(NULL), m_stmt(stmt), m_isNull(NULL), m_length(NULL), m_fieldCount(0) {}
+ ResultBind(MYSQL_STMT* stmt) : m_rBind(NULL), m_stmt(stmt), m_isNull(NULL), m_length(NULL), m_res(NULL), m_fieldCount(0) {}
~ResultBind()
{
+ if (m_res)
+ mysql_free_result(m_res); // metadata
+
if (!m_fieldCount)
return;
CleanUp(); // Clean up buffer
- mysql_stmt_free_result(m_stmt);
}
void BindResult(uint32& num_rows);
@@ -205,6 +207,8 @@ class PreparedResultSet
int16 GetInt16(uint32 index);
uint32 GetUInt32(uint32 index);
int32 GetInt32(uint32 index);
+ uint64 GetUInt64(uint32 index);
+ int64 GetInt64(uint32 index);
float GetFloat(uint32 index);
std::string GetString(uint32 index);