部分GNU代码片 7、mysql接口

//头文件

#ifndef MYSQL_TOOL_H_
#define MYSQL_TOOL_H_

#include <string>
#include <map>
#include <vector>
#include <mysql.h>

/**
 * /file Magic_Mysql.hh
 * /brief this file supplied common mysql access API.
 */

 

/**
 * Magic_Mysql used to supply common mysql db access API.
 */
class CMysql
{

typedef std::map<std::string, int> STRING2INT;

public:
        //default constructor
    CMysql();
    
        /**
         * @param szHost indicates db host name or ip.
         * @param szUser indicates db account user name.
         * @param szPass indicates db account password .
         */
    CMysql(const char* szHost, const char* szUser, const char* szPass);

        //default destructor
    ~CMysql();
   
        /**
         * @param szHost indicates db host name or ip.
         * @param szUser indicates db account user name.
         * @param szPass indicates db account password .
         * @return 0 on success, -1 on failure.
         */
    int Connect(const char* szHost, const char* szUser, const char* szPass);

        /**
         * Used to establist db connection.
         */
    int Connect();

        /**
         * Used to execute db sql query.
         * @param szSqlString indicates sql string .
     * @return 0 onsuccess -1 fail..
         */
    int  Query(const char* szSqlString);

        /**
         * Used to execute db sql query.
         * @param szSqlString indicates sql string which should include binary data.
         * @param size indicates sql size of szSqlString.
         * @return 0 on scuesss -1 fail.
         */
         int  Query(const char* szSqlString,unsigned int size);

     
        /**
         * Used to store query result.
         * @return 0 onsuccess -1 on failure.
         */
    int StoreResult();
 
 
        /**
         * Used to Free Query result.
         */
    int FreeResult();


        /**
         * Used to get result row .
         * @return NULL on failure
         *  else result row of query.
         */
    char** FetchRow();


        /**
         * Used to strip abnormal character .
         * @param to indictes striped stirng.
         * @param from indicates original string.
         * @param len indicates from string length.
         * @return 0 on success,else fail.
         */
        int StripField(std::string& to, const char* from,unsigned long len);
 
        /**
         * Used to get field result by ordinal number.
         * @param iFiled indicates field ordinal number.
         * @return NULL on failure.
         *  else field result.
         */
    char* GetField(unsigned int iField);


        /**
         * Used to get field result by field name.
         * @param szFieldName indicates field name.
         * @return NULL on failure.
         *   else field result.
         */
    char* GetField(const char* szFieldName);


        /**
         * Used to get query affected rows.
         * @return affected row count.
         */
    unsigned int GetAffectedRows();


        /**
         * Used to get mysql sock handle.
         * @return sock handle.
         */
    inline   MYSQL* GetConnectHandle() 
        {
            return &m_connection;
        }

        inline const char* getErrMsg(void) const
        {
            return m_ErrMsg;
        } 
private:
    char m_ErrMsg[1024];
    char m_szHost[64];  // 数据库主机名
    char m_szUser[64];  // 数据库用户名
    char m_szPass[64];  // 数据库用户密码

    unsigned int  m_iField;
    MYSQL m_connection;
    MYSQL_RES *m_result;
    MYSQL_ROW m_row;
    STRING2INT m_FieldIndex;
    bool m_bFieldIndexInitialized;
    bool m_bConnected;

    int InitFieldName();
};


#endif /*MYSQL_TOOL_H_*/

 

//cpp文件

#include "mysql_tool.h"
#include <stdio.h>
using namespace std;

//
//
CMysql:: CMysql()
{
 mysql_init (&m_connection);
 m_bConnected = false;
 m_iField = 0;
 m_result = NULL;
 bzero (m_szHost, sizeof(m_szHost));
 bzero (m_szUser, sizeof(m_szUser));
 bzero (m_szPass, sizeof(m_szPass));
 m_bFieldIndexInitialized = false;
}

