connection-factory.hxx   connection-factory.hxx 
skipping to change at line 31 skipping to change at line 31
#include <odb/pgsql/details/export.hxx> #include <odb/pgsql/details/export.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
class LIBODB_PGSQL_EXPORT connection_factory class LIBODB_PGSQL_EXPORT connection_factory
{ {
public: public:
virtual details::shared_ptr<connection> virtual connection_ptr
connect () = 0; connect () = 0;
public: public:
typedef pgsql::database database_type; typedef pgsql::database database_type;
virtual void virtual void
database (database_type&) = 0; database (database_type&) = 0;
virtual virtual
~connection_factory (); ~connection_factory ();
}; };
class LIBODB_PGSQL_EXPORT new_connection_factory: public connection_fac tory class LIBODB_PGSQL_EXPORT new_connection_factory: public connection_fac tory
{ {
public: public:
new_connection_factory () new_connection_factory ()
: db_ (0) : db_ (0)
{ {
} }
virtual details::shared_ptr<connection> virtual connection_ptr
connect (); connect ();
virtual void virtual void
database (database_type&); database (database_type&);
private: private:
new_connection_factory (const new_connection_factory&); new_connection_factory (const new_connection_factory&);
new_connection_factory& operator= (const new_connection_factory&); new_connection_factory& operator= (const new_connection_factory&);
private: private:
skipping to change at line 95 skipping to change at line 95
: max_ (max_connections), : max_ (max_connections),
min_ (min_connections), min_ (min_connections),
in_use_ (0), in_use_ (0),
waiters_ (0), waiters_ (0),
db_ (0), db_ (0),
cond_ (mutex_) cond_ (mutex_)
{ {
// @@ check min_ <= max_ // @@ check min_ <= max_
} }
virtual details::shared_ptr<connection> virtual connection_ptr
connect (); connect ();
virtual void virtual void
database (database_type&); database (database_type&);
virtual virtual
~connection_pool_factory (); ~connection_pool_factory ();
private: private:
connection_pool_factory (const connection_pool_factory&); connection_pool_factory (const connection_pool_factory&);
connection_pool_factory& operator= (const connection_pool_factory&); connection_pool_factory& operator= (const connection_pool_factory&);
private: protected:
class pooled_connection: public connection class pooled_connection: public connection
{ {
public: public:
// NULL pool value indicates that the connection is not in use. pooled_connection (database_type&);
// pooled_connection (database_type&, PGconn*);
pooled_connection (database_type&, connection_pool_factory*);
private: private:
static bool static bool
zero_counter (void*); zero_counter (void*);
private: private:
friend class connection_pool_factory; friend class connection_pool_factory;
shared_base::refcount_callback callback_; shared_base::refcount_callback callback_;
// NULL pool value indicates that the connection is not in use.
//
connection_pool_factory* pool_; connection_pool_factory* pool_;
}; };
friend class pooled_connection; friend class pooled_connection;
typedef std::vector<details::shared_ptr<pooled_connection> > connecti ons;
private: typedef details::shared_ptr<pooled_connection> pooled_connection_ptr;
typedef std::vector<pooled_connection_ptr> connections;
// This function is called whenever the pool needs to create a new
// connection.
//
virtual pooled_connection_ptr
create ();
protected:
// Return true if the connection should be deleted, false otherwise. // Return true if the connection should be deleted, false otherwise.
// //
bool bool
release (pooled_connection*); release (pooled_connection*);
private: protected:
const std::size_t max_; const std::size_t max_;
const std::size_t min_; const std::size_t min_;
std::size_t in_use_; // Number of connections currently in use. std::size_t in_use_; // Number of connections currently in use.
std::size_t waiters_; // Number of threads waiting for a connection. std::size_t waiters_; // Number of threads waiting for a connection.
database_type* db_; database_type* db_;
connections connections_; connections connections_;
details::mutex mutex_; details::mutex mutex_;
 End of changes. 9 change blocks. 
10 lines changed or deleted 20 lines changed or added


 connection.hxx   connection.hxx 
skipping to change at line 15 skipping to change at line 15
#ifndef ODB_PGSQL_CONNECTION_HXX #ifndef ODB_PGSQL_CONNECTION_HXX
#define ODB_PGSQL_CONNECTION_HXX #define ODB_PGSQL_CONNECTION_HXX
#include <odb/pre.hxx> #include <odb/pre.hxx>
#include <vector> #include <vector>
#include <memory> // std::auto_ptr #include <memory> // std::auto_ptr
#include <odb/forward.hxx> #include <odb/forward.hxx>
#include <odb/connection.hxx>
#include <odb/details/shared-ptr.hxx> #include <odb/details/shared-ptr.hxx>
#include <odb/pgsql/version.hxx> #include <odb/pgsql/version.hxx>
#include <odb/pgsql/forward.hxx> #include <odb/pgsql/forward.hxx>
#include <odb/pgsql/transaction-impl.hxx>
#include <odb/pgsql/auto-handle.hxx>
#include <odb/pgsql/pgsql-fwd.hxx> // PGconn #include <odb/pgsql/pgsql-fwd.hxx> // PGconn
#include <odb/pgsql/details/export.hxx> #include <odb/pgsql/details/export.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
class statement; class statement;
class statement_cache; class statement_cache;
class LIBODB_PGSQL_EXPORT connection: public details::shared_base class connection;
typedef details::shared_ptr<connection> connection_ptr;
class LIBODB_PGSQL_EXPORT connection: public odb::connection
{ {
public: public:
typedef pgsql::statement_cache statement_cache_type; typedef pgsql::statement_cache statement_cache_type;
typedef pgsql::database database_type; typedef pgsql::database database_type;
virtual virtual
~connection (); ~connection ();
connection (database_type&); connection (database_type&);
connection (database_type&, PGconn* handle);
database_type& database_type&
database () database ()
{ {
return db_; return db_;
} }
public: public:
virtual transaction_impl*
begin ();
public:
using odb::connection::execute;
virtual unsigned long long
execute (const char* statement, std::size_t length);
public:
PGconn* PGconn*
handle () handle ()
{ {
return handle_; return handle_;
} }
statement_cache_type& statement_cache_type&
statement_cache () statement_cache ()
{ {
return *statement_cache_; return *statement_cache_;
} }
private: private:
connection (const connection&); connection (const connection&);
connection& operator= (const connection&); connection& operator= (const connection&);
private: private:
void
init ();
private:
// Needed to break the circular connection-database dependency
// (odb::connection has the odb::database member).
//
database_type& db_; database_type& db_;
PGconn* handle_;
auto_handle<PGconn> handle_;
// Keep statement_cache_ after handle_ so that it is destroyed before
// the connection is closed.
//
std::auto_ptr<statement_cache_type> statement_cache_; std::auto_ptr<statement_cache_type> statement_cache_;
}; };
} }
} }
#include <odb/post.hxx> #include <odb/post.hxx>
#endif // ODB_PGSQL_CONNECTION_HXX #endif // ODB_PGSQL_CONNECTION_HXX
 End of changes. 8 change blocks. 
2 lines changed or deleted 30 lines changed or added


 database.hxx   database.hxx 
