Ejemplo n.º 1
0
 int insert(
         std::string                               table,
         std::vector<boost::optional<const char*>> fields,
         const CONTAINER&                          values,
         connection&                               conn
         )
 {
     std::string query_str = detail::insert_query_string(table, fields);
     sqlite3_stmt *stmt = nullptr;
     if(
         sqlite3_prepare(conn.handle(), query_str.c_str(), -1, &stmt, nullptr)
         !=
         SQLITE_OK
       )
     {
         std::ostringstream oss;
         oss << "error in SQLite insert (preparing); query: " << query_str <<
             " SQLite error: " << sqlite3_errmsg(conn.handle());
         throw std::runtime_error(oss.str());
     }
     bind_values(fields, values, stmt);
     sqlite::step(stmt, conn);
     if(sqlite3_finalize(stmt) != SQLITE_OK)
     {
         std::ostringstream oss;
         oss << "error in SQLite insert (finalising); query: " << query_str <<
             " SQLite error: " << sqlite3_errmsg(conn.handle());
         throw std::runtime_error(oss.str());
     }
     return detail::last_insert_rowid(conn);
 }
Ejemplo n.º 2
0
 void insert(
         std::string table,
         std::vector<boost::optional<const char*>> fields,
         json::list& values,
         connection& conn
         )
 {
     std::string query_str = detail::insert_query_string(table, fields);
     sqlite3_stmt *stmt = nullptr;
     sqlite3_prepare(conn.handle(), query_str.c_str(), -1, &stmt, nullptr);
     for(json::object& obj : values.objects)
     {
         sqlite3_reset(stmt);
         sqlite3_clear_bindings(stmt);
         bind_values(fields, CONTAINER(obj), stmt);
         sqlite::step(stmt);
     }
 }
Ejemplo n.º 3
0
    void update(
            std::string                               table,
            std::vector<boost::optional<const char*>> fields,
            T&                                        values,
            connection&                               db
            )
    {
        std::ostringstream query;
        query << "UPDATE " << table << " SET ";
        auto query_fields = fields;
        query_fields.erase(
                std::remove_if(
                    query_fields.begin(),
                    query_fields.end(),
                    [](const boost::optional<const char*>& field) -> bool {
                        return !field;
                    }
                    ),
                query_fields.end()
                );
        json::serialise(
            query_fields,
            [](const boost::optional<const char*>& field, std::ostream& os) {
                os << field.get() << " = ?";
            },
            ", ",
            query
            );
        // ID field
        query << " WHERE " << T::id_field() << " = " << values.id();

        sqlite3_stmt *stmt = nullptr;
        if( sqlite3_prepare(
                    db.handle(),
                    query.str().c_str(),
                    -1,
                    &stmt,
                    nullptr
                    ) != SQLITE_OK )
        {
            std::cerr << "Query: " << query.str() << std::endl;
            throw std::runtime_error("Preparing SQLite statement for update");
        }
        bind_values(fields, values, stmt);

        int step_ret = sqlite3_step(stmt);
        if( step_ret != SQLITE_OK && step_ret != SQLITE_DONE )
        {
            std::ostringstream oss;
            oss << "Stepping SQLite update " << sqlite3_errmsg(db.handle());
            throw std::runtime_error(oss.str());
        }

        int finalise_ret = sqlite3_finalize(stmt);
        if( finalise_ret != SQLITE_OK && finalise_ret != SQLITE_DONE)
        {
            std::ostringstream oss;
            oss << "SQLite finalise " << sqlite3_errmsg(db.handle());
            throw std::runtime_error(oss.str());
        }
    }