mysql C API statment and bind 执行查询

22 篇文章 0 订阅

#include <string>
#include <mysql/mysql.h>
#include <default.h>

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;
 
}


  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Kevin_qing

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值