skipping to change at line 23 skipping to change at line 23
#include <iosfwd> // std::ostream #include <iosfwd> // std::ostream
#include <odb/database.hxx> #include <odb/database.hxx>
#include <odb/details/shared-ptr.hxx> #include <odb/details/shared-ptr.hxx>
#include <odb/pgsql/version.hxx> #include <odb/pgsql/version.hxx>
#include <odb/pgsql/forward.hxx> #include <odb/pgsql/forward.hxx>
#include <odb/pgsql/connection.hxx> #include <odb/pgsql/connection.hxx>
#include <odb/pgsql/connection-factory.hxx> #include <odb/pgsql/connection-factory.hxx>
#include <odb/pgsql/transaction-impl.hxx>
#include <odb/pgsql/details/export.hxx> #include <odb/pgsql/details/export.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
class transaction_impl;
class LIBODB_PGSQL_EXPORT database: public odb::database class LIBODB_PGSQL_EXPORT database: public odb::database
{ {
public: public:
typedef pgsql::connection connection_type;
public:
database (const std::string& user, database (const std::string& user,
const std::string& password, const std::string& password,
const std::string& db, const std::string& db,
const std::string& host = "", const std::string& host = "",
unsigned int port = 0, unsigned int port = 0,
const std::string& extra_conninfo = "", const std::string& extra_conninfo = "",
std::auto_ptr<connection_factory> factory = std::auto_ptr<connection_factory> factory =
std::auto_ptr<connection_factory> (0)); std::auto_ptr<connection_factory> (0));
database (const std::string& user, database (const std::string& user,
skipping to change at line 85 skipping to change at line 83
database (int& argc, database (int& argc,
char* argv[], char* argv[],
bool erase = false, bool erase = false,
const std::string& extra_conninfo = "", const std::string& extra_conninfo = "",
std::auto_ptr<connection_factory> = std::auto_ptr<connection_factory> =
std::auto_ptr<connection_factory> (0)); std::auto_ptr<connection_factory> (0));
static void static void
print_usage (std::ostream&); print_usage (std::ostream&);
public: // Transactions.
using odb::database::execute; //
virtual unsigned long long
execute (const char* statement, std::size_t length);
public: public:
virtual transaction_impl* virtual transaction_impl*
begin (); begin ();
public: public:
details::shared_ptr<connection_type> connection_ptr
connection (); connection ();
public: public:
virtual virtual
~database (); ~database ();
protected:
virtual odb::connection*
connection_ ();
public: public:
const std::string& const std::string&
user () const user () const
{ {
return user_; return user_;
} }
const std::string& const std::string&
password () const password () const
{ {
 End of changes. 6 change blocks. 
10 lines changed or deleted 9 lines changed or added


 database.ixx   database.ixx 
// file : odb/pgsql/database.ixx // file : odb/pgsql/database.ixx
// author : Constantin Michael <constantin@codesynthesis.com> // author : Constantin Michael <constantin@codesynthesis.com>
// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
// license : GNU GPL v2; see accompanying LICENSE file // license : GNU GPL v2; see accompanying LICENSE file
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
inline details::shared_ptr<database::connection_type> database:: inline connection_ptr database::
connection () connection ()
{ {
return factory_->connect (); // Go through the virtual connection_() function instead of
// directly to allow overriding.
//
return connection_ptr (
static_cast<pgsql::connection*> (connection_ ()));
} }
} }
} }
 End of changes. 2 change blocks. 
2 lines changed or deleted 6 lines changed or added


 forward.hxx   forward.hxx 
// file : odb/pgsql/forward.hxx // file : odb/pgsql/forward.hxx
// author : Constantin Michael <constantin@codesynthesis.com> // author : Constantin Michael <constantin@codesynthesis.com>
// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
// license : GNU GPL v2; see accompanying LICENSE file // license : GNU GPL v2; see accompanying LICENSE file
#ifndef ODB_PGSQL_FORWARD_HXX #ifndef ODB_PGSQL_FORWARD_HXX
#define ODB_PGSQL_FORWARD_HXX #define ODB_PGSQL_FORWARD_HXX
#include <odb/pre.hxx> #include <odb/pre.hxx>
#include <odb/forward.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
class database; class database;
class connection; class connection;
typedef details::shared_ptr<connection> connection_ptr;
class connection_factory; class connection_factory;
class transaction; class transaction;
class query; class query;
// Implementation details. // Implementation details.
// //
class binding; class binding;
class select_statement; class select_statement;
template <typename T> template <typename T>
class object_statements; class object_statements;
template <typename T> template <typename T>
class view_statements;
template <typename T>
class container_statements; class container_statements;
} }
namespace details
{
template <>
struct counter_type<pgsql::connection>
{
typedef shared_base counter;
};
}
} }
#include <odb/post.hxx> #include <odb/post.hxx>
#endif // ODB_PGSQL_FORWARD_HXX #endif // ODB_PGSQL_FORWARD_HXX
 End of changes. 4 change blocks. 
0 lines changed or deleted 15 lines changed or added


 object-statements.hxx   object-statements.hxx 
skipping to change at line 24 skipping to change at line 24
#include <odb/forward.hxx> #include <odb/forward.hxx>
#include <odb/traits.hxx> #include <odb/traits.hxx>
#include <odb/cache-traits.hxx> #include <odb/cache-traits.hxx>
#include <odb/details/shared-ptr.hxx> #include <odb/details/shared-ptr.hxx>
#include <odb/pgsql/version.hxx> #include <odb/pgsql/version.hxx>
#include <odb/pgsql/binding.hxx> #include <odb/pgsql/binding.hxx>
#include <odb/pgsql/statement.hxx> #include <odb/pgsql/statement.hxx>
#include <odb/pgsql/statements-base.hxx>
#include <odb/pgsql/details/export.hxx> #include <odb/pgsql/details/export.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
class connection; class LIBODB_PGSQL_EXPORT object_statements_base: public statements_bas
e
class LIBODB_PGSQL_EXPORT object_statements_base:
public details::shared_base
{ {
public: public:
typedef pgsql::connection connection_type;
connection_type&
connection ()
{
return conn_;
}
// Locking. // Locking.
// //
void void
lock () lock ()
{ {
assert (!locked_); assert (!locked_);
locked_ = true; locked_ = true;
} }
void void
skipping to change at line 73 skipping to change at line 63
{ {
return locked_; return locked_;
} }
public: public:
virtual virtual
~object_statements_base (); ~object_statements_base ();
protected: protected:
object_statements_base (connection_type& conn) object_statements_base (connection_type& conn)
: conn_ (conn), locked_ (false) : statements_base (conn), locked_ (false)
{ {
} }
struct auto_unlock
{
// Unlocks the statement on construction and re-locks it on
// destruction.
//
auto_unlock (object_statements_base&);
~auto_unlock ();
private:
auto_unlock (const auto_unlock&);
auto_unlock& operator= (const auto_unlock&);
private:
object_statements_base& s_;
};
protected: protected:
connection_type& conn_;
bool locked_; bool locked_;
}; };
template <typename T> template <typename T>
class object_statements: public object_statements_base class object_statements: public object_statements_base
{ {
public: public:
typedef T object_type; typedef T object_type;
typedef odb::object_traits<object_type> object_traits; typedef odb::object_traits<object_type> object_traits;
typedef typename object_traits::id_type id_type; typedef typename object_traits::id_type id_type;
skipping to change at line 139 skipping to change at line 144
private: private:
auto_lock (const auto_lock&); auto_lock (const auto_lock&);
auto_lock& operator= (const auto_lock&); auto_lock& operator= (const auto_lock&);
private: private:
object_statements& s_; object_statements& s_;
bool locked_; bool locked_;
}; };
// public:
//
object_statements (connection_type&); object_statements (connection_type&);
virtual
~object_statements ();
// Delayed loading. // Delayed loading.
// //
void void
delay_load (const id_type& id, delay_load (const id_type& id,
object_type& obj, object_type& obj,
const typename object_cache_traits::position_type& p) const typename object_cache_traits::position_type& p)
{ {
delayed_.push_back (delayed_load (id, obj, p)); delayed_.push_back (delayed_load (id, obj, p));
} }
 End of changes. 8 change blocks. 
16 lines changed or deleted 24 lines changed or added


 object-statements.ixx   object-statements.ixx 
