00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <sqlite3.h>
00027 #include "sqlite3x.hpp"
00028 #include <cstdarg>
00029 #include <limits>
00030 #include <cstring>
00031 #include <cstdio>
00032 #include <vector>
00033 namespace sqlite3x {
00034
00035 database_error::~database_error() throw() {}
00036
00037 database_error::database_error(sqlite3_connection &con)
00038 : m_what( "sqlite3_connection["+con.name()+"]: "+con.errormsg() )
00039 {
00040 }
00041
00042 char const * database_error::what() const throw()
00043 {
00044 return this->m_what.c_str();
00045 }
00046
00047 database_error::database_error(const char *format,...)
00048 {
00049 const int buffsz = static_cast<int>( std::max( (size_t) 2048, strlen(format) * 2 ) );
00050 std::vector<char> buffer( buffsz, '\0' );
00051 va_list vargs;
00052 va_start ( vargs, format );
00053 int size = vsnprintf(&buffer[0], buffsz, format, vargs);
00054 va_end( vargs );
00055 if (size > (buffsz-1))
00056 {
00057
00058 size = buffsz-1;
00059 for( int i = buffsz-4; i < buffsz-1; ++i )
00060 {
00061 buffer[i] = '.';
00062 }
00063 }
00064 buffer[size] = '\0';
00065 this->m_what = std::string( &buffer[0], &buffer[0]+size );
00066 }
00067 }