CMysql:: CMysql(const char* szHost, const char* szUser, const char* szPass)
{
 mysql_init(&m_connection);
 m_bConnected = false;
 m_iField = 0;
 m_result = NULL;
 strncpy (m_szHost, szHost, sizeof(m_szHost));
 strncpy (m_szUser, szUser, sizeof(m_szUser));
 strncpy (m_szPass, szPass, sizeof(m_szPass));
 m_bFieldIndexInitialized = false;
}

CMysql:: ~CMysql()
{
 if (m_bConnected)
 {
  FreeResult();
  mysql_close(&m_connection);
 }
}

int CMysql::StripField(string& to, const char* from,unsigned long len)
{
    if(from==NULL) return -1;

    char *tostr = new char[2*len+1];

    mysql_real_escape_string(&m_connection,tostr,from,len);
    to = tostr;
    delete [] tostr;
    return 0;
}


int CMysql:: Connect(const char* szHost, const char* szUser, const char* szPass)
{
 strncpy (m_szHost, szHost, sizeof(m_szHost));
 strncpy (m_szUser, szUser, sizeof(m_szUser));
 strncpy (m_szPass, szPass, sizeof(m_szPass));
 return Connect();
}

int CMysql:: Connect()
{
 if (!m_bConnected)
 {
  if (mysql_real_connect(&m_connection, m_szHost, m_szUser, m_szPass, NULL, 0, NULL, 0) == NULL)
  {
       sprintf (m_ErrMsg, "连接数据库失败:%s", mysql_error(&m_connection));
       return -1;
  }
  m_bConnected = true;
 }
 return 0;
}

int CMysql:: Query(const char* szSqlString)
{
 Connect();
 if (mysql_query(&m_connection, szSqlString) != 0)
 {
  sprintf (m_ErrMsg, "查询数据库失败:%s", mysql_error(&m_connection));
  return -1;
 }
 return 0;
}


int CMysql:: Query(const char* szSqlString,unsigned int size)
{
        Connect();
        if (mysql_real_query(&m_connection, szSqlString,size) != 0)
        {
                sprintf (m_ErrMsg, "查询数据库失败:%s", mysql_error(&m_connection));
                return -1;
        }
        return 0;
}

 

int CMysql:: FreeResult()
{
 if (m_result != NULL)
  mysql_free_result (m_result);
 m_iField = 0;
 if (m_bFieldIndexInitialized)
 {
  m_FieldIndex.erase(m_FieldIndex.begin(), m_FieldIndex.end());
  m_bFieldIndexInitialized = false;
 }
        m_result = NULL ;
 return 0;
}

int CMysql:: StoreResult()
{
 FreeResult();
 m_result = mysql_store_result (&m_connection);
 if (m_result == NULL)
 {
  sprintf (m_ErrMsg, "保存结果出错:%s!", mysql_error(&m_connection));
  return -1;
 }
 m_iField = mysql_num_fields (m_result);
 return 0;
}

char** CMysql:: FetchRow()
{
 if (m_result == NULL)
  StoreResult();
 m_row = mysql_fetch_row (m_result);
 return m_row;
}

int CMysql:: InitFieldName()
{
 if ((!m_bFieldIndexInitialized) && (m_result!=NULL))
 {
  unsigned int i;
  MYSQL_FIELD *fields;

  fields = mysql_fetch_fields(m_result);
  for(i = 0; i < m_iField; i++)
  {
   m_FieldIndex[fields[i].name] = i;
  }
  m_bFieldIndexInitialized = true;
 }
 return 0;
}

/*
 返回结果的行数
*/
unsigned int CMysql:: GetAffectedRows()
{
 my_ulonglong iNumRows;

 if (m_result == NULL) return 0;
 iNumRows = mysql_affected_rows(&m_connection);

 return (unsigned int)iNumRows;
}
/*
 按照字段名取回当前行的结果
*/
char* CMysql:: GetField(const char* szFieldName)
{
 InitFieldName();
 return GetField(m_FieldIndex[szFieldName]);
}
/*
 按照字段索引取回当前行的结果
*/
char* CMysql:: GetField(unsigned int iField)
{
 if (iField > m_iField)
  return NULL;
 return m_row[iField];
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值