Exemple #1
0
bool
DB::is_disc_present(const char* discname) throw(DBError)
{
    const char* disc_presence_check = "SELECT DISTINCT disc FROM ddb WHERE disc LIKE ?";

    int result;

    bool disc_present = false;

    std::string error_message = "Could not check disc presence";

    // Prepare SQL statement
    sqlite3_stmt* stmt;

    result =
        sqlite3_prepare_v2(db, disc_presence_check, -1, &stmt, NULL);

    if(result != SQLITE_OK)
        throw(DBError(error_message, DBError::PREPARE_STATEMENT));

    // Execute SQL statement
    result =
        sqlite3_step(stmt);

    // Check whether we have at least one disc in the database
    if(result == SQLITE_ROW)
    {
        disc_present = true;
    }
    else if(result == SQLITE_DONE)
    {
        disc_present = false;
    }
    else
    {
        // We got an error
        throw(DBError(error_message, DBError::EXECUTE_STATEMENT));
    }

    // Finalize SQL statement
    result =
        sqlite3_finalize(stmt);

    if(result != SQLITE_OK)
        throw(DBError(error_message, DBError::FINALIZE_STATEMENT));

    // Return disc presence
    return disc_present;
}
Exemple #2
0
bool
DB::has_correct_format(void) throw(DBError)
{
    const char* version_check = "SELECT COUNT(*) AS count, version FROM ddb_version";

    std::string error_message = "Could not check database correctness";

    int result;

    bool format_is_correct = false;

    // Prepare SQL statement
    sqlite3_stmt* stmt;

    result =
        sqlite3_prepare_v2(db, version_check, -1, &stmt, NULL);

    if(result != SQLITE_OK)
        throw(DBError(error_message, DBError::PREPARE_STATEMENT));

    // Execute SQL statement
    result =
        sqlite3_step(stmt);

    if(result != SQLITE_ROW)
        throw(DBError(error_message, DBError::EXECUTE_STATEMENT));

    // Result should have only one row
    if(sqlite3_column_int(stmt, 0) == 1)
    {
        // Version in database should be equal to the version of this class
        format_is_correct = (sqlite3_column_int(stmt, 1) == version);
    }

    // Finalize SQL statement
    result =
        sqlite3_finalize(stmt);

    if(result != SQLITE_OK)
        throw(DBError(error_message, DBError::FINALIZE_STATEMENT));

    if(!format_is_correct)
        p->msg("Database has wrong format!", Print::INFO);

    // Return correctness
    return format_is_correct;
}
yasper::ptr<TupleIterator> Statement::begin() {
   if(not stmt)
      throw ValueError("The statement is null.");

   if(sqlite3_reset(stmt) != SQLITE_OK)
      throw DBError(db, "The statement cannot be reset (or initializated).");

   return yasper::ptr<TupleIterator>(new TupleIterator(db, *stmt));
}
Exemple #4
0
void
QtSqlCursorBackend::prepare(const String &sql)
{
    clear();
    stmt_.reset(new QSqlQuery(*conn_));
    stmt_->setForwardOnly(true);
    if (!stmt_->prepare(sql))
        throw DBError(stmt_->lastError().text());
}
Exemple #5
0
void
SQLiteConnectionBackend::begin_trans()
{
    sqlite3_exec(conn_, "BEGIN TRANSACTION", NULL, 0, 0);
    if (SQLITE_OK != sqlite3_errcode(conn_)) {
        const char *err = sqlite3_errmsg(conn_);
        throw DBError(WIDEN(err));
    }
}
Exemple #6
0
void
SQLiteCursorBackend::exec_direct(const String &sql)
{
    int rs = sqlite3_exec(conn_, NARROW(sql).c_str(), 0, 0, 0);
    if (SQLITE_OK != sqlite3_errcode(conn_)) {
        const char *err = sqlite3_errmsg(conn_);
        throw DBError(WIDEN(err));
    }
}
Exemple #7
0
void
SQLiteConnectionBackend::rollback()
{
    sqlite3_exec(conn_, "ROLLBACK", NULL, 0, 0);
    if (SQLITE_OK != sqlite3_errcode(conn_)) {
        const char *err = sqlite3_errmsg(conn_);
        throw DBError(WIDEN(err));
    }
}
Exemple #8
0
void
SQLiteConnectionBackend::commit()
{
    sqlite3_exec(conn_, "COMMIT", NULL, 0, 0);
    if (SQLITE_OK != sqlite3_errcode(conn_)) {
        const char *err = sqlite3_errmsg(conn_);
        throw DBError(WIDEN(err));
    }
}
Exemple #9
0
void
SQLiteCursorBackend::prepare(const String &sql)
{
    close();
    sqlite3_prepare_v2(conn_, NARROW(sql).c_str(), -1, &stmt_, 0);
    if (SQLITE_OK != sqlite3_errcode(conn_) || !stmt_) {
        const char *err = sqlite3_errmsg(conn_);
        throw DBError(WIDEN(err));
    }
}
 SQLiteDB() {
     db=NULL;
     if (file.size()==0) {
         throw DBError("Database file not set.");
     }
     int rc=sqlite3_open(file.c_str(),&db);
     if (rc) {
         DBError::busy_aware_throw(rc,sqlite3_errmsg(db));
     }
 }