// file : odb/pgsql/object-statements.ixx // file : odb/pgsql/object-statements.ixx
// author : Constantin Michael <constantin@codesynthesis.com> // author : Constantin Michael <constantin@codesynthesis.com>
// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC // copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC
// license : GNU GPL v2; see accompanying LICENSE file // license : GNU GPL v2; see accompanying LICENSE file
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
// //
// auto_unlock
//
inline object_statements_base::auto_unlock::
auto_unlock (object_statements_base& s)
: s_ (s)
{
s_.unlock ();
}
inline object_statements_base::auto_unlock::
~auto_unlock ()
{
s_.lock ();
}
//
// auto_lock // auto_lock
// //
template <typename T> template <typename T>
inline object_statements<T>::auto_lock:: inline object_statements<T>::auto_lock::
auto_lock (object_statements& s) auto_lock (object_statements& s)
: s_ (s) : s_ (s)
{ {
if (!s_.locked ()) if (!s_.locked ())
{ {
s_.lock (); s_.lock ();
 End of changes. 1 change blocks. 
0 lines changed or deleted 16 lines changed or added


 object-statements.txx   object-statements.txx 
skipping to change at line 21 skipping to change at line 21
#include <odb/exceptions.hxx> #include <odb/exceptions.hxx>
#include <odb/pgsql/connection.hxx> #include <odb/pgsql/connection.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
template <typename T> template <typename T>
object_statements<T>:: object_statements<T>::
~object_statements ()
{
}
template <typename T>
object_statements<T>::
object_statements (connection_type& conn) object_statements (connection_type& conn)
: object_statements_base (conn), : object_statements_base (conn),
container_statement_cache_ (conn), container_statement_cache_ (conn),
in_image_binding_ (in_image_bind_, object_traits::in_column_count ), in_image_binding_ (in_image_bind_, object_traits::in_column_count ),
in_image_native_binding_ (in_image_values_, in_image_native_binding_ (in_image_values_,
in_image_lengths_, in_image_lengths_,
in_image_formats_, in_image_formats_,
object_traits::in_column_count), object_traits::in_column_count),
out_image_binding_ (out_image_bind_, out_image_binding_ (out_image_bind_,
object_traits::out_column_count), object_traits::out_column_count),
skipping to change at line 83 skipping to change at line 89
// Our calls to init/load below can result in additional delayed // Our calls to init/load below can result in additional delayed
// loads being added to the delayed_ vector. We need to process // loads being added to the delayed_ vector. We need to process
// those before we call the post callback. // those before we call the post callback.
// //
object_traits::init (*l.obj, image (), db); object_traits::init (*l.obj, image (), db);
object_traits::load_ (*this, *l.obj); // Load containers, etc. object_traits::load_ (*this, *l.obj); // Load containers, etc.
if (!delayed_.empty ()) if (!delayed_.empty ())
load_delayed_ (); load_delayed_ ();
object_traits::callback (db, *l.obj, callback_event::post_load); // Temporarily unlock the statement for the post_load call so that
// it can load objects of this type recursively. This is safe to do
// because we have completely loaded the current object. Also the
// delayed_ list is clear before the unlock and should be clear on
// re-lock (since a callback can only call public API functions
// which will make sure all the delayed loads are processed before
// returning).
//
{
auto_unlock u (*this);
object_traits::callback (db, *l.obj, callback_event::post_load);
}
g.release (); g.release ();
} }
} }
template <typename T> template <typename T>
void object_statements<T>:: void object_statements<T>::
clear_delayed_ () clear_delayed_ ()
{ {
// Remove the objects from the session cache. // Remove the objects from the session cache.
 End of changes. 2 change blocks. 
1 lines changed or deleted 18 lines changed or added


 query.hxx   query.hxx 
skipping to change at line 92 skipping to change at line 92
}; };
// //
// //
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
struct query_column; struct query_column;
class LIBODB_PGSQL_EXPORT query class LIBODB_PGSQL_EXPORT query
{ {
public: public:
struct clause_part
{
enum kind_type
{
column,
param,
native,
boolean
};
clause_part (kind_type k): kind (k) {}
clause_part (kind_type k, const std::string& p): kind (k), part (p)
{}
clause_part (bool p): kind (boolean), bool_part (p) {}
kind_type kind;
std::string part;
bool bool_part;
};
query () query ()
: binding_ (0, 0), native_binding_ (0, 0, 0, 0) : binding_ (0, 0), native_binding_ (0, 0, 0, 0)
{ {
} }
// True or false literal.
//
explicit
query (bool v)
: binding_ (0, 0), native_binding_ (0, 0, 0, 0)
{
clause_.push_back (clause_part (v));
}
explicit explicit
query (const std::string& q) query (const char* native)
: clause_ (q), binding_ (0, 0), native_binding_ (0, 0, 0, 0) : binding_ (0, 0), native_binding_ (0, 0, 0, 0)
{ {
clause_.push_back (clause_part (clause_part::native, native));
}
explicit
query (const std::string& native)
: binding_ (0, 0), native_binding_ (0, 0, 0, 0)
{
clause_.push_back (clause_part (clause_part::native, native));
}
query (const char* table, const char* column)
: binding_ (0, 0), native_binding_ (0, 0, 0, 0)
{
append (table, column);
} }
template <typename T> template <typename T>
explicit explicit
query (val_bind<T> v) query (val_bind<T> v)
: binding_ (0, 0), native_binding_ (0, 0, 0, 0) : binding_ (0, 0), native_binding_ (0, 0, 0, 0)
{ {
append<T, type_traits<T>::db_type_id> (v); append<T, type_traits<T>::db_type_id> (v);
} }
skipping to change at line 131 skipping to change at line 173
query (const query&); query (const query&);
query& query&
operator= (const query&); operator= (const query&);
public: public:
std::string std::string
clause () const; clause () const;
const char*
clause_prefix () const;
native_binding& native_binding&
parameters_binding () const; parameters_binding () const;
const unsigned int* const unsigned int*
parameter_types () const parameter_types () const
{ {
return types_.empty () ? 0 : &types_[0]; return types_.empty () ? 0 : &types_[0];
} }
std::size_t std::size_t
parameter_count () const parameter_count () const
{ {
return parameters_.size (); return parameters_.size ();
} }
public: public:
bool
empty () const
{
return clause_.empty ();
}
static const query true_expr;
bool
const_true () const
{
return clause_.size () == 1 &&
clause_.front ().kind == clause_part::boolean &&
clause_.front ().bool_part;
}
void
optimize ();
public:
template <typename T> template <typename T>
static val_bind<T> static val_bind<T>
_val (const T& x) _val (const T& x)
{ {
return val_bind<T> (x); return val_bind<T> (x);
} }
template <typename T> template <typename T>
static ref_bind<T> static ref_bind<T>
_ref (const T& x) _ref (const T& x)
skipping to change at line 168 skipping to change at line 233
return ref_bind<T> (x); return ref_bind<T> (x);
} }
public: public:
query& query&
operator+= (const query&); operator+= (const query&);
query& query&
operator+= (const std::string& q) operator+= (const std::string& q)
{ {
size_t n (clause_.size ()); append (q);
if (n != 0 && clause_[n - 1] != ' ' && !q.empty () && q[0] != ' ')
clause_ += ' ';
clause_ += q;
return *this; return *this;
} }
template <typename T> template <typename T>
query& query&
operator+= (val_bind<T> v) operator+= (val_bind<T> v)
{ {
append<T, type_traits<T>::db_type_id> (v); append<T, type_traits<T>::db_type_id> (v);
return *this; return *this;
} }
skipping to change at line 202 skipping to change at line 262
public: public:
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
void void
append (val_bind<T>); append (val_bind<T>);
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
void void
append (ref_bind<T>); append (ref_bind<T>);
void
append (const std::string& native);
void
append (const char* table, const char* column);
private: private:
void void
add (details::shared_ptr<query_param>); add (details::shared_ptr<query_param>);
private: private:
typedef std::vector<clause_part> clause_type;
typedef std::vector<details::shared_ptr<query_param> > parameters_typ e; typedef std::vector<details::shared_ptr<query_param> > parameters_typ e;
std::string clause_; clause_type clause_;
parameters_type parameters_; parameters_type parameters_;
typedef std::pair<std::size_t, std::size_t> parameter_offset;
std::vector<parameter_offset> parameter_offsets_;
mutable std::vector<bind> bind_; mutable std::vector<bind> bind_;
mutable binding binding_; mutable binding binding_;
std::vector<char*> values_; std::vector<char*> values_;
std::vector<int> lengths_; std::vector<int> lengths_;
std::vector<int> formats_; std::vector<int> formats_;
std::vector<unsigned int> types_; std::vector<unsigned int> types_;
mutable native_binding native_binding_; mutable native_binding native_binding_;
}; };
skipping to change at line 325 skipping to change at line 389
template <typename T> template <typename T>
inline query inline query
operator+ (ref_bind<T> b, const std::string& s) operator+ (ref_bind<T> b, const std::string& s)
{ {
query r; query r;
r += b; r += b;
r += s; r += s;
return r; return r;
} }
inline query LIBODB_PGSQL_EXPORT query
operator&& (const query& x, const query& y) operator&& (const query&, const query&);
{
query r ("(");
r += x;
r += ") AND (";
r += y;
r += ")";
return r;
}
inline query LIBODB_PGSQL_EXPORT query
operator|| (const query& x, const query& y) operator|| (const query&, const query&);
{
query r ("(");
r += x;
r += ") OR (";
r += y;
r += ")";
return r;
}
inline query LIBODB_PGSQL_EXPORT query
operator! (const query& x) operator! (const query&);
{
query r ("NOT (");
r += x;
r += ")";
return r;
}
// query_column // query_column
// //
template <typename T, typename T2> template <typename T, typename T2>
class copy_bind: public val_bind<T> class copy_bind: public val_bind<T>
{ {
public: public:
explicit explicit
copy_bind (const T2& v): val_bind<T> (val), val (v) {} copy_bind (const T2& v): val_bind<T> (val), val (v) {}
skipping to change at line 376 skipping to change at line 418
const T val; const T val;
}; };
template <typename T> template <typename T>
const T& const T&
type_instance (); type_instance ();
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
struct query_column struct query_column
{ {
explicit // Note that we keep shalow copies of the table and column names.
query_column (const char* name) //
: name_ (name) query_column (const char* table, const char* column)
: table_ (table), column_ (column)
{ {
} }
const char* const char*
name () const table () const
{ {
return name_; return table_;
}
const char*
column () const
{
return column_;
} }
// is_null, is_not_null // is_null, is_not_null
// //
public: public:
query query
is_null () const is_null () const
{ {
query q (name_); query q (table_, column_);
q += "IS NULL"; q += "IS NULL";
return q; return q;
} }
query query
is_not_null () const is_not_null () const
{ {
query q (name_); query q (table_, column_);
q += "IS NOT NULL"; q += "IS NOT NULL";
return q; return q;
} }
// in // in
// //
public: public:
query query
in (const T&, const T&) const; in (const T&, const T&) const;
skipping to change at line 438 skipping to change at line 487
public: public:
query query
equal (const T& v) const equal (const T& v) const
{ {
return equal (val_bind<T> (v)); return equal (val_bind<T> (v));
} }
query query
equal (val_bind<T> v) const equal (val_bind<T> v) const
{ {
query q (name_); query q (table_, column_);
q += "="; q += "=";
q.append<T, ID> (v); q.append<T, ID> (v);
return q; return q;
} }
template <typename T2> template <typename T2>
query query
equal (val_bind<T2> v) const equal (val_bind<T2> v) const
{ {
copy_bind<T, T2> c (v.val); copy_bind<T, T2> c (v.val);
return equal (c); return equal (c);
} }
query query
equal (ref_bind<T> r) const equal (ref_bind<T> r) const
{ {
query q (name_); query q (table_, column_);
q += "="; q += "=";
q.append<T, ID> (r); q.append<T, ID> (r);
return q; return q;
} }
friend query friend query
operator== (const query_column& c, const T& v) operator== (const query_column& c, const T& v)
{ {
return c.equal (v); return c.equal (v);
} }
skipping to change at line 523 skipping to change at line 572
public: public:
query query
unequal (const T& v) const unequal (const T& v) const
{ {
return unequal (val_bind<T> (v)); return unequal (val_bind<T> (v));
} }
query query
unequal (val_bind<T> v) const unequal (val_bind<T> v) const
{ {
query q (name_); query q (table_, column_);
q += "!="; q += "!=";
q.append<T, ID> (v); q.append<T, ID> (v);
return q; return q;
} }
template <typename T2> template <typename T2>
query query
unequal (val_bind<T2> v) const unequal (val_bind<T2> v) const
{ {
copy_bind<T, T2> c (v.val); copy_bind<T, T2> c (v.val);
return unequal (c); return unequal (c);
} }
query query
unequal (ref_bind<T> r) const unequal (ref_bind<T> r) const
{ {
query q (name_); query q (table_, column_);
q += "!="; q += "!=";
q.append<T, ID> (r); q.append<T, ID> (r);
return q; return q;
} }
friend query friend query
operator!= (const query_column& c, const T& v) operator!= (const query_column& c, const T& v)
{ {
return c.unequal (v); return c.unequal (v);
} }
skipping to change at line 608 skipping to change at line 657
public: public:
query query
less (const T& v) const less (const T& v) const
{ {
return less (val_bind<T> (v)); return less (val_bind<T> (v));
} }
query query
less (val_bind<T> v) const less (val_bind<T> v) const
{ {
query q (name_); query q (table_, column_);
q += "<"; q += "<";
q.append<T, ID> (v); q.append<T, ID> (v);
return q; return q;
} }
template <typename T2> template <typename T2>
query query
less (val_bind<T2> v) const less (val_bind<T2> v) const
{ {
copy_bind<T, T2> c (v.val); copy_bind<T, T2> c (v.val);
return less (c); return less (c);
} }
query query
less (ref_bind<T> r) const less (ref_bind<T> r) const
{ {
query q (name_); query q (table_, column_);
q += "<"; q += "<";
q.append<T, ID> (r); q.append<T, ID> (r);
return q; return q;
} }
friend query friend query
operator< (const query_column& c, const T& v) operator< (const query_column& c, const T& v)
{ {
return c.less (v); return c.less (v);
} }
skipping to change at line 693 skipping to change at line 742
public: public:
query query
greater (const T& v) const greater (const T& v) const
{ {
return greater (val_bind<T> (v)); return greater (val_bind<T> (v));
} }
query query
greater (val_bind<T> v) const greater (val_bind<T> v) const
{ {
query q (name_); query q (table_, column_);
q += ">"; q += ">";
q.append<T, ID> (v); q.append<T, ID> (v);
return q; return q;
} }
template <typename T2> template <typename T2>
query query
greater (val_bind<T2> v) const greater (val_bind<T2> v) const
{ {
copy_bind<T, T2> c (v.val); copy_bind<T, T2> c (v.val);
return greater (c); return greater (c);
} }
query query
greater (ref_bind<T> r) const greater (ref_bind<T> r) const
{ {
query q (name_); query q (table_, column_);
q += ">"; q += ">";
q.append<T, ID> (r); q.append<T, ID> (r);
return q; return q;
} }
friend query friend query
operator> (const query_column& c, const T& v) operator> (const query_column& c, const T& v)
{ {
return c.greater (v); return c.greater (v);
} }
skipping to change at line 778 skipping to change at line 827
public: public:
query query
less_equal (const T& v) const less_equal (const T& v) const
{ {
return less_equal (val_bind<T> (v)); return less_equal (val_bind<T> (v));
} }
query query
less_equal (val_bind<T> v) const less_equal (val_bind<T> v) const
{ {
query q (name_); query q (table_, column_);
q += "<="; q += "<=";
q.append<T, ID> (v); q.append<T, ID> (v);
return q; return q;
} }
template <typename T2> template <typename T2>
query query
less_equal (val_bind<T2> v) const less_equal (val_bind<T2> v) const
{ {
copy_bind<T, T2> c (v.val); copy_bind<T, T2> c (v.val);
return less_equal (c); return less_equal (c);
} }
query query
less_equal (ref_bind<T> r) const less_equal (ref_bind<T> r) const
{ {
query q (name_); query q (table_, column_);
q += "<="; q += "<=";
q.append<T, ID> (r); q.append<T, ID> (r);
return q; return q;
} }
friend query friend query
operator<= (const query_column& c, const T& v) operator<= (const query_column& c, const T& v)
{ {
return c.less_equal (v); return c.less_equal (v);
} }
skipping to change at line 863 skipping to change at line 912
public: public:
query query
greater_equal (const T& v) const greater_equal (const T& v) const
{ {
return greater_equal (val_bind<T> (v)); return greater_equal (val_bind<T> (v));
} }
query query
greater_equal (val_bind<T> v) const greater_equal (val_bind<T> v) const
{ {
query q (name_); query q (table_, column_);
q += ">="; q += ">=";
q.append<T, ID> (v); q.append<T, ID> (v);
return q; return q;
} }
template <typename T2> template <typename T2>
query query
greater_equal (val_bind<T2> v) const greater_equal (val_bind<T2> v) const
{ {
copy_bind<T, T2> c (v.val); copy_bind<T, T2> c (v.val);
return greater_equal (c); return greater_equal (c);
} }
query query
greater_equal (ref_bind<T> r) const greater_equal (ref_bind<T> r) const
{ {
query q (name_); query q (table_, column_);
q += ">="; q += ">=";
q.append<T, ID> (r); q.append<T, ID> (r);
return q; return q;
} }
friend query friend query
operator>= (const query_column& c, const T& v) operator>= (const query_column& c, const T& v)
{ {
return c.greater_equal (v); return c.greater_equal (v);
} }
skipping to change at line 947 skipping to change at line 996
// //
public: public:
template <typename T2, database_type_id ID2> template <typename T2, database_type_id ID2>
query query
operator== (const query_column<T2, ID2>& c) const operator== (const query_column<T2, ID2>& c) const
{ {
// We can compare columns only if we can compare their C++ types. // We can compare columns only if we can compare their C++ types.
// //
(void) (sizeof (type_instance<T> () == type_instance<T2> ())); (void) (sizeof (type_instance<T> () == type_instance<T2> ()));
query q (name_); query q (table_, column_);
q += "="; q += "=";
q += c.name (); q.append (c.table (), c.column ());
return q; return q;
} }
template <typename T2, database_type_id ID2> template <typename T2, database_type_id ID2>
query query
operator!= (const query_column<T2, ID2>& c) const operator!= (const query_column<T2, ID2>& c) const
{ {
// We can compare columns only if we can compare their C++ types. // We can compare columns only if we can compare their C++ types.
// //
(void) (sizeof (type_instance<T> () != type_instance<T2> ())); (void) (sizeof (type_instance<T> () != type_instance<T2> ()));
query q (name_); query q (table_, column_);
q += "!="; q += "!=";
q += c.name (); q.append (c.table (), c.column ());
return q; return q;
} }
template <typename T2, database_type_id ID2> template <typename T2, database_type_id ID2>
query query
operator< (const query_column<T2, ID2>& c) const operator< (const query_column<T2, ID2>& c) const
{ {
// We can compare columns only if we can compare their C++ types. // We can compare columns only if we can compare their C++ types.
// //
(void) (sizeof (type_instance<T> () < type_instance<T2> ())); (void) (sizeof (type_instance<T> () < type_instance<T2> ()));
query q (name_); query q (table_, column_);
q += "<"; q += "<";
q += c.name (); q.append (c.table (), c.column ());
return q; return q;
} }
template <typename T2, database_type_id ID2> template <typename T2, database_type_id ID2>
query query
operator> (const query_column<T2, ID2>& c) const operator> (const query_column<T2, ID2>& c) const
{ {
// We can compare columns only if we can compare their C++ types. // We can compare columns only if we can compare their C++ types.
// //
(void) (sizeof (type_instance<T> () > type_instance<T2> ())); (void) (sizeof (type_instance<T> () > type_instance<T2> ()));
query q (name_); query q (table_, column_);
q += ">"; q += ">";
q += c.name (); q.append (c.table (), c.column ());
return q; return q;
} }
template <typename T2, database_type_id ID2> template <typename T2, database_type_id ID2>
query query
operator<= (const query_column<T2, ID2>& c) const operator<= (const query_column<T2, ID2>& c) const
{ {
// We can compare columns only if we can compare their C++ types. // We can compare columns only if we can compare their C++ types.
// //
(void) (sizeof (type_instance<T> () <= type_instance<T2> ())); (void) (sizeof (type_instance<T> () <= type_instance<T2> ()));
query q (name_); query q (table_, column_);
q += "<="; q += "<=";
q += c.name (); q.append (c.table (), c.column ());
return q; return q;
} }
template <typename T2, database_type_id ID2> template <typename T2, database_type_id ID2>
query query
operator>= (const query_column<T2, ID2>& c) const operator>= (const query_column<T2, ID2>& c) const
{ {
// We can compare columns only if we can compare their C++ types. // We can compare columns only if we can compare their C++ types.
// //
(void) (sizeof (type_instance<T> () >= type_instance<T2> ())); (void) (sizeof (type_instance<T> () >= type_instance<T2> ()));
query q (name_); query q (table_, column_);
q += ">="; q += ">=";
q += c.name (); q.append (c.table (), c.column ());
return q; return q;
} }
private: private:
const char* name_; const char* table_;
const char* column_;
}; };
// Provide operator+() for using columns to construct native
// query fragments (e.g., ORDER BY).
//
template <typename T, database_type_id ID>
inline query
operator+ (const query_column<T, ID>& c, const std::string& s)
{
query q (c.table (), c.column ());
q += s;
return q;
}
template <typename T, database_type_id ID>
inline query
operator+ (const std::string& s, const query_column<T, ID>& c)
{
query q (s);
q.append (c.table (), c.column ());
return q;
}
template <typename T, database_type_id ID>
inline query
operator+ (const query_column<T, ID>& c, const query& q)
{
query r (c.table (), c.column ());
r += q;
return r;
}
template <typename T, database_type_id ID>
inline query
operator+ (const query& q, const query_column<T, ID>& c)
{
query r (q);
r.append (c.table (), c.column ());
return r;
}
// //
// //
template <typename T, database_type_id> template <typename T, database_type_id>
struct query_param_impl; struct query_param_impl;
// BOOLEAN // BOOLEAN
// //
template <typename T> template <typename T>
struct query_param_impl<T, id_boolean>: query_param struct query_param_impl<T, id_boolean>: query_param
{ {
skipping to change at line 1663 skipping to change at line 1752
unsigned char buffer_[16]; unsigned char buffer_[16];
}; };
} }
} }
// odb::query specialization for PostgreSQL. // odb::query specialization for PostgreSQL.
// //
namespace odb namespace odb
{ {
template <typename T> template <typename T>
class query<T, pgsql::query>: public object_traits<T>::query_type class query<T, pgsql::query>: public query_selector<T>::type
{ {
public: public:
// We don't define any typedefs here since they may clash with // We don't define any typedefs here since they may clash with
// column names defined by our base type. // column names defined by our base type.
// //
query () query ()
{ {
} }
explicit explicit
query (bool v)
: query_selector<T>::type (v)
{
}
explicit
query (const char* q)
: query_selector<T>::type (q)
{
}
explicit
query (const std::string& q) query (const std::string& q)
: object_traits<T>::query_type (q) : query_selector<T>::type (q)
{ {
} }
template <typename T2> template <typename T2>
explicit explicit
query (pgsql::val_bind<T2> v) query (pgsql::val_bind<T2> v)
: object_traits<T>::query_type (pgsql::query (v)) : query_selector<T>::type (pgsql::query (v))
{ {
} }
template <typename T2> template <typename T2>
explicit explicit
query (pgsql::ref_bind<T2> r) query (pgsql::ref_bind<T2> r)
: object_traits<T>::query_type (pgsql::query (r)) : query_selector<T>::type (pgsql::query (r))
{ {
} }
query (const pgsql::query& q) query (const pgsql::query& q)
: object_traits<T>::query_type (q) : query_selector<T>::type (q)
{ {
} }
template <pgsql::database_type_id ID> template <pgsql::database_type_id ID>
query (const pgsql::query_column<bool, ID>& qc) query (const pgsql::query_column<bool, ID>& qc)
: object_traits<T>::query_type (qc) : query_selector<T>::type (qc)
{ {
} }
}; };
} }
#include <odb/pgsql/query.ixx> #include <odb/pgsql/query.ixx>
#include <odb/pgsql/query.txx> #include <odb/pgsql/query.txx>
#include <odb/post.hxx> #include <odb/post.hxx>
 End of changes. 52 change blocks. 
