⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysql.cpp

📁 LiteSQL is a C++ library that integrates C++ objects tightly to relational database and thus provide
💻 CPP
字号:
/* LiteSQL - MySQL-backend implementation *  * By Tero Laitinen  *  * See LICENSE for copyright information. */#include "compatibility.hpp"#include "litesql/mysql.hpp"#ifdef HAVE_LIBMYSQLCLIENT#include <string>namespace litesql {using namespace std;MySQL::Result::Result(MYSQL_RES * r) : res(r) {}MySQL::Result::~Result() {    mysql_free_result(res);}size_t MySQL::Result::fieldNum() const {    if (!res)        return 0;    return mysql_num_fields(res);}Record MySQL::Result::fields() const {    if (!res)        return Record();    MYSQL_FIELD * flds = mysql_fetch_fields(res);    Record rec;    rec.reserve(fieldNum());    for (size_t i = 0; i < fieldNum(); i++)        rec.push_back(flds[i].name);    return rec;}size_t MySQL::Result::recordNum() const {    if (!res)        return 0;    return mysql_num_rows(res);}  Records MySQL::Result::records() const {    if (!res)        return Records();    Records recs;    recs.resize(recordNum());    mysql_data_seek(res, 0);    size_t fieldnum = fieldNum();    for (size_t i = 0; i < recordNum(); i++) {        MYSQL_ROW row = mysql_fetch_row(res);        if (!row)            break;        recs[i].reserve(fieldnum);        for (size_t i2 = 0; i2 < fieldnum; i2++) {            recs[i].push_back(row[i2] ? row[i2] : "NULL");        }    }    return recs;}MySQL::Cursor::Cursor(string host, string user, string passwd, string database,        int port, string q) : res(NULL) {    mysql_init(&conn);    if (!mysql_real_connect(&conn, host.c_str(), user.c_str(), passwd.c_str(),              database.c_str(), port, NULL, 0)) {        throw DatabaseError(mysql_error(&conn));    }    if (mysql_real_query(&conn, q.c_str(), q.size())) {        throw SQLError(mysql_error(&conn));    }    res = mysql_use_result(&conn);    fieldNum = mysql_num_fields(res);}                                               Record MySQL::Cursor::fetchOne() {    MYSQL_ROW row = mysql_fetch_row(res);    if (!row)        return Record();    Record rec;    rec.reserve(fieldNum);    for (size_t i = 0; i < fieldNum; i++)        rec.push_back(row[i] ? row[i] : "NULL");    return rec;}MySQL::Cursor::~Cursor() {    while (mysql_fetch_row(res) != NULL) {}    mysql_free_result(res);    mysql_close(&conn);}MySQL::MySQL(string connInfo) {    Split params(connInfo);    host = "localhost";    int port = 0;    for (size_t i = 0; i < params.size(); i++) {        Split param(params[i], "=");        if (param.size() == 1)            continue;        if (param[0] == "host")            host = param[1];        else if (param[0] == "database")            database = param[1];        else if (param[0] == "password")            passwd = param[1];        else if (param[0] == "user")            user = param[1];        else if (param[0] == "port")            port = atoi(param[1]);    }    mysql_init(&conn);    if (!mysql_real_connect(&conn, host.c_str(), user.c_str(), passwd.c_str(),              database.c_str(), port, NULL, 0)) {        throw DatabaseError(mysql_error(&conn));    }}bool MySQL::supportsSequences() const {    return false;}string MySQL::getRowIDType() const {    return "INTEGER PRIMARY KEY AUTO_INCREMENT";}string MySQL::getInsertID() const {    return toString(mysql_insert_id(&conn));}void MySQL::begin() const {    execute("BEGIN");}void MySQL::commit() const {    execute("COMMIT");}void MySQL::rollback() const {    execute("ROLLBACK");}Backend::Result* MySQL::execute(string query) const {    if (mysql_real_query(&conn, query.c_str(), query.size())) {        throw SQLError(mysql_error(&conn));        }    return new Result(mysql_store_result(&conn));}Backend::Cursor* MySQL::cursor(string query) const {    return new Cursor(host, user, passwd, database, port, query);       }MySQL::~MySQL() {    mysql_close(&conn);}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -