亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qsql_sqlite3.cpp

?? LINUX 下以 QT/KDE 寫的 SVN 客戶端
?? CPP
字號:
/******************************************************************************** Implementation of SQLite driver classes.**** Copyright (C) 1992-2003 Trolltech AS. All rights reserved.**** This file is part of the sql module of the Qt GUI Toolkit.** EDITIONS: FREE, ENTERPRISE**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qsql_sqlite3.h"#include <qdatetime.h>#include <qvaluevector.h>#include <qregexp.h>#include <qfile.h>#include <sqlite3.h>#if (QT_VERSION-0 < 0x030200)#  include <qvector.h>#  if !defined Q_WS_WIN32#    include <unistd.h>#  endif#else#  include <qptrvector.h>#  if !defined Q_WS_WIN32#    include <unistd.h>#  endif#endiftypedef struct sqlite3_stmt sqlite3_stmt;#define QSQLITE3_DRIVER_NAME "QSQLITE3"static QVariant::Type qSqliteType(int tp){    switch (tp) {    case SQLITE_INTEGER:        return QVariant::Int;    case SQLITE_FLOAT:        return QVariant::Double;    case SQLITE_BLOB:        return QVariant::ByteArray;    case SQLITE_TEXT:    default:        return QVariant::String;    }}static QSqlError qMakeError(sqlite3 *access, const QString &descr, QSqlError::Type type,                            int errorCode = -1){    return QSqlError(descr,                     QString::fromUtf8(sqlite3_errmsg(access)),                     type, errorCode);}class QSQLite3DriverPrivate{public:    QSQLite3DriverPrivate();    sqlite3 *access;    bool utf8;};QSQLite3DriverPrivate::QSQLite3DriverPrivate() : access(0){    utf8 = true;}class QSQLite3ResultPrivate{public:    QSQLite3ResultPrivate(QSQLite3Result *res);    void cleanup();    bool fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch);    bool isSelect();    // initializes the recordInfo and the cache    void initColumns();    void finalize();    QSQLite3Result* q;    sqlite3 *access;    sqlite3_stmt *stmt;    uint skippedStatus: 1; // the status of the fetchNext() that's skipped    uint skipRow: 1; // skip the next fetchNext()?    uint utf8: 1;    QSqlRecord rInf;};static const uint initial_cache_size = 128;QSQLite3ResultPrivate::QSQLite3ResultPrivate(QSQLite3Result* res) : q(res), access(0),    stmt(0), skippedStatus(false), skipRow(false), utf8(false){}void QSQLite3ResultPrivate::cleanup(){    finalize();    rInf.clear();    skippedStatus = false;    skipRow = false;    q->setAt(QSql::BeforeFirst);    q->setActive(false);    q->cleanup();}void QSQLite3ResultPrivate::finalize(){    if (!stmt)        return;    sqlite3_finalize(stmt);    stmt = 0;}// called on first fetchvoid QSQLite3ResultPrivate::initColumns(){    rInf.clear();    int nCols = sqlite3_column_count(stmt);    if (nCols <= 0)        return;    q->init(nCols);    for (int i = 0; i < nCols; ++i) {        QString colName = QString::fromUtf8(sqlite3_column_name(stmt, i));        int dotIdx = colName.findRev('.');        rInf.append(QSqlField(colName.mid(dotIdx == -1 ? 0 : dotIdx + 1),                qSqliteType(sqlite3_column_type(stmt, i))));    }}bool QSQLite3ResultPrivate::fetchNext(QSqlCachedResult::ValueCache &values, int idx, bool initialFetch){    int res;    unsigned int i;    if (skipRow) {        // already fetched        Q_ASSERT(!initialFetch);        skipRow = false;        return skippedStatus;    }    skipRow = initialFetch;    if (!stmt)        return false;    // keep trying while busy, wish I could implement this better.    while ((res = sqlite3_step(stmt)) == SQLITE_BUSY) {        // sleep instead requesting result again immidiately.#if defined Q_OS_WIN        Sleep(1000);#else        sleep(1);#endif    }    switch(res) {    case SQLITE_ROW:        // check to see if should fill out columns        if (rInf.isEmpty())            // must be first call.            initColumns();        if (idx < 0 && !initialFetch)            return true;        for (i = 0; i < rInf.count(); ++i)            // todo - handle other types            values[i + idx] = QString::fromUtf8((char *)(sqlite3_column_text(stmt, i))); //           values[i + idx] = utf8 ? QString::fromUtf8(fvals[i]) : QString::fromAscii(fvals[i]);        return true;    case SQLITE_DONE:        if (rInf.isEmpty())            // must be first call.            initColumns();        q->setAt(QSql::AfterLast);        return false;    case SQLITE_ERROR:    case SQLITE_MISUSE:    default:        // something wrong, don't get col info, but still return false        q->setLastError(qMakeError(access, "Unable to fetch row", QSqlError::Connection, res));        finalize();        q->setAt(QSql::AfterLast);        return false;    }    return false;}QSQLite3Result::QSQLite3Result(const QSQLite3Driver* db)    : QSqlCachedResult(db){    d = new QSQLite3ResultPrivate(this);    d->access = db->d->access;}QSQLite3Result::~QSQLite3Result(){    d->cleanup();    delete d;}/*   Execute \a query.*/bool QSQLite3Result::reset (const QString &query){    // this is where we build a query.    if (!driver() || !driver()->isOpen() || driver()->isOpenError())        return false;    d->cleanup();    setSelect(false);    int res = sqlite3_prepare_v2(d->access, query.utf8().data(), (query.length() + 1) * sizeof(QChar),                                &d->stmt, 0);    if (res != SQLITE_OK) {        setLastError(qMakeError(d->access, "Unable to execute statement", QSqlError::Statement, res));        d->finalize();        return false;    }    d->skippedStatus = d->fetchNext(cache(), 0, true);    setSelect(!d->rInf.isEmpty());    setActive(true);    return true;}bool QSQLite3Result::gotoNext(QSqlCachedResult::ValueCache& row, int idx){    return d->fetchNext(row, idx, false);}int QSQLite3Result::size(){    return -1;}int QSQLite3Result::numRowsAffected(){    return sqlite3_changes(d->access);}/////////////////////////////////////////////////////////QSQLite3Driver::QSQLite3Driver(QObject * parent, const char *name)    : QSqlDriver(parent, name){    d = new QSQLite3DriverPrivate();}QSQLite3Driver::QSQLite3Driver(sqlite3 *connection, QObject *parent, const char *name)    : QSqlDriver(parent, name){    d = new QSQLite3DriverPrivate();    d->access = connection;    setOpen(true);    setOpenError(false);}QSQLite3Driver::~QSQLite3Driver(){    delete d;}bool QSQLite3Driver::hasFeature(DriverFeature f) const{    switch (f) {    case Transactions:    case Unicode:    case BLOB:        return true;    default:        break;    }    return false;}/*   SQLite dbs have no user name, passwords, hosts or ports.   just file names.*/bool QSQLite3Driver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &){    if (isOpen())        close();    if (db.isEmpty())        return false;    if (sqlite3_open(QFile::encodeName(db), &d->access) == SQLITE_OK) {        setOpen(true);        setOpenError(false);        return true;    } else {        setLastError(qMakeError(d->access, "Error opening database",                     QSqlError::Connection));        setOpenError(true);        return false;    }}void QSQLite3Driver::close(){    if (isOpen()) {        if (sqlite3_close(d->access) != SQLITE_OK)            setLastError(qMakeError(d->access, "Error closing database",                                    QSqlError::Connection));        d->access = 0;        setOpen(false);        setOpenError(false);    }}QSqlQuery QSQLite3Driver::createQuery() const{    return QSqlQuery(new QSQLite3Result(this));}bool QSQLite3Driver::beginTransaction(){    if (!isOpen() || isOpenError())        return false;    QSqlQuery q(createQuery());    if (!q.exec("BEGIN")) {        setLastError(QSqlError("Unable to begin transaction",                               q.lastError().databaseText(), QSqlError::Transaction));        return false;    }    return true;}bool QSQLite3Driver::commitTransaction(){    if (!isOpen() || isOpenError())        return false;    QSqlQuery q(createQuery());    if (!q.exec("COMMIT")) {        setLastError(QSqlError("Unable to begin transaction",                               q.lastError().databaseText(), QSqlError::Transaction));        return false;    }    return true;}bool QSQLite3Driver::rollbackTransaction(){    if (!isOpen() || isOpenError())        return false;    QSqlQuery q(createQuery());    if (!q.exec("ROLLBACK")) {        setLastError(QSqlError("Unable to begin transaction",                               q.lastError().databaseText(), QSqlError::Transaction));        return false;    }    return true;}QStringList QSQLite3Driver::tables(const QString &typeName) const{    QStringList res;    if (!isOpen())        return res;    int type = typeName.toInt();    QSqlQuery q = createQuery();    q.setForwardOnly(TRUE);#if (QT_VERSION-0 >= 0x030200)    if ((type & (int)QSql::Tables) && (type & (int)QSql::Views))        q.exec("SELECT name FROM sqlite_master WHERE type='table' OR type='view'");    else if (typeName.isEmpty() || (type & (int)QSql::Tables))        q.exec("SELECT name FROM sqlite_master WHERE type='table'");    else if (type & (int)QSql::Views)        q.exec("SELECT name FROM sqlite_master WHERE type='view'");#else        q.exec("SELECT name FROM sqlite_master WHERE type='table' OR type='view'");#endif    if (q.isActive()) {        while(q.next())            res.append(q.value(0).toString());    }#if (QT_VERSION-0 >= 0x030200)    if (type & (int)QSql::SystemTables) {        // there are no internal tables beside this one:        res.append("sqlite_master");    }#endif    return res;}QSqlIndex QSQLite3Driver::primaryIndex(const QString &tblname) const{    QSqlRecordInfo rec(recordInfo(tblname)); // expensive :(    if (!isOpen())        return QSqlIndex();    QSqlQuery q = createQuery();    q.setForwardOnly(TRUE);    // finrst find a UNIQUE INDEX    q.exec("PRAGMA index_list('" + tblname + "');");    QString indexname;    while(q.next()) {	if (q.value(2).toInt()==1) {	    indexname = q.value(1).toString();	    break;	}    }    if (indexname.isEmpty())	return QSqlIndex();    q.exec("PRAGMA index_info('" + indexname + "');");    QSqlIndex index(indexname);    while(q.next()) {	QString name = q.value(2).toString();	QSqlVariant::Type type = QSqlVariant::Invalid;	if (rec.contains(name))	    type = rec.find(name).type();	index.append(QSqlField(name, type));    }    return index;}QSqlRecordInfo QSQLite3Driver::recordInfo(const QString &tbl) const{    if (!isOpen())        return QSqlRecordInfo();    QSqlQuery q = createQuery();    q.setForwardOnly(TRUE);    q.exec("SELECT * FROM " + tbl + " LIMIT 1");    return recordInfo(q);}QSqlRecord QSQLite3Driver::record(const QString &tblname) const{    if (!isOpen())        return QSqlRecord();    return recordInfo(tblname).toRecord();}QSqlRecord QSQLite3Driver::record(const QSqlQuery& query) const{    if (query.isActive() && query.driver() == this) {        QSQLite3Result* result = (QSQLite3Result*)query.result();        return result->d->rInf;    }    return QSqlRecord();}QSqlRecordInfo QSQLite3Driver::recordInfo(const QSqlQuery& query) const{    if (query.isActive() && query.driver() == this) {        QSQLite3Result* result = (QSQLite3Result*)query.result();        return QSqlRecordInfo(result->d->rInf);    }    return QSqlRecordInfo();}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av在线播放网址| 国产精品夜夜爽| 99久久精品国产一区二区三区| 99久精品国产| 国产不卡视频在线观看| 欧美网站一区二区| 欧美性视频一区二区三区| 奇米色一区二区三区四区| 欧美videos大乳护士334| 97精品电影院| 久久国产福利国产秒拍| 紧缚奴在线一区二区三区| 美女国产一区二区三区| 久久久99久久| 夜夜嗨av一区二区三区网页 | 欧美视频中文一区二区三区在线观看 | 欧美一区二区三区日韩| www.av精品| 欧美日韩国产免费一区二区| 日本丶国产丶欧美色综合| 国产精品久久久久久久第一福利| 亚洲国产电影在线观看| 激情成人综合网| 中文子幕无线码一区tr| 久久精品国产秦先生| 亚洲福利电影网| 韩国精品主播一区二区在线观看 | 中文字幕一区二| 91污片在线观看| 欧美性大战久久久久久久蜜臀| 欧美日韩免费电影| 国产精品电影一区二区三区| 日韩av中文在线观看| 亚洲欧美另类小说| 欧洲国产伦久久久久久久| 在线观看国产91| 中文字幕一区二区三区不卡| 97久久精品人人爽人人爽蜜臀| 成人免费黄色在线| 色婷婷精品久久二区二区蜜臂av| 欧美精品一区视频| 欧美久久一二三四区| 在线亚洲一区二区| 亚洲卡通欧美制服中文| 一区二区三区精品在线观看| 日韩不卡一区二区| 国产乱人伦精品一区二区在线观看 | 5858s免费视频成人| 精品国产一区a| 性久久久久久久久| 免费观看成人鲁鲁鲁鲁鲁视频| 国产日韩欧美精品电影三级在线| 精品国产免费一区二区三区香蕉| 欧美午夜理伦三级在线观看| 国产精品久99| 精品一区二区三区免费观看| 欧美日韩一区中文字幕| 蜜桃视频一区二区三区| 中文字幕中文字幕一区| 日本丰满少妇一区二区三区| 欧美视频在线不卡| 久久精品一区二区三区四区| 亚洲午夜国产一区99re久久| 午夜伊人狠狠久久| 亚洲人精品午夜| 一区二区日韩av| 成人午夜电影久久影院| 在线观看免费亚洲| 樱花草国产18久久久久| 国产精品一区二区久久不卡| 欧美电视剧在线观看完整版| 在线免费不卡视频| 日本道精品一区二区三区| 91精品国产综合久久香蕉的特点 | 成人精品视频一区二区三区尤物| 国产91精品欧美| 欧美国产乱子伦| 日韩美女啊v在线免费观看| 99r精品视频| 国产精品久久久久久久久晋中 | 日韩一级片在线观看| 免费欧美日韩国产三级电影| 久久久久久久综合日本| 91精品综合久久久久久| 午夜影视日本亚洲欧洲精品| 波多野结衣视频一区| 亚洲男人的天堂一区二区| 又紧又大又爽精品一区二区| 欧美亚洲图片小说| 欧美绝品在线观看成人午夜影视| 激情欧美一区二区三区在线观看| 日本不卡高清视频| 国产精品区一区二区三| 亚洲国产精品久久一线不卡| 欧美日本在线看| 美女尤物国产一区| 亚洲三级在线看| 亚洲地区一二三色| 免费成人在线观看| 国产中文一区二区三区| 精品成人a区在线观看| 91精品国产色综合久久久蜜香臀| 中文字幕一区二区三区在线播放| 91女人视频在线观看| 欧美精品久久一区二区三区| 国产日韩欧美亚洲| 99re热这里只有精品免费视频| 一区二区三区在线观看动漫| 精品国产伦一区二区三区免费 | 水野朝阳av一区二区三区| 久久众筹精品私拍模特| 欧美国产精品劲爆| 亚洲精品一区二区三区精华液| 成人黄色电影在线| 99久久亚洲一区二区三区青草| 丁香婷婷综合色啪| 日韩av电影免费观看高清完整版| 精品亚洲成a人| 91免费看视频| 久草在线在线精品观看| 欧美日韩国产乱码电影| 色综合天天在线| 久久电影网电视剧免费观看| 韩国一区二区视频| 日本不卡一二三| 色噜噜狠狠成人中文综合 | 成人av资源网站| 91精品办公室少妇高潮对白| 国产传媒欧美日韩成人| 床上的激情91.| 成人免费看视频| 久久品道一品道久久精品| 国产乱子伦一区二区三区国色天香 | 日韩福利电影在线| 亚洲一区二区在线观看视频| 精品国产乱码久久久久久图片| 国产精品美女久久久久aⅴ国产馆| 丁香天五香天堂综合| 国产91高潮流白浆在线麻豆| 亚洲国产综合色| 国产传媒欧美日韩成人| 色婷婷av一区二区三区gif| 国产欧美一区二区精品性| 日韩av电影一区| 午夜欧美视频在线观看| 一本色道久久综合狠狠躁的推荐| 亚洲欧美日韩国产一区二区三区 | 国产精品一区一区三区| 99国产精品久久久久久久久久久| 成人免费高清视频在线观看| 欧美在线观看视频在线| 亚洲三级免费观看| 91亚洲精品久久久蜜桃| 欧美成人a视频| 国产欧美一区二区精品忘忧草| 免费精品视频最新在线| 国产三级精品三级| 老司机一区二区| 欧美伦理电影网| 国产一区二区0| 亚洲精品成人精品456| 色美美综合视频| 精品久久久久久久久久久久久久久 | 成人ar影院免费观看视频| 欧美一区二区三区日韩视频| 国产一区欧美一区| 亚洲综合丝袜美腿| 久久久青草青青国产亚洲免观| 久久国产精品99精品国产 | 欧美a级一区二区| 国产91丝袜在线播放九色| 在线观看成人小视频| 午夜国产精品一区| 亚洲丝袜另类动漫二区| 日本欧美加勒比视频| 色婷婷久久一区二区三区麻豆| 日本一区二区电影| www.99精品| 亚洲成a人在线观看| 欧美在线观看视频一区二区| 亚洲国产综合91精品麻豆| 日韩欧美三级在线| 在线亚洲精品福利网址导航| 美腿丝袜在线亚洲一区| 亚洲成人动漫一区| 色又黄又爽网站www久久| 国产一区二区在线看| 亚洲激情图片qvod| 久久久.com| 久久电影网电视剧免费观看| 专区另类欧美日韩| 亚洲人成在线观看一区二区| 久久综合网色—综合色88| 久久国产精品色| 亚洲一区二区三区国产| 精品一区二区三区av| 成人免费视频免费观看| 日韩成人免费看| 91精品国产欧美一区二区成人| a亚洲天堂av|