78 lines changed or deleted 180 lines changed or added


 query.txx   query.txx 
skipping to change at line 16 skipping to change at line 16
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
// query // query
// //
template <database_type_id ID> template <database_type_id ID>
query:: query::
query (const query_column<bool, ID>& c) query (const query_column<bool, ID>& c)
: clause_ (c.name ()), binding_ (0, 0), native_binding_ (0, 0, 0, 0 ) : binding_ (0, 0), native_binding_ (0, 0, 0, 0)
{ {
// Cannot use IS TRUE here since database type can be a non- // Cannot use IS TRUE here since database type can be a non-
// integral type. // integral type.
// //
clause_ += " = "; append (c.table (), c.column ());
append ("=");
append<bool, ID> (val_bind<bool> (true)); append<bool, ID> (val_bind<bool> (true));
} }
// query_column // query_column
// //
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
query query_column<T, ID>:: query query_column<T, ID>::
in (const T& v1, const T& v2) const in (const T& v1, const T& v2) const
{ {
query q (name_); query q (table_, column_);
q += "IN ("; q += "IN (";
q.append<T, ID> (val_bind<T> (v1)); q.append<T, ID> (val_bind<T> (v1));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v2)); q.append<T, ID> (val_bind<T> (v2));
q += ")"; q += ")";
return q; return q;
} }
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
query query_column<T, ID>:: query query_column<T, ID>::
in (const T& v1, const T& v2, const T& v3) const in (const T& v1, const T& v2, const T& v3) const
{ {
query q (name_); query q (table_, column_);
q += "IN ("; q += "IN (";
q.append<T, ID> (val_bind<T> (v1)); q.append<T, ID> (val_bind<T> (v1));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v2)); q.append<T, ID> (val_bind<T> (v2));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v3)); q.append<T, ID> (val_bind<T> (v3));
q += ")"; q += ")";
return q; return q;
} }
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
query query_column<T, ID>:: query query_column<T, ID>::
in (const T& v1, const T& v2, const T& v3, const T& v4) const in (const T& v1, const T& v2, const T& v3, const T& v4) const
{ {
query q (name_); query q (table_, column_);
q += "IN ("; q += "IN (";
q.append<T, ID> (val_bind<T> (v1)); q.append<T, ID> (val_bind<T> (v1));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v2)); q.append<T, ID> (val_bind<T> (v2));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v3)); q.append<T, ID> (val_bind<T> (v3));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v4)); q.append<T, ID> (val_bind<T> (v4));
q += ")"; q += ")";
return q; return q;
} }
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
query query_column<T, ID>:: query query_column<T, ID>::
in (const T& v1, const T& v2, const T& v3, const T& v4, const T& v5) co nst in (const T& v1, const T& v2, const T& v3, const T& v4, const T& v5) co nst
{ {
query q (name_); query q (table_, column_);
q += "IN ("; q += "IN (";
q.append<T, ID> (val_bind<T> (v1)); q.append<T, ID> (val_bind<T> (v1));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v2)); q.append<T, ID> (val_bind<T> (v2));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v3)); q.append<T, ID> (val_bind<T> (v3));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v4)); q.append<T, ID> (val_bind<T> (v4));
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (v5)); q.append<T, ID> (val_bind<T> (v5));
q += ")"; q += ")";
return q; return q;
} }
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
template <typename I> template <typename I>
query query_column<T, ID>:: query query_column<T, ID>::
in_range (I begin, I end) const in_range (I begin, I end) const
{ {
query q (name_); query q (table_, column_);
q += "IN ("; q += "IN (";
for (I i (begin); i != end; ++i) for (I i (begin); i != end; ++i)
{ {
if (i != begin) if (i != begin)
q += ","; q += ",";
q.append<T, ID> (val_bind<T> (*i)); q.append<T, ID> (val_bind<T> (*i));
} }
q += ")"; q += ")";
 End of changes. 7 change blocks. 
7 lines changed or deleted 8 lines changed or added


 result.hxx   result.hxx 
// file : odb/pgsql/result.hxx // file : odb/pgsql/result.hxx
// author : Constantin Michael <constantin@codesynthesis.com> // author : Constantin Michael <constantin@codesynthesis.com>
// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
// license : GNU GPL v2; see accompanying LICENSE file // license : GNU GPL v2; see accompanying LICENSE file
#ifndef ODB_PGSQL_RESULT_HXX #ifndef ODB_PGSQL_RESULT_HXX
#define ODB_PGSQL_RESULT_HXX #define ODB_PGSQL_RESULT_HXX
#include <odb/pre.hxx> #include <odb/pre.hxx>
#include <cstddef> // std::size_t #include <odb/traits.hxx>
#include <odb/result.hxx> #include <odb/result.hxx>
#include <odb/details/shared-ptr.hxx>
#include <odb/pgsql/version.hxx> #include <odb/pgsql/version.hxx>
#include <odb/pgsql/forward.hxx> // query, query_params #include <odb/pgsql/forward.hxx>
#include <odb/pgsql/statement.hxx>
#include <odb/pgsql/details/export.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
template <typename T> template <typename T, class_kind kind>
class result_impl: public odb::result_impl<T> class result_impl;
{
public:
typedef typename odb::result_impl<T>::pointer_type pointer_type;
typedef typename odb::result_impl<T>::pointer_traits pointer_traits;
typedef typename odb::result_impl<T>::object_type object_type;
typedef typename odb::result_impl<T>::id_type id_type;
typedef typename odb::result_impl<T>::object_traits object_traits;
virtual
~result_impl ();
result_impl (const query&,
details::shared_ptr<select_statement>,
object_statements<object_type>&);
virtual void
load (object_type&);
virtual id_type
load_id ();
virtual void
next ();
virtual void
cache ();
virtual std::size_t
size ();
using odb::result_impl<T>::current;
private:
void
load_image ();
private:
details::shared_ptr<select_statement> statement_;
object_statements<object_type>& statements_;
};
} }
} }
#include <odb/pgsql/result.txx>
#include <odb/post.hxx> #include <odb/post.hxx>
#endif // ODB_PGSQL_RESULT_HXX #endif // ODB_PGSQL_RESULT_HXX
// Include result specializations so that the user code only needs
// to include this header.
//
#include <odb/pgsql/object-result.hxx>
#include <odb/pgsql/view-result.hxx>
 End of changes. 6 change blocks. 
