WEB开发网
开发学院数据库MySQL 一个Mysql C API小型封装 阅读

一个Mysql C API小型封装

 2007-11-11 13:15:51 来源:WEB开发网   
核心提示:·OWASP要素增强Web应用程序安全(2)·“恶搞”盗用你无线网络的邻居·如何入侵jsp(SUN企业级应用的首选)网站·黑客知识:如何隐藏 PHP文件后门的技·jsp(SUN企业级应用的首选)+javabean学习(二)·Java入门
    ·OWASP要素增强Web应用程序安全(2)
    ·“恶搞”盗用你无线网络的邻居
    ·如何入侵jsp(SUN企业级应用的首选)网站
    ·黑客知识:如何隐藏 PHP文件后门的技
    ·jsp(SUN企业级应用的首选)+javabean学习(二)
    ·Java入门视频教程-第61讲
    ·OWASP 10要素增强Web应用程序安全(1
    ·什么是asp木马
    ·如何在Windows Server 2003中安装Java
    ·Web 2.0网站安全堪忧 JavaScript恐引

主要用于维护C结构的查询和返回。

#include (和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);
     }

}

1 2 3 4 5 6  下一页

Tags:一个 Mysql API

编辑录入:coldstar [复制链接] [打 印]
赞助商链接