Date: Friday, March 24, 2006 @ 14:00:37
Author: zsolt
Path: /cvsroot/carob/libmysequoia/src
Modified: CarobMySQL.cpp (1.65 -> 1.66) CarobStmt.cpp (1.29 -> 1.30)
ConverterException is now caught and treated correctly.
----------------+
CarobMySQL.cpp | 538 ++++++++++++++++++++++++++++++-------------------------
CarobStmt.cpp | 281 ++++++++++++++++------------
2 files changed, 465 insertions(+), 354 deletions(-)
Index: libmysequoia/src/CarobMySQL.cpp
diff -u libmysequoia/src/CarobMySQL.cpp:1.65
libmysequoia/src/CarobMySQL.cpp:1.66
--- libmysequoia/src/CarobMySQL.cpp:1.65 Fri Mar 24 10:02:40 2006
+++ libmysequoia/src/CarobMySQL.cpp Fri Mar 24 14:00:37 2006
@@ -154,7 +154,7 @@
if (!passwd)
passwd = "";
}
-
+
if (!port)
{
port = mysqlPtr->options.port;
@@ -162,80 +162,89 @@
port = 25322;
}
- /* set the default character set if not set */
- if (!mysqlPtr->options.charset_name || !*mysqlPtr->options.charset_name)
- {
- mysqlPtr->options.charset_name = cstrdup("latin1");
- }
- /* send it to the server */
- conv.set_code(mysqlPtr->options.charset_name);
-
- /* Check for delayed connection. If db name not given, the connection can't
happen, because sequoia doesn't support it.
- * The real connection will happen after the user call the command
mysql_select_db or mysql_real_connect */
- if (!db || !*db)
+ try
{
- db = mysqlPtr->options.db;
- if (!db || !*db)
+ /* set the default character set if not set */
+ if (!mysqlPtr->options.charset_name || !*mysqlPtr->options.charset_name)
{
- delete_connection();
- set_connect_info(host, user, passwd, 0, port);
-
- LOG4CXX_DEBUG(logger, "Leaving connect (delayed connection.)");
- return true;
+ mysqlPtr->options.charset_name = cstrdup("latin1");
}
- }
-
- try
- {
- HostTokenizer ht(host);
- HostTokenizer::const_iterator hti = ht.begin();
-
- LOG4CXX_DEBUG(logger, "Connect (first host): host=" << hti->host << "
port=" << hti->port);
- port = hti->port;
- ConnectionParameters connectionParameters(to_wstring(hti->host),
hti->port,
- to_wstring(db), to_wstring(user), to_wstring(passwd), DEBUG_LEVEL_OFF,
ht.getPolicy(), DEFAULT_RETRY_INTERVAL, true);
- hti++;
+ /* send it to the server */
+ conv.set_code(mysqlPtr->options.charset_name);
- for (; hti != ht.end(); hti++)
+ /* Check for delayed connection. If db name not given, the connection
can't happen, because sequoia doesn't support it.
+ * The real connection will happen after the user call the command
mysql_select_db or mysql_real_connect */
+ if (!db || !*db)
{
- connectionParameters.addController(to_wstring(hti->host), hti->port);
- LOG4CXX_DEBUG(logger, "Connect (adding host): host=" << hti->host << "
port=" << hti->port);
- }
+ db = mysqlPtr->options.db;
+ if (!db || !*db)
+ {
+ delete_connection();
+ set_connect_info(host, user, passwd, 0, port);
- Connection *newConnectionPtr = new Connection(connectionParameters);
+ LOG4CXX_DEBUG(logger, "Leaving connect (delayed connection.)");
+ return true;
+ }
+ }
- if (newConnectionPtr)
+ try
{
- //TODO handle not enough memory
- delete_connection();
- set_connect_info(host, user, passwd, db, port);
-
- LOG4CXX_INFO(logger, "Connected: host=" << host << " user=" << user << "
passwd=" << passwd << " db=" << db << " port=" << port);
+ HostTokenizer ht(host);
+ HostTokenizer::const_iterator hti = ht.begin();
- reset_error();
-
- connectionPtr = newConnectionPtr;
+ LOG4CXX_DEBUG(logger, "Connect (first host): host=" << hti->host << "
port=" << hti->port);
+ port = hti->port;
+ ConnectionParameters connectionParameters(to_wstring(hti->host),
hti->port,
+ to_wstring(db), to_wstring(user), to_wstring(passwd), DEBUG_LEVEL_OFF,
ht.getPolicy(), DEFAULT_RETRY_INTERVAL, true);
+ hti++;
+
+ for (; hti != ht.end(); hti++)
+ {
+ connectionParameters.addController(to_wstring(hti->host), hti->port);
+ LOG4CXX_DEBUG(logger, "Connect (adding host): host=" << hti->host << "
port=" << hti->port);
+ }
+
+ Connection *newConnectionPtr = new Connection(connectionParameters);
- //try to execute the initial commands after each connection
- std::vector<std::string>::const_iterator iter;
- for (iter=init_cmd_list.begin(); iter != init_cmd_list.end(); iter++)
- real_query(iter->data(), iter->length());
+ if (newConnectionPtr)
+ {
+ //TODO handle not enough memory
+ delete_connection();
+ set_connect_info(host, user, passwd, db, port);
+
+ LOG4CXX_INFO(logger, "Connected: host=" << host << " user=" << user <<
" passwd=" << passwd << " db=" << db << " port=" << port);
+
+ reset_error();
+
+ connectionPtr = newConnectionPtr;
+
+ //try to execute the initial commands after each connection
+ std::vector<std::string>::const_iterator iter;
+ for (iter=init_cmd_list.begin(); iter != init_cmd_list.end(); iter++)
+ real_query(iter->data(), iter->length());
+ }
+
+ LOG4CXX_DEBUG(logger, "Leaving connect.");
+ return true;
+ }
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ //TODO error handling
+ LOG4CXX_DEBUG(logger, "Leaving connect.");
+ return false;
+ }
+ catch (HostTokenizerException &e)
+ {
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
+ //TODO error handling
+ LOG4CXX_DEBUG(logger, "Leaving connect.");
+ return false;
}
-
- LOG4CXX_DEBUG(logger, "Leaving connect.");
- return true;
- }
- catch (CarobException &e)
- {
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
- //TODO error handling
- LOG4CXX_DEBUG(logger, "Leaving connect.");
- return false;
}
- catch (HostTokenizerException &e)
+ catch (ConverterException &e)
{
set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
- //TODO error handling
LOG4CXX_DEBUG(logger, "Leaving connect.");
return false;
}
@@ -285,60 +294,68 @@
LOG4CXX_DEBUG(logger, "Leaving real_query: result=0");
return false;
}
-
- try {
- drsPtr = NULL;
-
- if (!stmtPtr)
- {
- stmtPtr = connectionPtr->createStatement();
- stmtPtr->setQueryTimeout(mysqlPtr->options.read_timeout);
- stmtPtr->setFetchSize(1);
- }
- FREE_AND_NULL_ARRAY(mysqlPtr->info);
-
- if (stmtPtr->execute(to_wstring(std::string(query,length))))
- {
- mysqlPtr->affected_rows = 0;
- drsPtr = stmtPtr->getResultSet();
- mysqlPtr->field_count = drsPtr ? drsPtr->getNumberOfColumns() : 0;
- mysqlPtr->status = MYSQL_STATUS_GET_RESULT;
- LOG4CXX_INFO(logger, "Executed query with result set. Field_count=" <<
mysqlPtr->field_count);
- }
- else
- {
- mysqlPtr->affected_rows = stmtPtr->getUpdateCount();
- mysqlPtr->status = MYSQL_STATUS_READY;
- mysqlPtr->field_count = 0;
-
- char info[100];
- snprintf(info, sizeof(info), "Records: %llu Duplicates: 0 Warnings:
0", mysqlPtr->affected_rows);
- info[sizeof(info)-1] = 0;
- mysqlPtr->info = cstrdup(info);
- LOG4CXX_INFO(logger, "Executed query. Affected_rows=" <<
mysqlPtr->affected_rows);
-
- //if there are no affected rows, the query need to be parsed, to see if
not a "set names ..." type
- if (parse && mysqlPtr->affected_rows == 0)
+ try {
+ try {
+ drsPtr = NULL;
+
+ if (!stmtPtr)
{
- const char *p = query, *q = 0;
- if (string_match(p, "set") && string_match(p, "names") && (q =
get_next_string(p)) && (p - q < MAX_CHARSET_LEN))
+ stmtPtr = connectionPtr->createStatement();
+ stmtPtr->setQueryTimeout(mysqlPtr->options.read_timeout);
+ stmtPtr->setFetchSize(1);
+ }
+
+ FREE_AND_NULL_ARRAY(mysqlPtr->info);
+
+ if (stmtPtr->execute(to_wstring(std::string(query,length))))
+ {
+ mysqlPtr->affected_rows = 0;
+ drsPtr = stmtPtr->getResultSet();
+ mysqlPtr->field_count = drsPtr ? drsPtr->getNumberOfColumns() : 0;
+ mysqlPtr->status = MYSQL_STATUS_GET_RESULT;
+ LOG4CXX_INFO(logger, "Executed query with result set. Field_count=" <<
mysqlPtr->field_count);
+ }
+ else
+ {
+ mysqlPtr->affected_rows = stmtPtr->getUpdateCount();
+ mysqlPtr->status = MYSQL_STATUS_READY;
+ mysqlPtr->field_count = 0;
+
+ char info[100];
+ snprintf(info, sizeof(info), "Records: %llu Duplicates: 0 Warnings:
0", mysqlPtr->affected_rows);
+ info[sizeof(info)-1] = 0;
+ mysqlPtr->info = cstrdup(info);
+ LOG4CXX_INFO(logger, "Executed query. Affected_rows=" <<
mysqlPtr->affected_rows);
+
+ //if there are no affected rows, the query need to be parsed, to see
if not a "set names ..." type
+ if (parse && mysqlPtr->affected_rows == 0)
{
- char charset[MAX_CHARSET_LEN+1];
- strncpy(charset,q,p-q); charset[p-q]=0;
- set_character_set(charset, false);
+ const char *p = query, *q = 0;
+ if (string_match(p, "set") && string_match(p, "names") && (q =
get_next_string(p)) && (p - q < MAX_CHARSET_LEN))
+ {
+ char charset[MAX_CHARSET_LEN+1];
+ strncpy(charset,q,p-q); charset[p-q]=0;
+ set_character_set(charset, false);
+ }
}
}
+
+ reset_error();
+
+ LOG4CXX_DEBUG(logger, "Leaving real_query: result=1");
+ return true;
+ }
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ LOG4CXX_DEBUG(logger, "Leaving real_query: result=0");
+ return false;
}
-
- reset_error();
-
- LOG4CXX_DEBUG(logger, "Leaving real_query: result=1");
- return true;
}
- catch (CarobException &e)
+ catch (ConverterException &e)
{
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
LOG4CXX_DEBUG(logger, "Leaving real_query: result=0");
return false;
}
@@ -359,79 +376,87 @@
}
try {
- if (stmtPtr)
- {
- MYSQL_RES *result = 0;
-
-// drsPtr = stmtPtr->getResultSet();
- if (drsPtr)
+ try {
+ if (stmtPtr)
{
- //TODO handle not enough memory (std::nothrow)
- result = new MYSQL_RES;
- memset(result, 0, sizeof(MYSQL_RES));
-
- //Fill the fields metadata
- ResultSetMetaData rsmd(drsPtr);
- result->field_count = get_query_fields(result->fields, &rsmd);
- result->handle = mysqlPtr;
- result->lengths = new unsigned long[result->field_count];
+ MYSQL_RES *result = 0;
- //Fetch the rows if fetch_all was specified
- if (fetch_all)
+ // drsPtr = stmtPtr->getResultSet();
+ if (drsPtr)
{
- result->data = new MYSQL_DATA;
- memset(result->data, 0, sizeof(MYSQL_DATA));
- result->data->fields = result->field_count;
- MYSQL_ROWS *prev = 0;
- //Fetch row by row and allocate memory for each row
- while (drsPtr->next())
+ //TODO handle not enough memory (std::nothrow)
+ result = new MYSQL_RES;
+ memset(result, 0, sizeof(MYSQL_RES));
+
+ //Fill the fields metadata
+ ResultSetMetaData rsmd(drsPtr);
+ result->field_count = get_query_fields(result->fields, &rsmd);
+ result->handle = mysqlPtr;
+ result->lengths = new unsigned long[result->field_count];
+
+ //Fetch the rows if fetch_all was specified
+ if (fetch_all)
{
- MYSQL_ROWS *row = new MYSQL_ROWS;
- memset(row,0,sizeof(MYSQL_ROWS));
- alloc_row_data(row->data, result->fields, result->field_count,
row->length, result->lengths);
- if (prev)
- prev->next = row;
- else
- result->data->data = row;
- prev = row;
- result->data->rows++;
+ result->data = new MYSQL_DATA;
+ memset(result->data, 0, sizeof(MYSQL_DATA));
+ result->data->fields = result->field_count;
+ MYSQL_ROWS *prev = 0;
+ //Fetch row by row and allocate memory for each row
+ while (drsPtr->next())
+ {
+ MYSQL_ROWS *row = new MYSQL_ROWS;
+ memset(row,0,sizeof(MYSQL_ROWS));
+ alloc_row_data(row->data, result->fields, result->field_count,
row->length, result->lengths);
+ if (prev)
+ prev->next = row;
+ else
+ result->data->data = row;
+ prev = row;
+ result->data->rows++;
+ }
+ result->row_count=result->data->rows;
+ result->data_cursor = result->data->data;
+ mysqlPtr->status = MYSQL_STATUS_READY;
+
+ //Release the Carob dataset
+ //stmtPtr->close();
+ drsPtr->close();
+ drsPtr = 0;
}
- result->row_count=result->data->rows;
- result->data_cursor = result->data->data;
- mysqlPtr->status = MYSQL_STATUS_READY;
-
- //Release the Carob dataset
- //stmtPtr->close();
- drsPtr->close();
- drsPtr = 0;
+ else
+ {
+ //TODO check when to free the main internal liveResultPtr
+ liveResultPtr = result;
+ mysqlPtr->status = MYSQL_STATUS_USE_RESULT;
+ }
+
+ mysqlPtr->field_count = result->field_count;
+ mysqlPtr->affected_rows = result->row_count;
+ mysqlPtr->fields = result->fields;
+
+ reset_error();
}
+ #ifdef MYSQL5
else
- {
- //TODO check when to free the main internal liveResultPtr
- liveResultPtr = result;
- mysqlPtr->status = MYSQL_STATUS_USE_RESULT;
- }
-
- mysqlPtr->field_count = result->field_count;
- mysqlPtr->affected_rows = result->row_count;
- mysqlPtr->fields = result->fields;
-
- reset_error();
+ set_error(CR_NO_RESULT_SET, SQLT_UNKNOWN);
+ #endif
+
+ LOG4CXX_DEBUG(logger, "Leaving get_results: result=" << result);
+ return result;
}
-#ifdef MYSQL5
- else
- set_error(CR_NO_RESULT_SET, SQLT_UNKNOWN);
-#endif
-
- LOG4CXX_DEBUG(logger, "Leaving get_results: result=" << result);
- return result;
+ LOG4CXX_DEBUG(logger, "Leaving get_results: result=0");
+ return 0;
+ }
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ LOG4CXX_DEBUG(logger, "Leaving get_results: result=0");
+ return 0;
}
- LOG4CXX_DEBUG(logger, "Leaving get_results: result=0");
- return 0;
}
- catch (CarobException &e)
+ catch (ConverterException &e)
{
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
LOG4CXX_DEBUG(logger, "Leaving get_results: result=0");
return 0;
}
@@ -497,19 +522,27 @@
try
{
- if (stmtPtr->getMoreResults() || stmtPtr->getUpdateCount() != -1)
+ try
{
- result = 0;
- mysqlPtr->affected_rows = stmtPtr->getUpdateCount();
- mysqlPtr->status = MYSQL_STATUS_GET_RESULT;
- drsPtr = stmtPtr->getResultSet();
+ if (stmtPtr->getMoreResults() || stmtPtr->getUpdateCount() != -1)
+ {
+ result = 0;
+ mysqlPtr->affected_rows = stmtPtr->getUpdateCount();
+ mysqlPtr->status = MYSQL_STATUS_GET_RESULT;
+ drsPtr = stmtPtr->getResultSet();
+ }
+
+ reset_error();
+ }
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ result = 1;
}
-
- reset_error();
}
- catch (CarobException &e)
+ catch (ConverterException &e)
{
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
result = 1;
}
}
@@ -602,16 +635,25 @@
try
{
- connectionPtr->setAutoCommit(mode);
- LOG4CXX_DEBUG(logger, "Leaving set_autocommit: result=1");
-
- reset_error();
-
- return true;
+ try
+ {
+ connectionPtr->setAutoCommit(mode);
+ LOG4CXX_DEBUG(logger, "Leaving set_autocommit: result=1");
+
+ reset_error();
+
+ return true;
+ }
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ LOG4CXX_DEBUG(logger, "Leaving set_autocommit: result=0");
+ return 0;
+ }
}
- catch (CarobException &e)
+ catch (ConverterException &e)
{
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
LOG4CXX_DEBUG(logger, "Leaving set_autocommit: result=0");
return 0;
}
@@ -631,16 +673,25 @@
try
{
- connectionPtr->commit();
- LOG4CXX_DEBUG(logger, "Leaving commit: result=1");
-
- reset_error();
-
- return true;
+ try
+ {
+ connectionPtr->commit();
+ LOG4CXX_DEBUG(logger, "Leaving commit: result=1");
+
+ reset_error();
+
+ return true;
+ }
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ LOG4CXX_DEBUG(logger, "Leaving commit: result=0");
+ return 0;
+ }
}
- catch (CarobException &e)
+ catch (ConverterException &e)
{
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
LOG4CXX_DEBUG(logger, "Leaving commit: result=0");
return 0;
}
@@ -660,18 +711,27 @@
try
{
- connectionPtr->rollback();
- LOG4CXX_DEBUG(logger, "Leaving rollback: result=1");
-
- reset_error();
-
- return true;
+ try
+ {
+ connectionPtr->rollback();
+ LOG4CXX_DEBUG(logger, "Leaving rollback: result=1");
+
+ reset_error();
+
+ return true;
+ }
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ LOG4CXX_DEBUG(logger, "Leaving rollback: result=0");
+ return false;
+ }
}
- catch (CarobException &e)
+ catch (ConverterException &e)
{
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
LOG4CXX_DEBUG(logger, "Leaving rollback: result=0");
- return false;
+ return 0;
}
}
@@ -1102,40 +1162,48 @@
unsigned long
CarobMYSQL::real_escape_string (char *to, const char *from, unsigned long
length)
{
- wstring w = to_wstring(string(from, length));
- std::wstring::const_iterator i = w.begin();
- wstring r;
- wchar_t esc;
-
- for (; i != w.end(); i++)
+ try
{
- esc = 0;
- switch (*i)
- {
- case L'\0':
- case L'\n':
- case L'\r':
- case L'\\':
- case L'\'':
- case L'"': esc = *i; break;
- case L'\032': esc = L'Z'; break;
- }
- if (esc)
- {
- r.push_back(L'\\');
- r.push_back(esc);
- }
- else
+ wstring w = to_wstring(string(from, length));
+ std::wstring::const_iterator i = w.begin();
+ wstring r;
+ wchar_t esc;
+
+ for (; i != w.end(); i++)
{
- r.push_back(*i);
+ esc = 0;
+ switch (*i)
+ {
+ case L'\0':
+ case L'\n':
+ case L'\r':
+ case L'\\':
+ case L'\'':
+ case L'"': esc = *i; break;
+ case L'\032': esc = L'Z'; break;
+ }
+ if (esc)
+ {
+ r.push_back(L'\\');
+ r.push_back(esc);
+ }
+ else
+ {
+ r.push_back(*i);
+ }
}
- }
-
- string s = from_wstring(r);
-
- size_t len = s.length() < 2*length ? s.length() : 2*length-1;
- memcpy(to, s.data(), len);
- to[len] = 0;
- return (s.length() < 2*length) ? (unsigned long) (s.length()) : (unsigned
long) ~0;
+ string s = from_wstring(r);
+
+ size_t len = s.length() < 2*length ? s.length() : 2*length-1;
+ memcpy(to, s.data(), len);
+ to[len] = 0;
+
+ return (s.length() < 2*length) ? (unsigned long) (s.length()) : (unsigned
long) ~0;
+ }
+ catch (ConverterException &e)
+ {
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
+ return mysql_escape_string(to, from, length);
+ }
}
Index: libmysequoia/src/CarobStmt.cpp
diff -u libmysequoia/src/CarobStmt.cpp:1.29 libmysequoia/src/CarobStmt.cpp:1.30
--- libmysequoia/src/CarobStmt.cpp:1.29 Wed Mar 15 08:50:46 2006
+++ libmysequoia/src/CarobStmt.cpp Fri Mar 24 14:00:37 2006
@@ -97,34 +97,43 @@
int result = 0;
clear();
-
+
try
- {
- c_stmt =
cmysql->connectionPtr->createParameterStatement(to_wstring(string(query,
length)));
- m_stmt->param_count = c_stmt->getParameterCount();
- m_stmt->state = MYSQL_STMT_PREPARE_DONE;
- m_stmt->params = new MYSQL_BIND[m_stmt->param_count];
-
+ {
try
{
- ResultSetMetaData *rsmdPtr = c_stmt->getMetaData();
- if (rsmdPtr)
+ c_stmt =
cmysql->connectionPtr->createParameterStatement(to_wstring(string(query,
length)));
+ m_stmt->param_count = c_stmt->getParameterCount();
+ m_stmt->state = MYSQL_STMT_PREPARE_DONE;
+ m_stmt->params = new MYSQL_BIND[m_stmt->param_count];
+
+ try
{
- m_stmt->field_count = rsmdPtr->getColumnCount();
- get_query_fields(m_stmt->fields, rsmdPtr);
- m_stmt->bind = new MYSQL_BIND[m_stmt->field_count];
+ ResultSetMetaData *rsmdPtr = c_stmt->getMetaData();
+ if (rsmdPtr)
+ {
+ m_stmt->field_count = rsmdPtr->getColumnCount();
+ get_query_fields(m_stmt->fields, rsmdPtr);
+ m_stmt->bind = new MYSQL_BIND[m_stmt->field_count];
+ }
+ } catch (BackendException &e)
+ {
+ LOG4CXX_DEBUG(logger, "Prepare: errno=" << e.getErrorCode() << "
error=" << from_wstring(e.description()));
}
- } catch (BackendException &e)
+ }
+ catch (CarobException &e)
{
- LOG4CXX_DEBUG(logger, "Prepare: errno=" << e.getErrorCode() << " error="
<< from_wstring(e.description()));
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ result = 1;
}
}
- catch (CarobException &e)
+ catch (ConverterException &e)
{
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
result = 1;
}
+
LOG4CXX_DEBUG(logger, "Leaving prepare: result=" << result);
return result;
@@ -276,82 +285,89 @@
try
{
- MYSQL_BIND *p = m_stmt->params;
- for (unsigned int no=1; no <= m_stmt->param_count; no++, p++)
+ try
{
- if (*p->is_null)
- c_stmt->setNull(no);
+ MYSQL_BIND *p = m_stmt->params;
+ for (unsigned int no=1; no <= m_stmt->param_count; no++, p++)
+ {
+ if (*p->is_null)
+ c_stmt->setNull(no);
+ else
+ switch (p->buffer_type)
+ {
+ case MYSQL_TYPE_TINY:
+ c_stmt->setByte(no, *(java_byte *)p->buffer);
+ break;
+ case MYSQL_TYPE_SHORT:
+ c_stmt->setShort(no, *(short *)p->buffer);
+ break;
+ case MYSQL_TYPE_LONG:
+ c_stmt->setInt(no, *(int *)p->buffer);
+ break;
+ case MYSQL_TYPE_LONGLONG:
+ c_stmt->setLong(no, *(int64_t *)p->buffer);
+ break;
+ case MYSQL_TYPE_FLOAT:
+ c_stmt->setFloat(no, *(float *)p->buffer);
+ break;
+ case MYSQL_TYPE_DOUBLE:
+ c_stmt->setDouble(no, *(double *)p->buffer);
+ break;
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_BLOB:
+ if (p->long_data_used && LONGDATAFIELD(p))
+ {
+ string *s = (string *)LONGDATAFIELD(p);
+ c_stmt->setBlob(no, s->data(), s->size());
+ }
+ else
+ c_stmt->setBlob(no, p->buffer, p->buffer_length);
+ break;
+ case MYSQL_TYPE_DECIMAL:
+ #ifdef MYSQL5
+ case MYSQL_TYPE_NEWDECIMAL:
+ case MYSQL_TYPE_VARCHAR:
+ #endif
+ case MYSQL_TYPE_VAR_STRING:
+ case MYSQL_TYPE_STRING:
+ if (p->long_data_used && LONGDATAFIELD(p))
+ c_stmt->setString(no, to_wstring(*(string
*)LONGDATAFIELD(p)));
+ else
+ c_stmt->setString(no, to_wstring(string((char *)p->buffer,
p->buffer_length)));
+ break;
+ case MYSQL_TYPE_TIME:
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_DATETIME:
+ case MYSQL_TYPE_TIMESTAMP:
+ char buffer[20];
+ MYSQL_TIME_to_str((MYSQL_TIME *)p->buffer, buffer,
sizeof(buffer));
+ c_stmt->setString(no,
to_wstring(string(buffer,strlen(buffer))));
+ break;
+ case MYSQL_TYPE_NULL:
+ break;
+ default:
+ LOG4CXX_FATAL(logger, "This should never happen!!");
+ /* TODO support other types */
+ }
+ }
+ if (!c_stmt->execute())
+ m_stmt->affected_rows = c_stmt->getUpdateCount();
else
- switch (p->buffer_type)
- {
- case MYSQL_TYPE_TINY:
- c_stmt->setByte(no, *(java_byte *)p->buffer);
- break;
- case MYSQL_TYPE_SHORT:
- c_stmt->setShort(no, *(short *)p->buffer);
- break;
- case MYSQL_TYPE_LONG:
- c_stmt->setInt(no, *(int *)p->buffer);
- break;
- case MYSQL_TYPE_LONGLONG:
- c_stmt->setLong(no, *(int64_t *)p->buffer);
- break;
- case MYSQL_TYPE_FLOAT:
- c_stmt->setFloat(no, *(float *)p->buffer);
- break;
- case MYSQL_TYPE_DOUBLE:
- c_stmt->setDouble(no, *(double *)p->buffer);
- break;
- case MYSQL_TYPE_TINY_BLOB:
- case MYSQL_TYPE_MEDIUM_BLOB:
- case MYSQL_TYPE_LONG_BLOB:
- case MYSQL_TYPE_BLOB:
- if (p->long_data_used && LONGDATAFIELD(p))
- {
- string *s = (string *)LONGDATAFIELD(p);
- c_stmt->setBlob(no, s->data(), s->size());
- }
- else
- c_stmt->setBlob(no, p->buffer, p->buffer_length);
- break;
- case MYSQL_TYPE_DECIMAL:
-#ifdef MYSQL5
- case MYSQL_TYPE_NEWDECIMAL:
- case MYSQL_TYPE_VARCHAR:
-#endif
- case MYSQL_TYPE_VAR_STRING:
- case MYSQL_TYPE_STRING:
- if (p->long_data_used && LONGDATAFIELD(p))
- c_stmt->setString(no, to_wstring(*(string
*)LONGDATAFIELD(p)));
- else
- c_stmt->setString(no, to_wstring(string((char *)p->buffer,
p->buffer_length)));
- break;
- case MYSQL_TYPE_TIME:
- case MYSQL_TYPE_DATE:
- case MYSQL_TYPE_DATETIME:
- case MYSQL_TYPE_TIMESTAMP:
- char buffer[20];
- MYSQL_TIME_to_str((MYSQL_TIME *)p->buffer, buffer,
sizeof(buffer));
- c_stmt->setString(no,
to_wstring(string(buffer,strlen(buffer))));
- break;
- case MYSQL_TYPE_NULL:
- break;
- default:
- LOG4CXX_FATAL(logger, "This should never happen!!");
- /* TODO support other types */
- }
+ liveResultSet = c_stmt->getResultSet();
+
+ m_stmt->state = MYSQL_STMT_EXECUTE_DONE;
+ result = 0;
+ }
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
}
- if (!c_stmt->execute())
- m_stmt->affected_rows = c_stmt->getUpdateCount();
- else
- liveResultSet = c_stmt->getResultSet();
-
- m_stmt->state = MYSQL_STMT_EXECUTE_DONE;
- result = 0;
}
- catch (CarobException &e)
+ catch (ConverterException &e)
{
- set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
}
}
@@ -463,6 +479,7 @@
result = 1;
}
else
+ try
{
//check if there are more results to fetch
if (m_stmt->result.data ? m_stmt->data_cursor != 0 : liveResultSet->next())
@@ -496,6 +513,11 @@
else
result = MYSQL_NO_DATA;
}
+ catch (ConverterException &e)
+ {
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
+ result = 1;
+ }
LOG4CXX_DEBUG(logger, "Leaving fetch: result=" << result);
return result;
@@ -516,6 +538,7 @@
if (!bind)
set_error(CR_NULL_POINTER, SQLT_UNKNOWN);
else
+ try
{
link_bind(bind);
bind->offset = offset;
@@ -524,6 +547,10 @@
result = 0;
}
+ catch (ConverterException &e)
+ {
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
+ }
LOG4CXX_DEBUG(logger, "Leaving fetch_column: result=" << result);
return result;
@@ -600,40 +627,56 @@
result = 1;
}
else
- if (m_stmt->field_count && liveResultSet)
- {
- if (m_stmt->result.data)
- free_catched_result(m_stmt);
-
- memset(&m_stmt->result, 0, sizeof(MYSQL_DATA));
- m_stmt->result.fields = m_stmt->field_count;
+ try
+ {
+ try
+ {
+ if (m_stmt->field_count && liveResultSet)
+ {
+ if (m_stmt->result.data)
+ free_catched_result(m_stmt);
- MYSQL_ROWS *prev = 0;
- //Fetch row by row and allocate memory for each row
- while (liveResultSet->next())
- {
- MYSQL_ROWS *row = new MYSQL_ROWS;
- memset(row,0,sizeof(MYSQL_ROWS));
- row->data = new PCHAR[m_stmt->field_count];
-
- MYSQL_FIELD *fPtr = m_stmt->fields;
- MYSQL_ROW dataPtr = row->data;
-
- for (unsigned colNo=1; colNo <= m_stmt->field_count; colNo++, fPtr++,
dataPtr++)
- *dataPtr = (char *)alloc_fetch_field(fPtr, colNo);
- if (prev)
- prev->next = row;
- else
- m_stmt->result.data = row;
- prev = row;
- m_stmt->result.rows++;
+ memset(&m_stmt->result, 0, sizeof(MYSQL_DATA));
+ m_stmt->result.fields = m_stmt->field_count;
+
+ MYSQL_ROWS *prev = 0;
+ //Fetch row by row and allocate memory for each row
+ while (liveResultSet->next())
+ {
+ MYSQL_ROWS *row = new MYSQL_ROWS;
+ memset(row,0,sizeof(MYSQL_ROWS));
+ row->data = new PCHAR[m_stmt->field_count];
+
+ MYSQL_FIELD *fPtr = m_stmt->fields;
+ MYSQL_ROW dataPtr = row->data;
+
+ for (unsigned colNo=1; colNo <= m_stmt->field_count; colNo++,
fPtr++, dataPtr++)
+ *dataPtr = (char *)alloc_fetch_field(fPtr, colNo);
+ if (prev)
+ prev->next = row;
+ else
+ m_stmt->result.data = row;
+ prev = row;
+ m_stmt->result.rows++;
+ }
+ m_stmt->data_cursor = m_stmt->result.data;
+ m_stmt->affected_rows = m_stmt->result.rows;
+
+ //Release the Carob dataset
+ c_stmt->close();
+ liveResultSet = 0;
+ }
}
- m_stmt->data_cursor = m_stmt->result.data;
- m_stmt->affected_rows = m_stmt->result.rows;
-
- //Release the Carob dataset
- c_stmt->close();
- liveResultSet = 0;
+ catch (CarobException &e)
+ {
+ set_error(e.getErrorCode(), from_wstring(e.description()).c_str(),
from_wstring(e.getSQLState()).c_str());
+ result = 1;
+ }
+ }
+ catch (ConverterException &e)
+ {
+ set_error(0, e.description().c_str(), error_sqlstate[SQLT_UNKNOWN]);
+ result = 1;
}
LOG4CXX_DEBUG(logger, "Leaving store_result: result=" << result);
_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits