#include <Wt/Dbo/Session>
#include <Wt/Dbo/backend/Postgres>
#include <Wt/Dbo/Types>
#include <Wt/Dbo/WtSqlTraits>
#include <Wt/Dbo/Impl>

namespace dbo = Wt::Dbo;

class Test : public dbo::Dbo<Test> {
  public:
    int value;
    template<class Action>
    void persist(Action& a) {
        dbo::field(a, value, "value");
    }
};
DBO_INSTANTIATE_TEMPLATES(Test);

int main()
{
    dbo::backend::Postgres  postgresConnection("host=127.0.0.1 dbname=testdb user=testuser password=testpw");
    dbo::Session            session;

    session.mapClass<Test>("test");
    session.setConnection(postgresConnection);

    // this does not work to create the unique index, so, the db was created external
    //session.createTables();
    //dbo::Transaction transaction(session);
    //session.execute("create unique index value_key on test (value)");
    //transaction.commit();

    {
        dbo::Transaction transaction(session);
        try {
            dbo::ptr<Test> test = session.add(new Test);
            test.modify()->value = 10;
            transaction.commit();
        }
        catch (std::exception& e) {
            printf("%i %s\n", __LINE__, e.what());
        }
    }
    
    {
        dbo::Transaction transaction(session);
        try {
            dbo::ptr<Test> test = session.add(new Test);
            test.modify()->value = 10;
            transaction.commit();       // this throws duplicate key error
        }
        catch (std::exception& e) {
            printf("%i %s\n", __LINE__, e.what());
        }
    }

    {
        dbo::Transaction transaction(session);
        try {
            dbo::ptr<Test> test = session.add(new Test);
            test.modify()->value = 11;
            transaction.commit();   // this causes problem
        }
        catch (std::exception& e) {
            printf("%i %s\n", __LINE__, e.what());
        }
    }

    return 0;
}

