
#include <Wt/Dbo/Dbo>
#include <Wt/Dbo/backend/Sqlite3>
#include <Wt/Dbo/backend/Postgres>
#include <string>

namespace dbo = Wt::Dbo;

class Post;
class User;

class Post {
public:
  std::string name;

  template<class Action>
  void persist(Action& a)
  {
dbo::field(a, name,     "name");
  }
};

class User {
public:
  std::string name;
  std::string password;

  dbo::ptr<Post> post;

  template<class Action>
  void persist(Action& a)
  {
    dbo::field(a, name,     "name");
    dbo::field(a, password, "password");

    dbo::belongsTo(a, post, "post");
  }
};

void run()
{
 dbo::backend::Sqlite3 sqlite3(":memory:");
  sqlite3.setProperty("show-queries", "true");
  dbo::Session session;
  session.setConnection(sqlite3);

  session.mapClass<User>("user");
  session.mapClass<Post>("post");

  session.createTables();

 {
    dbo::Transaction transaction(session);



    dbo::ptr<User> u = session.add(new User);
    u.modify()->name = "Joe";
    u.modify()->password = "Secret";

     dbo::ptr<Post> p = session.add(new Post);
	p.modify()->name = "lala";
 
 	u.modify()->post = p;
  }

  {
    dbo::Transaction transaction(session);

    dbo::ptr<User> user = session.find<User>().where("name = ?").bind("Joe");

    // the bug:
    dbo::ptr<Post> postP = user->post;
    user.modify()->post.reset();
    //session.flush();  !!! 
    postP.remove();
    user.remove();
 
  }
}

int main(int argc, char **argv)
{
  run();
}
