邪恶八进制信息安全团队技术讨论组's Archiver

ring04h 2006-4-30 14:07

[转载]一个Mysql C API小型封装

<p>信息来源: <font color="#cc0000">chinaunix</font></p><p><span style="FONT-SIZE: 13px">主要用于维护C结构的查询和返回。<br /></span></p><center><ccid_nobr /><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre>#include <mysql /></span /><p /><p><span style="FONT-SIZE: 13px">typedef std::string string;</span></p><p><span style="FONT-SIZE: 13px">struct mysql_parm{<br /> string host;<br /> string user;<br /> string password;<br /> string database;<br /> string unixsock;<br />};<br />class DBSTMT;<br />class DBMysql;</span></p><p><span style="FONT-SIZE: 13px">class DBSTMT{<br /> DBSTMT(const DBSTMT&);<br /> DBSTMT& operator=(const DBSTMT&);<br /> MYSQL_STMT* stmt_;<br />public:<br /> DBSTMT(pcsz_t query,DBMysql& mysql);<br /> void execute(){<br /> if(mysql_stmt_execute(stmt_))<br /> throw mysql_stmt_error(stmt_);<br /> }</span></p><p><span style="FONT-SIZE: 13px"> void execute(MYSQL_BIND* bind){<br /> if(mysql_stmt_execute(stmt_))<br /> throw mysql_stmt_error(stmt_);<br /> if(mysql_stmt_bind_result(stmt_,bind)){<br /> throw mysql_stmt_error(stmt_);<br /> }<br /> if(mysql_stmt_store_result(stmt_))<br /> throw mysql_stmt_error(stmt_);<br /> }</span></p><p><span style="FONT-SIZE: 13px"> //void execute(){<br /> // if(mysql_stmt_execute(stmt_))<br /> // throw mysql_stmt_error(stmt_);<br /> //}</span></p><p><span style="FONT-SIZE: 13px"> void bind(MYSQL_BIND* bind){<br /> if(mysql_stmt_bind_param(stmt_,bind) )<br /> throw mysql_stmt_error(stmt_);<br /> }</span></p><p><span style="FONT-SIZE: 13px"> int fetch(){<br /> return mysql_stmt_fetch(stmt_)==0;<br /> }<br /> ~DBSTMT(){<br /> if(stmt_){<br /> mysql_stmt_close(stmt_);<br /> }<br /> }</span></p><p><span style="FONT-SIZE: 13px">};</span></p><span style="FONT-SIZE: 13px"><p><br />class DBMysql{<br /> DBMysql(const DBMysql&);<br /> DBMysql&operator=(const DBMysql&);<br /> MYSQL * mysqlPtr_;</p><p> uint32_t errno_;<br />protected:<br /> friend class DBSTMT;<br /> MYSQL_STMT* _createSTMT(){<br /> MYSQL_STMT *ret=mysql_stmt_init(mysqlPtr_);<br /> if(ret)<br /> return ret;<br /> errno_=mysql_errno(mysqlPtr_);<br /> throw mysql_error(mysqlPtr_);<br /> }<br />public:<br /> const char* strerr(){<br /> return mysql_error(mysqlPtr_);<br /> }<br /> DBMysql():mysqlPtr_(NULL){<br /> mysqlPtr_=mysql_init(NULL);<br /> if(NULL== mysqlPtr_)<br /> throw "Mysql :outof memory";<br /> }<br /> void open(const mysql_parm& parm){<br /> if(!mysql_real_connect(mysqlPtr_,<br /> parm.host.c_str(),<br /> parm.user.c_str(),<br /> parm.password.c_str(),<br /> parm.database.c_str(),<br /> 0,<br /> parm.unixsock.c_str(),<br /> 0 ))<br /> {<br /> errno_=mysql_errno(mysqlPtr_);<br /> throw(mysql_error(mysqlPtr_));<br /> }<br /> }</p><p> void close(){<br /> if(mysqlPtr_)<br /> {<br /> mysql_close(mysqlPtr_);<br /> mysqlPtr_=NULL;<br /> }<br /> }</p><p>};</p><p><br />DBSTMT::DBSTMT(pcsz_t query,DBMysql& mysql):stmt_(NULL){<br /> stmt_=mysql._createSTMT();<br /> if(!stmt_)<br /> throw mysql.strerr();<br /> if( mysql_stmt_prepare(stmt_,query,strlen(query)) )<br /> {<br /> //const char* err=</p><p> throw mysql_stmt_error(stmt_);<br /> }</p><p>}</p><p>#define DECL_BIND(h,n)\<br />class bind_##h:public h{\<br /> typedef h parent;\<br /> MYSQL_BIND _bind[n];\<br /> my_bool _is_null[n];\<br /> unsigned long _length[n];\<br />public:\<br /> bind_##h(){\<br /> int i=0;\<br /> bzero(_bind,sizeof(_bind));</p><p><br />#define BIND_BIN(x,l)\<br /> _bind[i].buffer_type= MYSQL_TYPE_STRING;\<br /> _bind[i].buffer= (char *)&(parent::x);\<br /> _bind[i].buffer_length= l;\<br /> _bind[i].is_null= _is_null+i;\<br /> _bind[i].length= _length+i;\<br /> ++i;</p><p>#define BIND_INT(x)\<br /> _bind[i].buffer_type= MYSQL_TYPE_LONG;\<br /> _bind[i].buffer= (char *)&(parent::x);\<br /> _bind[i].buffer_length= 0;\<br /> _bind[i].is_null= _is_null+i;\<br /> _bind[i].length= _length+i;\<br /> ++i;</p><p>#define END_BIND(h) }\<br /> operator MYSQL_BIND*(){\<br /> return _bind;\<br /> }\<br />};</p><p></p><p></p><p>使用方法;</p><p>例如想查询的内容具有以下结构<br />struct account{<br /> char user[36];<br /> byte password[16];<br /> uint32_t status;<br /> uint32_t id;<br />};</p><p>//声明查询bind 结构account,参数4个<br />DECL_BIND(account,4)<br /> BIND_BIN(user,32)<br /> BIND_BIN(password,16)<br /> BIND_INT(status)<br /> BIND_INT(id)<br />END_BIND(account)</p><p>int main(){</p><p> try{<br /> <br /> DBMysql mysql;<br /> mysql_parm parm;<br /> parm.host="localhost";<br /> parm.user="root";<br /> parm.password="test";<br /> parm.unixsock="/var/lib/mysql/mysql.sock";<br /> parm.database="testdb";<br /> mysql.open(parm);//打开数据库<br /> <br /> DBSTMT
smt("select user,password,status,id from account",mysql);
//生成一个查询语法<br /> DBSTMT
smt1("insert into account(user,password,status) value(?,?,?)",mysql);
//另外一个<br /> //<br /> <br /> bind_account acc;<br /> </p><p><br /> smt.execute(acc);//执行查询,并bind返回结果到account结构 <br /> while(smt.fetch()){<br /> printf("%s %d %d\n",acc.user,acc.status,acc.id);<br /> <br /> };</p><p> smt1.bind(acc);//bind查询参数<br /> smt1.execute();//执行<br /> <br /> <br /> <br /> }catch(const char* err){<br /> printf("error:%s\n",err);<br /> }</p><p>}</p></span></pre></td></tr></tbody></table></center>

页: [1]
© 1999-2008 EvilOctal Security Team