#include string #include mysql/mysql.h #include default.h typedefstd::stringstring; structmysql_parm{ stringhost; stringuser; stringpassword; stringdatabase; stringunixsock; }; classdbstmt; classdbmysql; classdbstmt{ dbstmt(const dbstmt);
#include
#include
#include
typedef std::string string;
struct mysql_parm{
string host;
string user;
string password;
string database;
string unixsock;
};
class dbstmt;
class dbmysql;
class dbstmt{
dbstmt(const dbstmt&);
dbstmt& operator=(const dbstmt&);
mysql_stmt* stmt_;
public:
dbstmt(pcsz_t query,dbmysql& mysql);
void execute(){
if(mysql_stmt_execute(stmt_))
throw mysql_stmt_error(stmt_);
}
void execute(mysql_bind* bind){
if(mysql_stmt_execute(stmt_))
throw mysql_stmt_error(stmt_);
if(mysql_stmt_bind_result(stmt_,bind)){
throw mysql_stmt_error(stmt_);
}
if(mysql_stmt_store_result(stmt_))
throw mysql_stmt_error(stmt_);
}
//void execute(){
// if(mysql_stmt_execute(stmt_))
// throw mysql_stmt_error(stmt_);
//}
void bind(mysql_bind* bind){
if(mysql_stmt_bind_param(stmt_,bind) )
throw mysql_stmt_error(stmt_);
}
int fetch(){
return mysql_stmt_fetch(stmt_)==0;
}
~dbstmt(){
if(stmt_){
mysql_stmt_close(stmt_);
}
}
};
class dbmysql{
dbmysql(const dbmysql&);
dbmysql&operator=(const dbmysql&);
mysql * mysqlptr_;
uint32_t errno_;
protected:
friend class dbstmt;
mysql_stmt* _createstmt(){
mysql_stmt *ret=mysql_stmt_init(mysqlptr_);
if(ret)
return ret;
errno_=mysql_errno(mysqlptr_);
throw mysql_error(mysqlptr_);
}
public:
const char* strerr(){
return mysql_error(mysqlptr_);
}
dbmysql():mysqlptr_(null){
mysqlptr_=mysql_init(null);
if(null== mysqlptr_)
throw mysql :outof memory;
}
void open(const mysql_parm& parm){
if(!mysql_real_connect(mysqlptr_,
parm.host.c_str(),
parm.user.c_str(),
parm.password.c_str(),
parm.database.c_str(),
0,
parm.unixsock.c_str(),
0 ))
{
errno_=mysql_errno(mysqlptr_);
throw(mysql_error(mysqlptr_));
}
}
void close(){
if(mysqlptr_)
{
mysql_close(mysqlptr_);
mysqlptr_=null;
}
}
};
dbstmt::dbstmt(pcsz_t query,dbmysql& mysql):stmt_(null){
stmt_=mysql._createstmt();
if(!stmt_)
throw mysql.strerr();
if( mysql_stmt_prepare(stmt_,query,strlen(query)) )
{
//const char* err=
throw mysql_stmt_error(stmt_);
}
}
struct account{
char user[36];
byte password[16];
uint32_t status;
uint32_t id;
};
#define decl_bind(h,n)/
class bind_##h:public h{/
typedef h parent;/
mysql_bind _bind[n];/
my_bool _is_null[n];/
unsigned long _length[n];/
public:/
bind_##h(){/
int i=0;/
bzero(_bind,sizeof(_bind));
#define bind_bin(x,l)/
_bind[i].buffer_type= mysql_type_string;/
_bind[i].buffer= (char *)&(parent::x);/
_bind[i].buffer_length= l;/
_bind[i].is_null= _is_null+i;/
_bind[i].length= _length+i;/
++i;
#define bind_int(x)/
_bind[i].buffer_type= mysql_type_long;/
_bind[i].buffer= (char *)&(parent::x);/
_bind[i].buffer_length= 0;/
_bind[i].is_null= _is_null+i;/
_bind[i].length= _length+i;/
++i;
#define end_bind(h) }/
operator mysql_bind*(){/
return _bind;/
}/
};
//account acc;
//
//decl_bind(4)
// bind_bin(acc.user,32);
// bind_bin(acc.password,16);
// bind_int(acc.status);
// bind_int(acc.id);
// smt.executeandstore(bind);
//end_bind(4)
decl_bind(account,4)
bind_bin(user,32)
bind_bin(password,16)
bind_int(status)
bind_int(id)
end_bind(account)
int main(){
try{
dbmysql mysql;
mysql_parm parm;
parm.host=localhost;
parm.user=root;
parm.password=mypwd;
parm.unixsock=/var/lib/mysql/mysql.sock;
parm.database=testdb;
mysql.open(parm);
dbstmt smt(select user,password,status,id from account,mysql);
dbstmt smt1(insert into account(user,password,status) value(?,?,?),mysql);
//
bind_account acc;
smt.execute(acc);
while(smt.fetch()){
//acc.user[length[0]]=0;
//acc.user,
printf(%s %d %d/n,acc.user,acc.status,acc.id);
//printf(%d %d/n,acc.status,acc.id);
;
};
smt1.bind(acc);
smt1.execute();
}catch(const char* err){
printf(error:%s/n,err);
}
return 0;
}