52 lines changed or deleted 4 lines changed or added


 statement-cache.hxx   statement-cache.hxx 
skipping to change at line 16 skipping to change at line 16
#ifndef ODB_PGSQL_STATEMENT_CACHE_HXX #ifndef ODB_PGSQL_STATEMENT_CACHE_HXX
#define ODB_PGSQL_STATEMENT_CACHE_HXX #define ODB_PGSQL_STATEMENT_CACHE_HXX
#include <odb/pre.hxx> #include <odb/pre.hxx>
#include <map> #include <map>
#include <typeinfo> #include <typeinfo>
#include <odb/forward.hxx> #include <odb/forward.hxx>
#include <odb/pgsql/version.hxx>
#include <odb/pgsql/object-statements.hxx>
#include <odb/details/shared-ptr.hxx> #include <odb/details/shared-ptr.hxx>
#include <odb/details/type-info.hxx> #include <odb/details/type-info.hxx>
#include <odb/pgsql/version.hxx>
#include <odb/pgsql/statements-base.hxx>
#include <odb/pgsql/object-statements.hxx>
#include <odb/pgsql/view-statements.hxx>
#include <odb/pgsql/details/export.hxx> #include <odb/pgsql/details/export.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
class connection; class connection;
class LIBODB_PGSQL_EXPORT statement_cache class LIBODB_PGSQL_EXPORT statement_cache
{ {
public: public:
statement_cache (connection& conn) statement_cache (connection& conn)
: conn_ (conn) : conn_ (conn)
{ {
} }
template <typename T> template <typename T>
object_statements<T>& object_statements<T>&
find () find_object ()
{ {
map::iterator i (map_.find (&typeid (T))); map::iterator i (map_.find (&typeid (T)));
if (i != map_.end ()) if (i != map_.end ())
return static_cast<object_statements<T>&> (*i->second); return static_cast<object_statements<T>&> (*i->second);
details::shared_ptr<object_statements<T> > p ( details::shared_ptr<object_statements<T> > p (
new (details::shared) object_statements<T> (conn_)); new (details::shared) object_statements<T> (conn_));
map_.insert (map::value_type (&typeid (T), p)); map_.insert (map::value_type (&typeid (T), p));
return *p; return *p;
} }
template <typename T>
view_statements<T>&
find_view ()
{
map::iterator i (map_.find (&typeid (T)));
if (i != map_.end ())
return static_cast<view_statements<T>&> (*i->second);
details::shared_ptr<view_statements<T> > p (
new (details::shared) view_statements<T> (conn_));
map_.insert (map::value_type (&typeid (T), p));
return *p;
}
private: private:
typedef std::map<const std::type_info*, typedef std::map<const std::type_info*,
details::shared_ptr<object_statements_base>, details::shared_ptr<statements_base>,
details::type_info_comparator> map; details::type_info_comparator> map;
connection& conn_; connection& conn_;
map map_; map map_;
}; };
} }
} }
#include <odb/post.hxx> #include <odb/post.hxx>
 End of changes. 5 change blocks. 
