aboutsummaryrefslogtreecommitdiff
#pragma once

#include <functional>
#include <string>
#include <cstdint>

#include "types.hh"

class sqlite3;
class sqlite3_stmt;

namespace nix {

/* RAII wrapper to close a SQLite database automatically. */
struct SQLite
{
    sqlite3 * db;
    SQLite() { db = 0; }
    ~SQLite();
    operator sqlite3 * () { return db; }
};

/* RAII wrapper to create and destroy SQLite prepared statements. */
struct SQLiteStmt
{
    sqlite3 * db = 0;
    sqlite3_stmt * stmt = 0;
    SQLiteStmt() { }
    void create(sqlite3 * db, const std::string & s);
    ~SQLiteStmt();
    operator sqlite3_stmt * () { return stmt; }

    /* Helper for binding / executing statements. */
    class Use
    {
        friend struct SQLiteStmt;
    private:
        SQLiteStmt & stmt;
        unsigned int curArg = 1;
        Use(SQLiteStmt & stmt);

    public:

        ~Use();

        /* Bind the next parameter. */
        Use & operator () (const std::string & value, bool notNull = true);
        Use & operator () (int64_t value, bool notNull = true);
        Use & bind(); // null

        int step();

        /* Execute a statement that does not return rows. */
        void exec();

        /* For statements that return 0 or more rows. Returns true iff
           a row is available. */
        bool next();

        std::string getStr(int col);
        int64_t getInt(int col);
    };

    Use use()
    {
        return Use(*this);
    }
};

/* RAII helper that ensures transactions are aborted unless explicitly
   committed. */
struct SQLiteTxn
{
    bool active = false;
    sqlite3 * db;

    SQLiteTxn(sqlite3 * db);

    void commit();

    ~SQLiteTxn();
};


MakeError(SQLiteError, Error);
MakeError(SQLiteBusy, SQLiteError);

[[noreturn]] void throwSQLiteError(sqlite3 * db, const format & f);

/* Convenience function for retrying a SQLite transaction when the
   database is busy. */
template<typename T>
T retrySQLite(std::function<T()> fun)
{
    while (true) {
        try {
            return fun();
        } catch (SQLiteBusy & e) {
        }
    }
}

}
.scm?id=ac70fc6aa304e5cfa881578951f02359024c3a87'>news: Add entry for "guix pull" ssh authenticated repositories support....Mathieu Othacehe 2020-01-24news: Add ‘nl’ translation....Tobias Geerinckx-Rice 2020-01-24news: Add 'de' translation....Florian Pelz 2020-01-23news: Add entry for Guile 3.0....Ludovic Courtès 2019-12-12news: Add 'de' translation....Florian Pelz 2019-12-12news: Add entry for "guix challenge --diff"....Ludovic Courtès 2019-11-16news: Fix another 'de' translation typo....Florian Pelz 2019-11-16news: Fix 'de' translation typo....Florian Pelz 2019-11-15news: Add entry for "guix time-machine"....Konrad Hinsen 2019-11-09news: Add Spanish translation....Miguel Ángel Arruga Vivas 2019-11-08news: Add 'de' translation....Florian Pelz 2019-11-07news: Add entry for package transformation options in "guix graph"....Ludovic Courtès 2019-11-02news: Add 'de' translation....Florian Pelz 2019-10-28news: Fix typo....Tobias Geerinckx-Rice 2019-10-27news: Add entry for /etc/guix/channels.scm....Ludovic Courtès 2019-10-18news: Add CVE ID....Ludovic Courtès 2019-10-17news: Fix 'de' translation....Florian Pelz 2019-10-16news: Fix ‘nl’ translation typo....Tobias Geerinckx-Rice 2019-10-16news: Add 'de' translation....Florian Pelz 2019-10-16news: Add 'fr' translation....Julien Lepiller 2019-10-16news: Add 'nl' translation....Tobias Geerinckx-Rice 2019-10-16news: Add entry for security issue with /var/guix/profiles/per-user....Ludovic Courtès 2019-09-28nls: Add ‘nl’ translation of news entries....Tobias Geerinckx-Rice 2019-09-27nls: Update 'de' translation of news entries....Florian Pelz 2019-09-27nls: Update 'de' translation of news entries....Florian Pelz 2019-09-26nls: Update 'fr' translation of news entries....Julien Lepiller 2019-09-24nls: Update 'de' translation of news entries....Florian Pelz 2019-09-24news: Add entry for the glibc upgrade....Ludovic Courtès 2019-09-24news: Add entry for the reduced binary seed bootstrap....Ludovic Courtès 2019-09-23etc: Add channel news file....Ludovic Courtès