(和PHP搭配之最佳组合) MySQL(和PHP搭配之最佳组合).h>typedef std::string string;
struct MySQL(和PHP搭配之最佳组合)_parm{
string host;
string user;
string password;
string database;
string unixsock;
};
class DBSTMT;
class DBMySQL(和PHP搭配之最佳组合);
class DBSTMT{
DBSTMT(const DBSTMT&);
DBSTMT& operator=(const DBSTMT&);
MySQL(和PHP搭配之最佳组合)_STMT* stmt_;
public:
DBSTMT(pcsz_t query,DBMySQL(和PHP搭配之最佳组合)& MySQL(和PHP搭配之最佳组合));
void execute(){
if(MySQL(和PHP搭配之最佳组合)_stmt_execute(stmt_))
throw MySQL(和PHP搭配之最佳组合)_stmt_error(stmt_);
}
void execute(MySQL(和PHP搭配之最佳组合)_BIND* bind){
if(MySQL(和PHP搭配之最佳组合)_stmt_execute(stmt_))
throw MySQL(和PHP搭配之最佳组合)_stmt_error(stmt_);
if(MySQL(和PHP搭配之最佳组合)_stmt_bind_result(stmt_,bind)){
throw MySQL(和PHP搭配之最佳组合)_stmt_error(stmt_);
}
if(MySQL(和PHP搭配之最佳组合)_stmt_store_result(stmt_))
throw MySQL(和PHP搭配之最佳组合)_stmt_error(stmt_);
}
//void execute(){
// if(MySQL(和PHP搭配之最佳组合)_stmt_execute(stmt_))
// throw MySQL(和PHP搭配之最佳组合)_stmt_error(stmt_);
//}
void bind(MySQL(和PHP搭配之最佳组合)_BIND* bind){
if(MySQL(和PHP搭配之最佳组合)_stmt_bind_param(stmt_,bind) )
throw MySQL(和PHP搭配之最佳组合)_stmt_error(stmt_);
}
int fetch(){
return MySQL(和PHP搭配之最佳组合)_stmt_fetch(stmt_)==0;
}
~DBSTMT(){
if(stmt_){
MySQL(和PHP搭配之最佳组合)_stmt_close(stmt_);
}
}
};
class DBMySQL(和PHP搭配之最佳组合){
DBMySQL(和PHP搭配之最佳组合)(const DBMySQL(和PHP搭配之最佳组合)&);
DBMySQL(和PHP搭配之最佳组合)&operator=(const DBMySQL(和PHP搭配之最佳组合)&);
MySQL(和PHP搭配之最佳组合) * MySQL(和PHP搭配之最佳组合)Ptr_;
uint32_t errno_;
protected:
friend class DBSTMT;
MySQL(和PHP搭配之最佳组合)_STMT* _createSTMT(){
MySQL(和PHP搭配之最佳组合)_STMT *ret=MySQL(和PHP搭配之最佳组合)_stmt_init(MySQL(和PHP搭配之最佳组合)Ptr_);
if(ret)
return ret;
errno_=MySQL(和PHP搭配之最佳组合)_errno(MySQL(和PHP搭配之最佳组合)Ptr_);
throw MySQL(和PHP搭配之最佳组合)_error(MySQL(和PHP搭配之最佳组合)Ptr_);
}
public:
const char* strerr(){
return MySQL(和PHP搭配之最佳组合)_error(MySQL(和PHP搭配之最佳组合)Ptr_);
}
DBMySQL(和PHP搭配之最佳组合)():MySQL(和PHP搭配之最佳组合)Ptr_(NULL){
MySQL(和PHP搭配之最佳组合)Ptr_=MySQL(和PHP搭配之最佳组合)_init(NULL);
if(NULL== MySQL(和PHP搭配之最佳组合)Ptr_)
throw "MySQL(和PHP搭配之最佳组合) :outof memory";
}
void open(const MySQL(和PHP搭配之最佳组合)_parm& parm){
if(!MySQL(和PHP搭配之最佳组合)_real_connect(MySQL(和PHP搭配之最佳组合)Ptr_,
parm.host.c_str(),
parm.user.c_str(),
parm.password.c_str(),
parm.database.c_str(),
0,
parm.unixsock.c_str(),
0 ))
{
errno_=MySQL(和PHP搭配之最佳组合)_errno(MySQL(和PHP搭配之最佳组合)Ptr_);
throw(MySQL(和PHP搭配之最佳组合)_error(MySQL(和PHP搭配之最佳组合)Ptr_));
}
}
void close(){
if(MySQL(和PHP搭配之最佳组合)Ptr_)
{
MySQL(和PHP搭配之最佳组合)_close(MySQL(和PHP搭配之最佳组合)Ptr_);
MySQL(和PHP搭配之最佳组合)Ptr_=NULL;
}
}
};
DBSTMT::DBSTMT(pcsz_t query,DBMySQL(和PHP搭配之最佳组合)& MySQL(和PHP搭配之最佳组合)):stmt_(NULL){
stmt_=MySQL(和PHP搭配之最佳组合)._createSTMT();
if(!stmt_)
throw MySQL(和PHP搭配之最佳组合).strerr();
if( MySQL(和PHP搭配之最佳组合)_stmt_prepare(stmt_,query,strlen(query)) )
{
//const char* err=
throw MySQL(和PHP搭配之最佳组合)_stmt_error(stmt_);
}
}
#define DECL_BIND(h,n)\
class bind_##h:public h{\
typedef h parent;\
MySQL(和PHP搭配之最佳组合)_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(和PHP搭配之最佳组合)_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(和PHP搭配之最佳组合)_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(和PHP搭配之最佳组合)_BIND*(){\
return _bind;\
}\
};
使用方法;
例如想查询的内容具有以下结构
struct account{
char user[36];
byte password[16];
uint32_t status;
uint32_t id;
};
//声明查询bind 结构account,参数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(和PHP搭配之最佳组合) MySQL(和PHP搭配之最佳组合);
MySQL(和PHP搭配之最佳组合)_parm parm;
parm.host="localhost";
parm.user="root";
parm.password="test";
parm.unixsock="/var/lib/MySQL(和PHP搭配之最佳组合)/MySQL(和PHP搭配之最佳组合).sock";
parm.database="testdb";
MySQL(和PHP搭配之最佳组合).open(parm);//打开数据库
DBSTMT smt("select user,password,status,id from account",MySQL(和PHP搭配之最佳组合));//生成一个查询语法
DBSTMT smt1("insert into account(user,password,status) value(?,?,?)",MySQL(和PHP搭配之最佳组合));//另外一个
//
bind_account acc;
smt.execute(acc);//执行查询,并bind返回结果到account结构
while(smt.fetch()){
printf("%s %d %d\n",acc.user,acc.status,acc.id);
};
smt1.bind(acc);//bind查询参数
smt1.execute();//执行
}catch(const char* err){
printf("error:%s\n",err);
}
}