5 lines changed or deleted 23 lines changed or added


 statement.hxx   statement.hxx 
skipping to change at line 18 skipping to change at line 18
#include <odb/pre.hxx> #include <odb/pre.hxx>
#include <string> #include <string>
#include <cstddef> // std::size_t #include <cstddef> // std::size_t
#include <odb/details/shared-ptr.hxx> #include <odb/details/shared-ptr.hxx>
#include <odb/pgsql/version.hxx> #include <odb/pgsql/version.hxx>
#include <odb/pgsql/binding.hxx> #include <odb/pgsql/binding.hxx>
#include <odb/pgsql/pgsql-fwd.hxx> #include <odb/pgsql/pgsql-fwd.hxx> // PGresult
#include <odb/pgsql/auto-handle.hxx>
#include <odb/pgsql/details/export.hxx> #include <odb/pgsql/details/export.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
class connection; class connection;
class LIBODB_PGSQL_EXPORT statement: public details::shared_base class LIBODB_PGSQL_EXPORT statement: public details::shared_base
skipping to change at line 92 skipping to change at line 93
binding& data); binding& data);
select_statement (connection& conn, select_statement (connection& conn,
const std::string& name, const std::string& name,
const std::string& stmt, const std::string& stmt,
const Oid* types, const Oid* types,
std::size_t types_count, std::size_t types_count,
native_binding& native_cond, native_binding& native_cond,
binding& data); binding& data);
select_statement (connection& conn,
const std::string& name,
const std::string& stmt,
binding& data);
// Common select interface expected by the generated code. // Common select interface expected by the generated code.
// //
public: public:
enum result enum result
{ {
success, success,
no_data, no_data,
truncated truncated
}; };
skipping to change at line 156 skipping to change at line 162
void void
reload (); reload ();
private: private:
select_statement (const select_statement&); select_statement (const select_statement&);
select_statement& operator= (const select_statement&); select_statement& operator= (const select_statement&);
private: private:
binding* cond_; binding* cond_;
native_binding& native_cond_; native_binding* native_cond_;
binding& data_; binding& data_;
PGresult* result_; auto_handle<PGresult> result_;
std::size_t row_count_; std::size_t row_count_;
std::size_t current_row_; std::size_t current_row_;
}; };
class LIBODB_PGSQL_EXPORT insert_statement: public statement class LIBODB_PGSQL_EXPORT insert_statement: public statement
{ {
public: public:
virtual virtual
~insert_statement (); ~insert_statement ();
skipping to change at line 249 skipping to change at line 255
~delete_statement (); ~delete_statement ();
delete_statement (connection& conn, delete_statement (connection& conn,
const std::string& name, const std::string& name,
const std::string& stmt, const std::string& stmt,
const Oid* types, const Oid* types,
std::size_t types_count, std::size_t types_count,
binding& cond, binding& cond,
native_binding& native_cond); native_binding& native_cond);
delete_statement (connection& conn,
const std::string& name,
const std::string& stmt,
const Oid* types,
std::size_t types_count,
native_binding& native_cond);
unsigned long long unsigned long long
execute (); execute ();
private: private:
delete_statement (const delete_statement&); delete_statement (const delete_statement&);
delete_statement& operator= (const delete_statement&); delete_statement& operator= (const delete_statement&);
private: private:
binding& cond_; binding* cond_;
native_binding& native_cond_; native_binding& native_cond_;
}; };
} }
} }
#include <odb/post.hxx> #include <odb/post.hxx>
#endif // ODB_PGSQL_STATEMENT_HXX #endif // ODB_PGSQL_STATEMENT_HXX
 End of changes. 6 change blocks. 