Exemple #11
0
void
SOCIConnectionBackend::begin_trans()
{
    try {
        conn_->begin();
    }
    catch (const soci::soci_error &e) {
        throw DBError(WIDEN(e.what()));
    }
}
Exemple #12
0
void
SOCIConnectionBackend::rollback()
{
    try {
        conn_->rollback();
    }
    catch (const soci::soci_error &e) {
        throw DBError(WIDEN(e.what()));
    }
}
Exemple #13
0
void
SOCICursorBackend::exec_direct(const String &sql)
{
    try {
        conn_->once << NARROW(sql);
    }
    catch (const soci::soci_error &e) {
        throw DBError(WIDEN(e.what()));
    }
}
Exemple #14
0
void
SQLiteConnectionBackend::open(SqlDialect *dialect, const SqlSource &source)
{
    close();
    ScopedLock lock(drv_->conn_mux_);
    own_handle_ = true;
    sqlite3_open(NARROW(source.db()).c_str(), &conn_);
    if (SQLITE_OK != sqlite3_errcode(conn_)) {
        const char *err = sqlite3_errmsg(conn_);
        throw DBError(WIDEN(err));
    }
}
Exemple #15
0
void
SOCICursorBackend::bind_params(const TypeCodes &types)
{
    param_types_ = types;
    if (in_params_.size())
        throw DBError(_T("bind_params: already bound!"));
    in_params_.resize(types.size());
    in_flags_.resize(types.size());
    for (size_t i = 0; i < types.size(); ++i) {
        in_flags_[i] = soci::i_null;
        switch (types[i]) {
            case Value::INTEGER: {
                if (in_params_[i].size() < sizeof(int))
                    in_params_[i].resize(sizeof(int));
                int &x = *(int *)&(in_params_[i][0]);
                x = 0;
                stmt_->exchange(soci::use(x, in_flags_[i]));
                break;
            }
            case Value::LONGINT: {
                if (in_params_[i].size() < sizeof(LongInt))
                    in_params_[i].resize(sizeof(LongInt));
                LongInt &x = *(LongInt *)&(in_params_[i][0]);
                x = 0;
                stmt_->exchange(soci::use(x, in_flags_[i]));
                break;
            }
            case Value::FLOAT: {
                if (in_params_[i].size() < sizeof(double))
                    in_params_[i].resize(sizeof(double));
                double &x = *(double *)&(in_params_[i][0]);
                x = 0;
                stmt_->exchange(soci::use(x, in_flags_[i]));
                break;
            }
            case Value::DATETIME: {
                if (in_params_[i].size() < sizeof(std::tm))
                    in_params_[i].resize(sizeof(std::tm));
                std::tm &x = *(std::tm *)&(in_params_[i][0]);
                memset(&x, 0, sizeof(x));
                stmt_->exchange(soci::use(x, in_flags_[i]));
                break;
            }
            default: {
                stmt_->exchange(soci::use(in_params_[i], in_flags_[i]));
            }
        }
    }
    if (is_select_)
        stmt_->exchange(soci::into(row_));
    stmt_->define_and_bind();
}
Exemple #16
0
void
QtSqlConnectionBackend::open(SqlDialect *dialect, const SqlSource &source)
{
    close();
    ScopedLock lock(drv_->conn_mux_);
    own_handle_ = true;
    conn_name_ = dialect->get_name() + _T("_") + source.db()
        + _T("_") + to_string(drv_->seq_);
    ++drv_->seq_;
    String driver = source.driver();
    bool eat_slash = false;
    if (driver == _T("QTSQL"))
    {
        if (dialect->get_name() == _T("MYSQL"))
            driver = _T("QMYSQL");
        else if (dialect->get_name() == _T("POSTGRES"))
            driver = _T("QPSQL");
        else if (dialect->get_name() == _T("ORACLE"))
            driver = _T("QOCI");
        else if (dialect->get_name() == _T("INTERBASE"))
            driver = _T("QIBASE");
        else if (dialect->get_name() == _T("SQLITE"))
            driver = _T("QSQLITE");
        if (dialect->native_driver_eats_slash()
                && !str_empty(source.db())
                && char_code(source.db()[0]) == '/')
            eat_slash = true;
    }
    conn_ = new QSqlDatabase(QSqlDatabase::addDatabase(driver, conn_name_));
    if (eat_slash)
        conn_->setDatabaseName(str_substr(source.db(), 1));
    else
        conn_->setDatabaseName(source.db());
    conn_->setUserName(source.user());
    conn_->setPassword(source.passwd());
    if (source.port() > 0)
        conn_->setPort(source.port());
    if (!str_empty(source.host()))
        conn_->setHostName(source.host());
    String options;
    Strings keys = source.options();
    for (size_t i = 0; i < keys.size(); ++i) {
        if (!str_empty(options))
            options += _T(";");
        options += keys[i] + _T("=") + source[keys[i]];
    }
    if (!str_empty(options))
        conn_->setConnectOptions(options);
    if (!conn_->open())
        throw DBError(conn_->lastError().text());
}
Exemple #17
0
void SOCIConnectionBackend::close()
{
    try {
        if (own_handle_) {
            if (conn_)
                delete conn_;
            own_handle_ = false;
        }
        conn_ = NULL;
    }
    catch (const soci::soci_error &e) {
        throw DBError(WIDEN(e.what()));
    }
}
Exemple #18
0
void
SQLiteCursorBackend::exec(const Values &params)
{
    if (exec_count_)
        sqlite3_reset(stmt_);
    ++exec_count_;
    vector<string> str_params(params.size());
    for (size_t i = 0; i < params.size(); ++i) {
        if (params[i].get_type() == Value::INTEGER
                || params[i].get_type() == Value::LONGINT)
        {
            sqlite3_bind_int(stmt_, i + 1, params[i].as_integer());
            if (SQLITE_OK != sqlite3_errcode(conn_)) {
                const char *err = sqlite3_errmsg(conn_);
                throw DBError(WIDEN(err));
            }
        } else if (params[i].is_null()) {
            sqlite3_bind_null(stmt_, i + 1);
            if (SQLITE_OK != sqlite3_errcode(conn_)) {
                const char *err = sqlite3_errmsg(conn_);
                throw DBError(WIDEN(err));
            }
        } else {
            str_params[i] = NARROW(params[i].as_string());
            sqlite3_bind_text(stmt_, i + 1,
                    str_params[i].c_str(), str_params[i].size(), SQLITE_STATIC);
            if (SQLITE_OK != sqlite3_errcode(conn_)) {
                const char *err = sqlite3_errmsg(conn_);
                throw DBError(WIDEN(err));
            }
        }
    }
    last_code_ = sqlite3_step(stmt_);
    if (last_code_ != SQLITE_DONE && last_code_ != SQLITE_ROW
            && last_code_ != SQLITE_OK)
        throw DBError(WIDEN(sqlite3_errmsg(conn_)));
}
TupleIterator& TupleIterator::operator++() {
   while(true) {
      switch(sqlite3_step(&stmt)) {
         case SQLITE_DONE:
            done = true;
         case SQLITE_ROW:
            return *this;
         case SQLITE_BUSY:
            sleep(1);
            break;
         default:
            throw DBError(db, "An error ocurred when executing the statement.");
      }
   }
}
Exemple #20
0
void
DB::add_disc(const char* disc_name, const char* starting_path) throw(DBError)
{
    const char* begin_transaction = "BEGIN";
    const char* add_entry = "INSERT INTO ddb (directory, file, disc) VALUES (?, ?, ?)";
    const char* end_transaction = "COMMIT";

    std::string error_message = std::string("Could not add disc ") + disc_name;

    int result;

    // Declare disc root directory
    fs::path disc_path(starting_path);

    // Check, whether disc path is a directory
    if(!fs::is_directory(disc_path))
        throw(DBError(std::string("Path ") + starting_path + " is not a directory", DBError::FILE_ERROR));

    // Container of file names
    std::vector<std::pair<fs::path, bool> > filenames;

    // Open directory and iterate through it recursively
    fs::path current_path;
    bool current_path_is_directory;
    fs::recursive_directory_iterator end;

    for(fs::recursive_directory_iterator dir(disc_path);
            dir != end;
            dir++)
    {
        current_path = dir->path();
        current_path_is_directory = fs::is_directory(current_path);

        // Put current file name into vector
        filenames.push_back(std::make_pair(current_path, current_path_is_directory));
    }

    // Sort filenames
    sort(filenames.begin(),filenames.end());

    // Print file names, if verbosity is set high enough
    if(p->get_verbosity() >= Print::VERBOSE_DEBUG)
    {
        std::pair<fs::path, bool> it;
        foreach(it, filenames)
        {
            std::cout << (it.second ? "Directory" : "File") << " " << it.first << std::endl;
        }
Exemple #21
0
void
SOCICursorBackend::prepare(const String &sql)
{
    close();
    sql_ = NARROW(sql);
    is_select_ = starts_with(
            str_to_upper(trim_trailing_space(sql)), _T("SELECT"));
    try {
        stmt_ = new soci::statement(*conn_);
        stmt_->alloc();
        stmt_->prepare(sql_);
    }
    catch (const soci::soci_error &e) {
        throw DBError(WIDEN(e.what()));
    }
}
Exemple #22
0
void
SOCICursorBackend::close()
{
    try {
        if (stmt_) {
            delete stmt_;
            stmt_ = NULL;
            is_select_ = false;
            bound_first_ = false;
            executed_ = false;
            sql_.empty();
        }
    }
    catch (const soci::soci_error &e) {
        throw DBError(WIDEN(e.what()));
    }
}
Exemple #23
0
void
DB::close(void) throw(DBError)
{
    std::string error_message = "Could not close database";
    int result;

    p->msg("Closing database...", Print::VERBOSE);

    // Close database
    result =
        sqlite3_close(db);

    // If something went wrong, throw an exception
    if(result != SQLITE_OK)
        throw(DBError(error_message, DBError::FILE_ERROR));

    p->msg("Done.", Print::DEBUG);
}
Exemple #24
0
RowPtr SQLiteCursorBackend::fetch_row()
{
    if (SQLITE_DONE == last_code_ || SQLITE_OK == last_code_)
        return RowPtr();
    if (SQLITE_ROW != last_code_)
        throw DBError(WIDEN(sqlite3_errmsg(conn_)));
    int col_count = sqlite3_column_count(stmt_);
    RowPtr row(new Row(col_count));
    for (int i = 0; i < col_count; ++i) {
        String name = str_to_upper(WIDEN(sqlite3_column_name(stmt_, i)));
        int type = sqlite3_column_type(stmt_, i);
        (*row)[i].first = name;
        if (SQLITE_NULL != type)
            (*row)[i].second = Value(
                    WIDEN((const char *)sqlite3_column_text(stmt_, i)));
    }
    last_code_ = sqlite3_step(stmt_);
    return row;
}
Exemple #25
0
void
SOCIConnectionBackend::open(SqlDialect *dialect, const SqlSource &source)
{
    close();
    own_handle_ = true;
    try {
        String driver = source.driver();
        std::string soci_backend = "odbc";
        if (driver == _T("SOCI"))
            soci_backend = soci_convert_dialect(dialect->get_name());
        conn_ = new soci::session(soci_backend, NARROW(source.db()));
#ifdef YB_SOCI_DEBUG
        conn_->set_log_stream(&cerr);
#endif
    }
    catch (const soci::soci_error &e) {
        throw DBError(WIDEN(e.what()));
    }
}
Exemple #26
0
void
DB::open(const char* dbname, bool initialize) throw(DBError)
{
    std::string error_message = std::string("Could not open file ") + dbname;

    int result;

    // Assume database is not open already
    assert(db == NULL);

    p->msg("Opening database...", Print::VERBOSE);

    // Open database
    result =
        sqlite3_open_v2(dbname, &db, SQLITE_OPEN_READWRITE, NULL);

    if(result != SQLITE_OK)
        throw(DBError(error_message), DBError::FILE_ERROR);

    p->msg("Done.", Print::DEBUG);
}
Exemple #27
0
void
QtSqlCursorBackend::exec(const Values &params)
{
    if (bound_.empty())
        for (unsigned i = 0; i < params.size(); ++i)
            bound_.push_back(QVariant());
    for (unsigned i = 0; i < params.size(); ++i) {
        if (params[i].is_null())
            bound_[i] = QVariant();
        else if (params[i].get_type() == Value::DATETIME)
            bound_[i] = QVariant(params[i].as_date_time());
        else if (params[i].get_type() == Value::INTEGER)
            bound_[i] = QVariant(params[i].as_integer());
        else if (params[i].get_type() == Value::LONGINT)
            bound_[i] = QVariant(params[i].as_longint());
        else if (params[i].get_type() == Value::FLOAT)
            bound_[i] = QVariant(params[i].as_float());
        else
            bound_[i] = QVariant(params[i].as_string());
        stmt_->bindValue(i, bound_[i]);
    }
    if (!stmt_->exec())
        throw DBError(stmt_->lastError().text());
}
Exemple #28
0
void
QtSqlConnectionBackend::rollback()
{
    if (!conn_->rollback())
        throw DBError(conn_->lastError().text());
}
Exemple #29
0
void
QtSqlConnectionBackend::commit()
{
    if (!conn_->commit())
        throw DBError(conn_->lastError().text());
}
Exemple #30
0
void
QtSqlConnectionBackend::begin_trans()
{
    if (!conn_->transaction())
        throw DBError(conn_->lastError().text());
}