OCI Error handling. More...
#include <ocipl.h>


Public Types | |
| typedef std::exception | super |
Public Member Functions | |
| OciException (OCIEnv *envh, const char *file, int line) | |
| OciException (OCIError *errh, const char *file, int line) | |
| OciException (const char *msg, const char *file, int line) | |
| OciException (OCIError *errh, SqlStatement &stmt, const char *file, int line) | |
| OciException (const OciException &) | |
| ~OciException () throw () | |
| virtual const char * | what () const throw () |
Public Attributes | |
| int | _sql_error_code |
| char * | _msg |
| const char * | _file |
| int | _line |
| tstring | _last_sql |
| ub2 | _parse_offset |
OCI Error handling.
Definition at line 304 of file ocipl.h.
| typedef std::exception OCIPL::OciException::super |
| OCIPL::OciException::OciException | ( | OCIEnv * | envh, |
| const char * | file, | ||
| int | line | ||
| ) |
Definition at line 136 of file ocipl.cpp.
References _file, _line, _msg, _parse_offset, _sql_error_code, COUNTOF, and max_strdup().
{
OraText buffer[1024];
sb4 errorcode;
sword res = OCIErrorGet(envh, 1, NULL, &errorcode, buffer, sizeof(buffer), OCI_HTYPE_ENV);
if (res == OCI_SUCCESS) {
_sql_error_code = errorcode;
_msg = max_strdup((const char*)buffer, COUNTOF(buffer));
} else {
_sql_error_code = 0;
_msg = NULL;
}
_file = file;
_line = line;
_parse_offset = 0;
}

| OCIPL::OciException::OciException | ( | OCIError * | errh, |
| const char * | file, | ||
| int | line | ||
| ) |
Definition at line 156 of file ocipl.cpp.
References _file, _line, _msg, _parse_offset, _sql_error_code, _tcslen, COUNTOF, max_strdup(), and TCHAR.
{
TCHAR buffer[1024];
sb4 errorcode;
sword res = OCIErrorGet(errh, 1, NULL, &errorcode, (OraText*)buffer, sizeof(buffer), OCI_HTYPE_ERROR);
if (res == OCI_SUCCESS) {
_sql_error_code = errorcode;
#ifdef _UNICODE
char nbuffer[2048];
#ifdef _MSC_VER
std::_USE(std::locale::empty(), std::ctype<wchar_t>)
#else
std::use_facet<std::ctype<wchar_t> >(std::locale::empty())
#endif
.narrow((const TCHAR*)buffer, (const TCHAR*)buffer+_tcslen((const TCHAR*)buffer)+1, 0, nbuffer);
_msg = max_strdup(nbuffer, COUNTOF(nbuffer));
#else
_msg = max_strdup(buffer, COUNTOF(buffer));
#endif
} else {
_sql_error_code = 0;
_msg = NULL;
}
_file = file;
_line = line;
_parse_offset = 0;
}

| OCIPL::OciException::OciException | ( | const char * | msg, |
| const char * | file, | ||
| int | line | ||
| ) |
| OCIPL::OciException::OciException | ( | OCIError * | errh, |
| SqlStatement & | stmt, | ||
| const char * | file, | ||
| int | line | ||
| ) |
Definition at line 187 of file ocipl.cpp.
References _file, _last_sql, _line, _msg, _parse_offset, _snprintf, _sql_error_code, _tcslen, COUNTOF, OCIPL::SqlStatement::get_last_file(), OCIPL::SqlStatement::get_last_line(), OCIPL::SqlStatement::get_last_sql(), max_strdup(), max_strlen(), and TCHAR.
{
char buffer[4096];
sb4 errorcode;
#ifdef _UNICODE
TCHAR wbuffer[4096];
sword res = OCIErrorGet(errh, 1, NULL, &errorcode, (OraText*)wbuffer, sizeof(wbuffer), OCI_HTYPE_ERROR);
#ifdef _MSC_VER
std::_USE(std::locale::empty(), std::ctype<wchar_t>)
#else
std::use_facet<std::ctype<wchar_t> >(std::locale::empty())
#endif
.narrow((const TCHAR*)wbuffer, (const TCHAR*)wbuffer+_tcslen((const TCHAR*)wbuffer)+1, 0, buffer);
#else
sword res = OCIErrorGet(errh, 1, NULL, &errorcode, (OraText*)buffer, sizeof(buffer), OCI_HTYPE_ERROR);
#endif
ub4 size = sizeof(_parse_offset);
if (OCIAttrGet(stmt, OCI_HTYPE_STMT, &_parse_offset, &size, OCI_ATTR_PARSE_ERROR_OFFSET, errh) != OCI_SUCCESS)
_parse_offset = 0;
if (res == OCI_SUCCESS)
_sql_error_code = errorcode;
else {
*buffer = '\0';
_sql_error_code = 0;
}
_last_sql = stmt.get_last_sql();
_file = file;
_line = line;
if (!_last_sql.empty()) {
file = stmt.get_last_file();
// copy source code position from statement if available
if (file) {
_file = file;
_line = stmt.get_last_line();
}
const TCHAR* sql = _last_sql.c_str();
size_t l = max_strlen(buffer, COUNTOF(buffer));
int line = 1;
const TCHAR* s = sql;
const TCHAR* e = sql + _parse_offset;
const TCHAR* lp = sql;
while(s < e)
if (*s == '\n') {
++line;
if (*++s == '\r')
++s;
lp = s;
} else
++s;
int column = 1 + (s-lp);
#ifdef __STDC_WANT_SECURE_LIB__
char* b = buffer+l + _snprintf_s(buffer+l, sizeof(buffer)-l, _TRUNCATE, "\nerror at SQL position %d [%d.%d]:\n", _parse_offset, line, column);
#else
char* b = buffer+l + _snprintf(buffer+l, sizeof(buffer)-l-1, "\nerror at SQL position %d [%d.%d]:\n", _parse_offset, line, column);
#endif
char* p = b;
s = lp;
while(*s && *s!='\n' && p<buffer+sizeof(buffer)-3)
*p++ = *s++;
*p++ = '\n';
b = p;
const TCHAR* err_ptr = sql + _parse_offset;
s = lp;
for(; s<err_ptr && p<buffer+sizeof(buffer)-2; ++s) {
if (*s=='\n' || *sql=='\r')
p = b;
else if (*s == '\t')
*p++ = '\t';
else
*p++ = ' ';
}
*p++ = '^';
*p = '\0';
l = max_strlen(buffer, COUNTOF(buffer));
#ifdef __STDC_WANT_SECURE_LIB__
_snprintf_s(buffer+l, sizeof(buffer)-l, _TRUNCATE, "\n\nlast SQL statement:\n%s", sql);
#else
_snprintf(buffer+l, sizeof(buffer)-l, "\n\nlast SQL statement:\n%s", sql);
#endif
}
_msg = max_strdup(buffer, COUNTOF(buffer));
}

| OCIPL::OciException::OciException | ( | const OciException & | other ) |
| OCIPL::OciException::~OciException | ( | ) | throw () |
| virtual const char* OCIPL::OciException::what | ( | ) | const throw () [inline, virtual] |
| const char* OCIPL::OciException::_file |
Definition at line 324 of file ocipl.h.
Referenced by OciException().
Definition at line 326 of file ocipl.h.
Referenced by OciException().
Definition at line 325 of file ocipl.h.
Referenced by OciException().
Definition at line 323 of file ocipl.h.
Referenced by OciException(), what(), and ~OciException().
Definition at line 327 of file ocipl.h.
Referenced by OciException().
Definition at line 322 of file ocipl.h.
Referenced by OciException().
1.7.2