4 lines changed or deleted 17 lines changed or added


 traits.hxx   traits.hxx 
skipping to change at line 12 skipping to change at line 12
// author : Constantin Michael <constantin@codesynthesis.com> // author : Constantin Michael <constantin@codesynthesis.com>
// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC // copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC
// license : GNU GPL v2; see accompanying LICENSE file // license : GNU GPL v2; see accompanying LICENSE file
#ifndef ODB_PGSQL_TRAITS_HXX #ifndef ODB_PGSQL_TRAITS_HXX
#define ODB_PGSQL_TRAITS_HXX #define ODB_PGSQL_TRAITS_HXX
#include <odb/pre.hxx> #include <odb/pre.hxx>
#include <string> #include <string>
#include <vector>
#include <cstddef> // std::size_t #include <cstddef> // std::size_t
#include <odb/traits.hxx> #include <odb/traits.hxx>
#include <odb/wrapper-traits.hxx>
#include <odb/details/buffer.hxx> #include <odb/details/buffer.hxx>
#include <odb/details/wrapper-p.hxx>
#include <odb/pgsql/version.hxx> #include <odb/pgsql/version.hxx>
#include <odb/pgsql/pgsql-types.hxx> #include <odb/pgsql/pgsql-types.hxx>
#include <odb/pgsql/details/export.hxx> #include <odb/pgsql/details/export.hxx>
#include <odb/pgsql/details/endian-traits.hxx> #include <odb/pgsql/details/endian-traits.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
skipping to change at line 110 skipping to change at line 113
// UUID image is a 16-byte sequence. // UUID image is a 16-byte sequence.
// //
template <> template <>
struct image_traits<id_uuid> {typedef unsigned char* image_type;}; struct image_traits<id_uuid> {typedef unsigned char* image_type;};
// //
// value_traits // value_traits
// //
template <typename W, database_type_id, bool null_handler>
struct wrapped_value_traits;
template <typename T, database_type_id> template <typename T, database_type_id>
struct default_value_traits; struct default_value_traits;
template <typename T, database_type_id, bool w = details::wrapper_p<T>:
:r>
struct select_traits;
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
class value_traits: public default_value_traits<T, ID> struct select_traits<T, ID, false>
{
typedef default_value_traits<T, ID> type;
};
template <typename W, database_type_id ID>
struct select_traits<W, ID, true>
{
typedef
wrapped_value_traits<W, ID, wrapper_traits<W>::null_handler>
type;
};
template <typename T, database_type_id ID>
class value_traits: public select_traits<T, ID>::type
{
};
// The wrapped_value_traits specializations should be able to handle
// any value type which means we have to have every possible signature
// of the set_value() and set_image() functions.
//
template <typename W, database_type_id ID>
struct wrapped_value_traits<W, ID, false>
{
typedef wrapper_traits<W> wtraits;
typedef typename wtraits::wrapped_type wrapped_type;
typedef W value_type;
typedef wrapped_type query_type;
typedef typename image_traits<ID>::image_type image_type;
typedef value_traits<wrapped_type, ID> vtraits;
static void
set_value (W& v, const image_type& i, bool is_null)
{
vtraits::set_value (wtraits::set_ref (v), i, is_null);
}
static void
set_image (image_type& i, bool& is_null, const W& v)
{
vtraits::set_image (i, is_null, wtraits::get_ref (v));
}
// String, BYTEA, and NUMERIC.
//
static void
set_value (W& v, const details::buffer& b, std::size_t n, bool is_nul
l)
{
vtraits::set_value (wtraits::set_ref (v), b, n, is_null);
}
static void
set_image (details::buffer& b, std::size_t& n, bool& is_null, const W
& v)
{
vtraits::set_image (b, n, is_null, wtraits::get_ref (v));
}
// BIT.
//
static void
set_value (W& v, const unsigned char* i, std::size_t n, bool is_null)
{
vtraits::set_value (wtraits::set_ref (v), i, n, is_null);
}
static void
set_image (unsigned char* i,
std::size_t c,
std::size_t& n,
bool& is_null,
const W& v)
{
vtraits::set_image (i, c, n, is_null, wtraits::get_ref (v));
}
// VARBIT.
//
static void
set_value (W& v, const details::ubuffer& b, std::size_t n, bool is_nu
ll)
{
vtraits::set_value (wtraits::set_ref (v), b, n, is_null);
}
static void
set_image (details::ubuffer& b, std::size_t& n, bool& is_null, const
W& v)
{
vtraits::set_image (b, n, is_null, wtraits::get_ref (v));
}
// UUID.
//
static void
set_value (W& v, const unsigned char* i, bool is_null)
{
vtraits::set_value (wtraits::set_ref (v), i, is_null);
}
static void
set_image (unsigned char* i, bool& is_null, const W& v)
{
vtraits::set_image (i, is_null, wtraits::get_ref (v));
}
};
template <typename W, database_type_id ID>
struct wrapped_value_traits<W, ID, true>
{ {
typedef wrapper_traits<W> wtraits;
typedef typename wtraits::wrapped_type wrapped_type;
typedef W value_type;
typedef wrapped_type query_type;
typedef typename image_traits<ID>::image_type image_type;
typedef value_traits<wrapped_type, ID> vtraits;
static void
set_value (W& v, const image_type& i, bool is_null)
{
if (is_null)
wtraits::set_null (v);
else
vtraits::set_value (wtraits::set_ref (v), i, is_null);
}
static void
set_image (image_type& i, bool& is_null, const W& v)
{
is_null = wtraits::get_null (v);
if (!is_null)
vtraits::set_image (i, is_null, wtraits::get_ref (v));
}
// String, BYTEA, and NUMERIC.
//
static void
set_value (W& v, const details::buffer& b, std::size_t n, bool is_nul
l)
{
if (is_null)
wtraits::set_null (v);
else
vtraits::set_value (wtraits::set_ref (v), b, n, is_null);
}
static void
set_image (details::buffer& b, std::size_t& n, bool& is_null, const W
& v)
{
is_null = wtraits::get_null (v);
if (!is_null)
vtraits::set_image (b, n, is_null, wtraits::get_ref (v));
}
// BIT.
//
static void
set_value (W& v, const unsigned char* i, std::size_t n, bool is_null)
{
if (is_null)
wtraits::set_null (v);
else
vtraits::set_value (wtraits::set_ref (v), i, n, is_null);
}
static void
set_image (unsigned char* i,
std::size_t c,
std::size_t& n,
bool& is_null,
const W& v)
{
is_null = wtraits::get_null (v);
if (!is_null)
vtraits::set_image (i, c, n, is_null, wtraits::get_ref (v));
}
// VARBIT.
//
static void
set_value (W& v, const details::ubuffer& b, std::size_t n, bool is_nu
ll)
{
if (is_null)
wtraits::set_null (v);
else
vtraits::set_value (wtraits::set_ref (v), b, n, is_null);
}
static void
set_image (details::ubuffer& b, std::size_t& n, bool& is_null, const
W& v)
{
is_null = wtraits::get_null (v);
if (!is_null)
vtraits::set_image (b, n, is_null, wtraits::get_ref (v));
}
// UUID.
//
static void
set_value (W& v, const unsigned char* i, bool is_null)
{
if (is_null)
wtraits::set_null (v);
else
vtraits::set_value (wtraits::set_ref (v), i, is_null);
}
static void
set_image (unsigned char* i, bool& is_null, const W& v)
{
is_null = wtraits::get_null (v);
if (!is_null)
vtraits::set_image (i, is_null, wtraits::get_ref (v));
}
}; };
template <typename T, database_type_id ID> template <typename T, database_type_id ID>
struct default_value_traits struct default_value_traits
{ {
typedef T value_type; typedef T value_type;
typedef T query_type; typedef T query_type;
typedef typename image_traits<ID>::image_type image_type; typedef typename image_traits<ID>::image_type image_type;
static void static void
skipping to change at line 214 skipping to change at line 441
c_string_value_traits c_string_value_traits
{ {
}; };
template <> template <>
struct LIBODB_PGSQL_EXPORT default_value_traits<const char*, id_string> : struct LIBODB_PGSQL_EXPORT default_value_traits<const char*, id_string> :
c_string_value_traits c_string_value_traits
{ {
}; };
template <std::size_t n>
struct default_value_traits<char[n], id_numeric>: c_string_value_traits
{
};
template <std::size_t n>
struct default_value_traits<const char[n], id_numeric>:
c_string_value_traits
{
};
template <std::size_t n>
struct default_value_traits<char[n], id_string>: c_string_value_traits
{
};
template <std::size_t n>
struct default_value_traits<const char[n], id_string>:
c_string_value_traits
{
};
// std::vector<char> (buffer) specialization.
//
template <>
struct LIBODB_PGSQL_EXPORT default_value_traits<std::vector<char>, id_b
ytea>
{
public:
typedef std::vector<char> value_type;
typedef std::vector<char> query_type;
typedef details::buffer image_type;
static void
set_value (value_type& v,
const details::buffer& b,
std::size_t n,
bool is_null)
{
if (!is_null)
v.assign (b.data (), b.data () + n);
else
v.clear ();
}
static void
set_image (details::buffer&,
std::size_t& n,
bool& is_null,
const value_type&);
};
// //
// type_traits // type_traits
// //
template <typename T> template <typename T>
struct default_type_traits; struct default_type_traits;
template <typename T> template <typename T>
class type_traits: public default_type_traits<T> class type_traits: public default_type_traits<T>
{ {
skipping to change at line 321 skipping to change at line 599
struct default_type_traits<std::string> struct default_type_traits<std::string>
{ {
static const database_type_id db_type_id = id_string; static const database_type_id db_type_id = id_string;
}; };
template <> template <>
struct default_type_traits<const char*> struct default_type_traits<const char*>
{ {
static const database_type_id db_type_id = id_string; static const database_type_id db_type_id = id_string;
}; };
template <std::size_t n>
struct default_type_traits<char[n]>
{
static const database_type_id db_type_id = id_string;
};
template <std::size_t n>
struct default_type_traits<const char[n]>
{
static const database_type_id db_type_id = id_string;
};
} }
} }
#include <odb/post.hxx> #include <odb/post.hxx>
#endif // ODB_PGSQL_TRAITS_HXX #endif // ODB_PGSQL_TRAITS_HXX
 End of changes. 9 change blocks. 
1 lines changed or deleted 301 lines changed or added


 transaction-impl.hxx   transaction-impl.hxx 
skipping to change at line 26 skipping to change at line 26
#include <odb/details/shared-ptr.hxx> #include <odb/details/shared-ptr.hxx>
#include <odb/pgsql/details/export.hxx> #include <odb/pgsql/details/export.hxx>
namespace odb namespace odb
{ {
namespace pgsql namespace pgsql
{ {
class LIBODB_PGSQL_EXPORT transaction_impl: public odb::transaction_imp l class LIBODB_PGSQL_EXPORT transaction_impl: public odb::transaction_imp l
{ {
protected: public:
friend class database;
friend class transaction;
typedef pgsql::database database_type; typedef pgsql::database database_type;
typedef pgsql::connection connection_type; typedef pgsql::connection connection_type;
transaction_impl (database_type&); transaction_impl (database_type&);
transaction_impl (connection_ptr);
virtual virtual
~transaction_impl (); ~transaction_impl ();
virtual void virtual void
start ();
virtual void
commit (); commit ();
virtual void virtual void
rollback (); rollback ();
connection_type& connection_type&
connection (); connection ();
private: private:
details::shared_ptr<connection_type> connection_; connection_ptr connection_;
}; };
} }
} }
#include <odb/pgsql/transaction-impl.ixx> #include <odb/pgsql/transaction-impl.ixx>
#include <odb/post.hxx> #include <odb/post.hxx>
#endif // ODB_PGSQL_TRANSACTION_IMPL_HXX #endif // ODB_PGSQL_TRANSACTION_IMPL_HXX
 End of changes. 4 change blocks. 
5 lines changed or deleted 6 lines changed or added


 transaction.hxx   transaction.hxx 
skipping to change at line 49 skipping to change at line 49
// //
connection_type& connection_type&
connection (); connection ();
// Return current transaction or throw if there is no transaction // Return current transaction or throw if there is no transaction
// in effect. // in effect.
// //
static transaction& static transaction&
current (); current ();
// Set the current thread's transaction.
//
static void
current (transaction&);
public: public:
transaction_impl& transaction_impl&
implementation (); implementation ();
}; };
} }
} }
#include <odb/pgsql/transaction.ixx> #include <odb/pgsql/transaction.ixx>
#include <odb/post.hxx> #include <odb/post.hxx>
 End of changes. 1 change blocks. 
0 lines changed or deleted 5 lines changed or added


 transaction.ixx   transaction.ixx 
skipping to change at line 40 skipping to change at line 40
database () database ()
{ {
return static_cast<database_type&> (odb::transaction::database ()); return static_cast<database_type&> (odb::transaction::database ());
} }
inline transaction::connection_type& transaction:: inline transaction::connection_type& transaction::
connection () connection ()
{ {
return implementation ().connection (); return implementation ().connection ();
} }
inline void transaction::
current (transaction& t)
{
odb::transaction::current (t);
}
} }
} }
 End of changes. 1 change blocks. 
0 lines changed or deleted 6 lines changed or added


 version.hxx   version.hxx 
skipping to change at line 33 skipping to change at line 33
// Version AABBCCDD // Version AABBCCDD
// 2.0.0 02000000 // 2.0.0 02000000
// 2.1.0 02010000 // 2.1.0 02010000
// 2.1.1 02010100 // 2.1.1 02010100
// 2.2.0.a1 02019901 // 2.2.0.a1 02019901
// 3.0.0.b2 02999952 // 3.0.0.b2 02999952
// //
// Check that we have compatible ODB version. // Check that we have compatible ODB version.
// //
#if ODB_VERSION != 10500 #if ODB_VERSION != 10600
# error incompatible odb interface version detected # error incompatible odb interface version detected
#endif #endif
// libodb-pgsql version: odb interface version plus the bugfix // libodb-pgsql version: odb interface version plus the bugfix
// version. // version.
// //
#define LIBODB_PGSQL_VERSION 1050000 #define LIBODB_PGSQL_VERSION 1060000
#define LIBODB_PGSQL_VERSION_STR "1.5.0" #define LIBODB_PGSQL_VERSION_STR "1.6.0"
#include <odb/post.hxx> #include <odb/post.hxx>
#endif // ODB_PGSQL_VERSION_HXX #endif // ODB_PGSQL_VERSION_HXX
 End of changes. 2 change blocks. 
3 lines changed or deleted 3 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/