From 004062737657986294163672ae67d16348e203f6 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 14 Oct 2020 20:43:20 +0300 Subject: Make changes required for test --- libbrep/build-package-odb.cxx | 3988 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3988 insertions(+) create mode 100644 libbrep/build-package-odb.cxx (limited to 'libbrep/build-package-odb.cxx') diff --git a/libbrep/build-package-odb.cxx b/libbrep/build-package-odb.cxx new file mode 100644 index 0000000..8b6e3ca --- /dev/null +++ b/libbrep/build-package-odb.cxx @@ -0,0 +1,3988 @@ +// -*- C++ -*- +// +// This file was generated by ODB, object-relational mapping (ORM) +// compiler for C++. +// + +#include + +#include + +#include +#include // std::memcpy + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace odb +{ + // build_tenant + // + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + persist_statement_name[] = "persist_brep_build_tenant"; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + find_statement_name[] = "find_brep_build_tenant"; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + erase_statement_name[] = "erase_brep_build_tenant"; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + query_statement_name[] = "query_brep_build_tenant"; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + erase_query_statement_name[] = "erase_query_brep_build_tenant"; + + const unsigned int access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + persist_statement_types[] = + { + pgsql::text_oid, + pgsql::bool_oid + }; + + const unsigned int access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + find_statement_types[] = + { + pgsql::text_oid + }; + + struct access::object_traits_impl< ::brep::build_tenant, id_pgsql >::extra_statement_cache_type + { + extra_statement_cache_type ( + pgsql::connection&, + image_type&, + id_image_type&, + pgsql::binding&, + pgsql::binding&, + pgsql::native_binding&, + const unsigned int*) + { + } + }; + + access::object_traits_impl< ::brep::build_tenant, id_pgsql >::id_type + access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + id (const image_type& i) + { + pgsql::database* db (0); + ODB_POTENTIALLY_UNUSED (db); + + id_type id; + { + pgsql::value_traits< + ::std::string, + pgsql::id_string >::set_value ( + id, + i.id_value, + i.id_size, + i.id_null); + } + + return id; + } + + bool access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + grow (image_type& i, + bool* t) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (t); + + bool grew (false); + + // id + // + if (t[0UL]) + { + i.id_value.capacity (i.id_size); + grew = true; + } + + // archived + // + t[1UL] = 0; + + return grew; + } + + void access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + bind (pgsql::bind* b, + image_type& i, + pgsql::statement_kind sk) + { + ODB_POTENTIALLY_UNUSED (sk); + + using namespace pgsql; + + assert (sk != statement_update); + + std::size_t n (0); + + // id + // + b[n].type = pgsql::bind::text; + b[n].buffer = i.id_value.data (); + b[n].capacity = i.id_value.capacity (); + b[n].size = &i.id_size; + b[n].is_null = &i.id_null; + n++; + + // archived + // + b[n].type = pgsql::bind::boolean_; + b[n].buffer = &i.archived_value; + b[n].is_null = &i.archived_null; + n++; + } + + void access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + bind (pgsql::bind* b, id_image_type& i) + { + std::size_t n (0); + b[n].type = pgsql::bind::text; + b[n].buffer = i.id_value.data (); + b[n].capacity = i.id_value.capacity (); + b[n].size = &i.id_size; + b[n].is_null = &i.id_null; + } + + bool access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + init (image_type& i, + const object_type& o, + pgsql::statement_kind sk) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (sk); + + using namespace pgsql; + + assert (sk != statement_update); + + bool grew (false); + + // id + // + { + ::std::string const& v = + o.id; + + bool is_null (false); + std::size_t size (0); + std::size_t cap (i.id_value.capacity ()); + pgsql::value_traits< + ::std::string, + pgsql::id_string >::set_image ( + i.id_value, + size, + is_null, + v); + i.id_null = is_null; + i.id_size = size; + grew = grew || (cap != i.id_value.capacity ()); + } + + // archived + // + { + bool const& v = + o.archived; + + bool is_null (false); + pgsql::value_traits< + bool, + pgsql::id_boolean >::set_image ( + i.archived_value, is_null, v); + i.archived_null = is_null; + } + + return grew; + } + + void access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + init (object_type& o, + const image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (db); + + // id + // + { + ::std::string& v = + o.id; + + pgsql::value_traits< + ::std::string, + pgsql::id_string >::set_value ( + v, + i.id_value, + i.id_size, + i.id_null); + } + + // archived + // + { + bool& v = + o.archived; + + pgsql::value_traits< + bool, + pgsql::id_boolean >::set_value ( + v, + i.archived_value, + i.archived_null); + } + } + + void access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + init (id_image_type& i, const id_type& id) + { + bool grew (false); + { + bool is_null (false); + std::size_t size (0); + std::size_t cap (i.id_value.capacity ()); + pgsql::value_traits< + ::std::string, + pgsql::id_string >::set_image ( + i.id_value, + size, + is_null, + id); + i.id_null = is_null; + i.id_size = size; + grew = grew || (cap != i.id_value.capacity ()); + } + + if (grew) + i.version++; + } + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >::persist_statement[] = + "INSERT INTO \"build_tenant\" " + "(\"id\", " + "\"archived\") " + "VALUES " + "($1, $2)"; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >::find_statement[] = + "SELECT " + "\"build_tenant\".\"id\", " + "\"build_tenant\".\"archived\" " + "FROM \"build_tenant\" " + "WHERE \"build_tenant\".\"id\"=$1"; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >::erase_statement[] = + "DELETE FROM \"build_tenant\" " + "WHERE \"id\"=$1"; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >::query_statement[] = + "SELECT " + "\"build_tenant\".\"id\", " + "\"build_tenant\".\"archived\" " + "FROM \"build_tenant\""; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >::erase_query_statement[] = + "DELETE FROM \"build_tenant\""; + + const char access::object_traits_impl< ::brep::build_tenant, id_pgsql >::table_name[] = + "\"build_tenant\""; + + void access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + persist (database& db, const object_type& obj) + { + ODB_POTENTIALLY_UNUSED (db); + + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + callback (db, + obj, + callback_event::pre_persist); + + image_type& im (sts.image ()); + binding& imb (sts.insert_image_binding ()); + + if (init (im, obj, statement_insert)) + im.version++; + + if (im.version != sts.insert_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_insert); + sts.insert_image_version (im.version); + imb.version++; + } + + insert_statement& st (sts.persist_statement ()); + if (!st.execute ()) + throw object_already_persistent (); + + callback (db, + obj, + callback_event::post_persist); + } + + void access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + erase (database& db, const id_type& id) + { + using namespace pgsql; + + ODB_POTENTIALLY_UNUSED (db); + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + id_image_type& i (sts.id_image ()); + init (i, id); + + binding& idb (sts.id_image_binding ()); + if (i.version != sts.id_image_version () || idb.version == 0) + { + bind (idb.bind, i); + sts.id_image_version (i.version); + idb.version++; + } + + if (sts.erase_statement ().execute () != 1) + throw object_not_persistent (); + + pointer_cache_traits::erase (db, id); + } + + access::object_traits_impl< ::brep::build_tenant, id_pgsql >::pointer_type + access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + find (database& db, const id_type& id) + { + using namespace pgsql; + + { + pointer_type p (pointer_cache_traits::find (db, id)); + + if (!pointer_traits::null_ptr (p)) + return p; + } + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + + if (l.locked ()) + { + if (!find_ (sts, &id)) + return pointer_type (); + } + + pointer_type p ( + access::object_factory::create ()); + pointer_traits::guard pg (p); + + pointer_cache_traits::insert_guard ig ( + pointer_cache_traits::insert (db, id, p)); + + object_type& obj (pointer_traits::get_ref (p)); + + if (l.locked ()) + { + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, false); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + pointer_cache_traits::load (ig.position ()); + } + else + sts.delay_load (id, obj, ig.position ()); + + ig.release (); + pg.release (); + return p; + } + + bool access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + find (database& db, const id_type& id, object_type& obj) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + assert (l.locked ()) /* Must be a top-level call. */; + + if (!find_ (sts, &id)) + return false; + + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + reference_cache_traits::position_type pos ( + reference_cache_traits::insert (db, id, obj)); + reference_cache_traits::insert_guard ig (pos); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, false); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + reference_cache_traits::load (pos); + ig.release (); + return true; + } + + bool access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + reload (database& db, object_type& obj) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + assert (l.locked ()) /* Must be a top-level call. */; + + const id_type& id (object_traits_impl::id (obj)); + if (!find_ (sts, &id)) + return false; + + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, true); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + return true; + } + + bool access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + find_ (statements_type& sts, + const id_type* id) + { + using namespace pgsql; + + id_image_type& i (sts.id_image ()); + init (i, *id); + + binding& idb (sts.id_image_binding ()); + if (i.version != sts.id_image_version () || idb.version == 0) + { + bind (idb.bind, i); + sts.id_image_version (i.version); + idb.version++; + } + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + select_statement& st (sts.find_statement ()); + + st.execute (); + auto_result ar (st); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + if (grow (im, sts.select_image_truncated ())) + im.version++; + + if (im.version != sts.select_image_version ()) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + st.refetch (); + } + } + + return r != select_statement::no_data; + } + + result< access::object_traits_impl< ::brep::build_tenant, id_pgsql >::object_type > + access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + query (database&, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + std::string text (query_statement); + if (!q.empty ()) + { + text += " "; + text += q.clause (); + } + + q.init_parameters (); + shared_ptr st ( + new (shared) select_statement ( + sts.connection (), + query_statement_name, + text, + false, + true, + q.parameter_types (), + q.parameter_count (), + q.parameters_binding (), + imb)); + + st->execute (); + st->deallocate (); + + shared_ptr< odb::object_result_impl > r ( + new (shared) pgsql::object_result_impl ( + q, st, sts, 0)); + + return result (r); + } + + unsigned long long access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + erase_query (database&, const query_base_type& q) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + std::string text (erase_query_statement); + if (!q.empty ()) + { + text += ' '; + text += q.clause (); + } + + q.init_parameters (); + delete_statement st ( + conn, + erase_query_statement_name, + text, + q.parameter_types (), + q.parameter_count (), + q.parameters_binding ()); + + return st.execute (); + } + + odb::details::shared_ptr + access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + prepare_query (connection& c, const char* n, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + static_cast (c)); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + std::string text (query_statement); + if (!q.empty ()) + { + text += " "; + text += q.clause (); + } + + shared_ptr r ( + new (shared) pgsql::prepared_query_impl (conn)); + r->name = n; + r->execute = &execute_query; + r->query = q; + r->stmt.reset ( + new (shared) select_statement ( + sts.connection (), + n, + text, + false, + true, + r->query.parameter_types (), + r->query.parameter_count (), + r->query.parameters_binding (), + imb)); + + return r; + } + + odb::details::shared_ptr + access::object_traits_impl< ::brep::build_tenant, id_pgsql >:: + execute_query (prepared_query_impl& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::prepared_query_impl& pq ( + static_cast (q)); + shared_ptr st ( + odb::details::inc_ref ( + static_cast (pq.stmt.get ()))); + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + // The connection used by the current transaction and the + // one used to prepare this statement must be the same. + // + assert (&conn == &st->connection ()); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + pq.query.init_parameters (); + st->execute (); + + return shared_ptr ( + new (shared) pgsql::object_result_impl ( + pq.query, st, sts, 0)); + } + + // build_repository + // + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + persist_statement_name[] = "persist_brep_build_repository"; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + find_statement_name[] = "find_brep_build_repository"; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + erase_statement_name[] = "erase_brep_build_repository"; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + query_statement_name[] = "query_brep_build_repository"; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + erase_query_statement_name[] = "erase_query_brep_build_repository"; + + const unsigned int access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + persist_statement_types[] = + { + pgsql::text_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::text_oid + }; + + const unsigned int access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + find_statement_types[] = + { + pgsql::text_oid, + pgsql::text_oid + }; + + struct access::object_traits_impl< ::brep::build_repository, id_pgsql >::extra_statement_cache_type + { + extra_statement_cache_type ( + pgsql::connection&, + image_type&, + id_image_type&, + pgsql::binding&, + pgsql::binding&, + pgsql::native_binding&, + const unsigned int*) + { + } + }; + + access::object_traits_impl< ::brep::build_repository, id_pgsql >::id_type + access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + id (const image_type& i) + { + pgsql::database* db (0); + ODB_POTENTIALLY_UNUSED (db); + + id_type id; + { + composite_value_traits< ::brep::repository_id, id_pgsql >::init ( + id, + i.id_value, + db); + } + + return id; + } + + bool access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + grow (image_type& i, + bool* t) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (t); + + bool grew (false); + + // id + // + if (composite_value_traits< ::brep::repository_id, id_pgsql >::grow ( + i.id_value, t + 0UL)) + grew = true; + + // location + // + if (composite_value_traits< ::brep::_repository_location, id_pgsql >::grow ( + i.location_value, t + 2UL)) + grew = true; + + // certificate_fingerprint + // + if (t[4UL]) + { + i.certificate_fingerprint_value.capacity (i.certificate_fingerprint_size); + grew = true; + } + + return grew; + } + + void access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + bind (pgsql::bind* b, + image_type& i, + pgsql::statement_kind sk) + { + ODB_POTENTIALLY_UNUSED (sk); + + using namespace pgsql; + + assert (sk != statement_update); + + std::size_t n (0); + + // id + // + composite_value_traits< ::brep::repository_id, id_pgsql >::bind ( + b + n, i.id_value, sk); + n += 2UL; + + // location + // + composite_value_traits< ::brep::_repository_location, id_pgsql >::bind ( + b + n, i.location_value, sk); + n += 2UL; + + // certificate_fingerprint + // + b[n].type = pgsql::bind::text; + b[n].buffer = i.certificate_fingerprint_value.data (); + b[n].capacity = i.certificate_fingerprint_value.capacity (); + b[n].size = &i.certificate_fingerprint_size; + b[n].is_null = &i.certificate_fingerprint_null; + n++; + } + + void access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + bind (pgsql::bind* b, id_image_type& i) + { + std::size_t n (0); + pgsql::statement_kind sk (pgsql::statement_select); + composite_value_traits< ::brep::repository_id, id_pgsql >::bind ( + b + n, i.id_value, sk); + } + + bool access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + init (image_type& i, + const object_type& o, + pgsql::statement_kind sk) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (sk); + + using namespace pgsql; + + assert (sk != statement_update); + + bool grew (false); + + // id + // + { + ::brep::repository_id const& v = + o.id; + + if (composite_value_traits< ::brep::repository_id, id_pgsql >::init ( + i.id_value, + v, + sk)) + grew = true; + } + + // location + // + { + ::bpkg::repository_location const& v = + o.location; + + // From common.hxx:285:14 + ::brep::_repository_location const& vt = + brep::_repository_location + { + (v).url (), (v).empty () ? brep::repository_type::pkg : (v).type () + }; + + + if (composite_value_traits< ::brep::_repository_location, id_pgsql >::init ( + i.location_value, + vt, + sk)) + grew = true; + } + + // certificate_fingerprint + // + { + ::butl::optional< ::std::basic_string< char > > const& v = + o.certificate_fingerprint; + + bool is_null (true); + std::size_t size (0); + std::size_t cap (i.certificate_fingerprint_value.capacity ()); + pgsql::value_traits< + ::butl::optional< ::std::basic_string< char > >, + pgsql::id_string >::set_image ( + i.certificate_fingerprint_value, + size, + is_null, + v); + i.certificate_fingerprint_null = is_null; + i.certificate_fingerprint_size = size; + grew = grew || (cap != i.certificate_fingerprint_value.capacity ()); + } + + return grew; + } + + void access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + init (object_type& o, + const image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (db); + + // id + // + { + ::brep::repository_id& v = + o.id; + + composite_value_traits< ::brep::repository_id, id_pgsql >::init ( + v, + i.id_value, + db); + } + + // location + // + { + // From build-package.hxx:63:7 + ::bpkg::repository_location v; + + ::brep::_repository_location vt; + + composite_value_traits< ::brep::_repository_location, id_pgsql >::init ( + vt, + i.location_value, + db); + + // From common.hxx:285:14 + v = brep::repository_location (std::move ((vt).url), (vt).type); + // From build-package.hxx:63:7 + o.location = std::move (v); + assert (o.canonical_name == o.location.canonical_name ()); + } + + // certificate_fingerprint + // + { + ::butl::optional< ::std::basic_string< char > >& v = + o.certificate_fingerprint; + + pgsql::value_traits< + ::butl::optional< ::std::basic_string< char > >, + pgsql::id_string >::set_value ( + v, + i.certificate_fingerprint_value, + i.certificate_fingerprint_size, + i.certificate_fingerprint_null); + } + } + + void access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + init (id_image_type& i, const id_type& id) + { + bool grew (false); + pgsql::statement_kind sk (pgsql::statement_select); + { + if (composite_value_traits< ::brep::repository_id, id_pgsql >::init ( + i.id_value, + id, + sk)) + grew = true; + } + + if (grew) + i.version++; + } + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >::persist_statement[] = + "INSERT INTO \"build_repository\" " + "(\"tenant\", " + "\"canonical_name\", " + "\"location_url\", " + "\"location_type\", " + "\"certificate_fingerprint\") " + "VALUES " + "($1, $2, $3, $4, $5)"; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >::find_statement[] = + "SELECT " + "\"build_repository\".\"tenant\", " + "\"build_repository\".\"canonical_name\", " + "\"build_repository\".\"location_url\", " + "\"build_repository\".\"location_type\", " + "\"build_repository\".\"certificate_fingerprint\" " + "FROM \"build_repository\" " + "WHERE \"build_repository\".\"tenant\"=$1 AND \"build_repository\".\"canonical_name\"=$2"; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >::erase_statement[] = + "DELETE FROM \"build_repository\" " + "WHERE \"tenant\"=$1 AND \"canonical_name\"=$2"; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >::query_statement[] = + "SELECT " + "\"build_repository\".\"tenant\", " + "\"build_repository\".\"canonical_name\", " + "\"build_repository\".\"location_url\", " + "\"build_repository\".\"location_type\", " + "\"build_repository\".\"certificate_fingerprint\" " + "FROM \"build_repository\""; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >::erase_query_statement[] = + "DELETE FROM \"build_repository\""; + + const char access::object_traits_impl< ::brep::build_repository, id_pgsql >::table_name[] = + "\"build_repository\""; + + void access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + persist (database& db, const object_type& obj) + { + ODB_POTENTIALLY_UNUSED (db); + + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + callback (db, + obj, + callback_event::pre_persist); + + image_type& im (sts.image ()); + binding& imb (sts.insert_image_binding ()); + + if (init (im, obj, statement_insert)) + im.version++; + + if (im.version != sts.insert_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_insert); + sts.insert_image_version (im.version); + imb.version++; + } + + insert_statement& st (sts.persist_statement ()); + if (!st.execute ()) + throw object_already_persistent (); + + callback (db, + obj, + callback_event::post_persist); + } + + void access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + erase (database& db, const id_type& id) + { + using namespace pgsql; + + ODB_POTENTIALLY_UNUSED (db); + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + id_image_type& i (sts.id_image ()); + init (i, id); + + binding& idb (sts.id_image_binding ()); + if (i.version != sts.id_image_version () || idb.version == 0) + { + bind (idb.bind, i); + sts.id_image_version (i.version); + idb.version++; + } + + if (sts.erase_statement ().execute () != 1) + throw object_not_persistent (); + + pointer_cache_traits::erase (db, id); + } + + access::object_traits_impl< ::brep::build_repository, id_pgsql >::pointer_type + access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + find (database& db, const id_type& id) + { + using namespace pgsql; + + { + pointer_type p (pointer_cache_traits::find (db, id)); + + if (!pointer_traits::null_ptr (p)) + return p; + } + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + + if (l.locked ()) + { + if (!find_ (sts, &id)) + return pointer_type (); + } + + pointer_type p ( + access::object_factory::create ()); + pointer_traits::guard pg (p); + + pointer_cache_traits::insert_guard ig ( + pointer_cache_traits::insert (db, id, p)); + + object_type& obj (pointer_traits::get_ref (p)); + + if (l.locked ()) + { + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, false); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + pointer_cache_traits::load (ig.position ()); + } + else + sts.delay_load (id, obj, ig.position ()); + + ig.release (); + pg.release (); + return p; + } + + bool access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + find (database& db, const id_type& id, object_type& obj) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + assert (l.locked ()) /* Must be a top-level call. */; + + if (!find_ (sts, &id)) + return false; + + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + reference_cache_traits::position_type pos ( + reference_cache_traits::insert (db, id, obj)); + reference_cache_traits::insert_guard ig (pos); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, false); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + reference_cache_traits::load (pos); + ig.release (); + return true; + } + + bool access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + reload (database& db, object_type& obj) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + assert (l.locked ()) /* Must be a top-level call. */; + + const id_type& id (object_traits_impl::id (obj)); + if (!find_ (sts, &id)) + return false; + + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, true); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + return true; + } + + bool access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + find_ (statements_type& sts, + const id_type* id) + { + using namespace pgsql; + + id_image_type& i (sts.id_image ()); + init (i, *id); + + binding& idb (sts.id_image_binding ()); + if (i.version != sts.id_image_version () || idb.version == 0) + { + bind (idb.bind, i); + sts.id_image_version (i.version); + idb.version++; + } + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + select_statement& st (sts.find_statement ()); + + st.execute (); + auto_result ar (st); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + if (grow (im, sts.select_image_truncated ())) + im.version++; + + if (im.version != sts.select_image_version ()) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + st.refetch (); + } + } + + return r != select_statement::no_data; + } + + result< access::object_traits_impl< ::brep::build_repository, id_pgsql >::object_type > + access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + query (database&, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + std::string text (query_statement); + if (!q.empty ()) + { + text += " "; + text += q.clause (); + } + + q.init_parameters (); + shared_ptr st ( + new (shared) select_statement ( + sts.connection (), + query_statement_name, + text, + false, + true, + q.parameter_types (), + q.parameter_count (), + q.parameters_binding (), + imb)); + + st->execute (); + st->deallocate (); + + shared_ptr< odb::object_result_impl > r ( + new (shared) pgsql::object_result_impl ( + q, st, sts, 0)); + + return result (r); + } + + unsigned long long access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + erase_query (database&, const query_base_type& q) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + std::string text (erase_query_statement); + if (!q.empty ()) + { + text += ' '; + text += q.clause (); + } + + q.init_parameters (); + delete_statement st ( + conn, + erase_query_statement_name, + text, + q.parameter_types (), + q.parameter_count (), + q.parameters_binding ()); + + return st.execute (); + } + + odb::details::shared_ptr + access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + prepare_query (connection& c, const char* n, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + static_cast (c)); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + std::string text (query_statement); + if (!q.empty ()) + { + text += " "; + text += q.clause (); + } + + shared_ptr r ( + new (shared) pgsql::prepared_query_impl (conn)); + r->name = n; + r->execute = &execute_query; + r->query = q; + r->stmt.reset ( + new (shared) select_statement ( + sts.connection (), + n, + text, + false, + true, + r->query.parameter_types (), + r->query.parameter_count (), + r->query.parameters_binding (), + imb)); + + return r; + } + + odb::details::shared_ptr + access::object_traits_impl< ::brep::build_repository, id_pgsql >:: + execute_query (prepared_query_impl& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::prepared_query_impl& pq ( + static_cast (q)); + shared_ptr st ( + odb::details::inc_ref ( + static_cast (pq.stmt.get ()))); + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + // The connection used by the current transaction and the + // one used to prepare this statement must be the same. + // + assert (&conn == &st->connection ()); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + pq.query.init_parameters (); + st->execute (); + + return shared_ptr ( + new (shared) pgsql::object_result_impl ( + pq.query, st, sts, 0)); + } + + // build_test_dependency + // + + bool access::composite_value_traits< ::brep::build_test_dependency, id_pgsql >:: + grow (image_type& i, + bool* t) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (t); + + bool grew (false); + + // name + // + if (t[0UL]) + { + i.name_value.capacity (i.name_size); + grew = true; + } + + // package + // + if (composite_value_traits< ::brep::package_id, id_pgsql >::grow ( + i.package_value, t + 1UL)) + grew = true; + + return grew; + } + + void access::composite_value_traits< ::brep::build_test_dependency, id_pgsql >:: + bind (pgsql::bind* b, + image_type& i, + pgsql::statement_kind sk) + { + ODB_POTENTIALLY_UNUSED (b); + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (sk); + + using namespace pgsql; + + std::size_t n (0); + ODB_POTENTIALLY_UNUSED (n); + + // name + // + b[n].type = pgsql::bind::text; + b[n].buffer = i.name_value.data (); + b[n].capacity = i.name_value.capacity (); + b[n].size = &i.name_size; + b[n].is_null = &i.name_null; + n++; + + // package + // + composite_value_traits< ::brep::package_id, id_pgsql >::bind ( + b + n, i.package_value, sk); + n += 6UL; + } + + bool access::composite_value_traits< ::brep::build_test_dependency, id_pgsql >:: + init (image_type& i, + const value_type& o, + pgsql::statement_kind sk) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (sk); + + using namespace pgsql; + + bool grew (false); + + // name + // + { + ::bpkg::package_name const& v = + o.name; + + bool is_null (false); + std::size_t size (0); + std::size_t cap (i.name_value.capacity ()); + pgsql::value_traits< + ::bpkg::package_name, + pgsql::id_string >::set_image ( + i.name_value, + size, + is_null, + v); + i.name_null = is_null; + i.name_size = size; + grew = grew || (cap != i.name_value.capacity ()); + } + + // package + // + { + ::odb::lazy_shared_ptr< ::brep::build_package > const& v = + o.package; + + typedef object_traits< ::brep::build_package > obj_traits; + typedef odb::pointer_traits< ::odb::lazy_shared_ptr< ::brep::build_package > > ptr_traits; + + bool is_null (ptr_traits::null_ptr (v)); + if (!is_null) + { + const obj_traits::id_type& ptr_id ( + ptr_traits::object_id< ptr_traits::element_type > (v)); + + if (composite_value_traits< obj_traits::id_type, id_pgsql >::init ( + i.package_value, + ptr_id, + sk)) + grew = true; + } + else + composite_value_traits< obj_traits::id_type, id_pgsql >::set_null (i.package_value, sk); + } + + return grew; + } + + void access::composite_value_traits< ::brep::build_test_dependency, id_pgsql >:: + init (value_type& o, + const image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (db); + + // name + // + { + ::bpkg::package_name& v = + o.name; + + pgsql::value_traits< + ::bpkg::package_name, + pgsql::id_string >::set_value ( + v, + i.name_value, + i.name_size, + i.name_null); + } + + // package + // + { + ::odb::lazy_shared_ptr< ::brep::build_package >& v = + o.package; + + typedef object_traits< ::brep::build_package > obj_traits; + typedef odb::pointer_traits< ::odb::lazy_shared_ptr< ::brep::build_package > > ptr_traits; + + if (composite_value_traits< obj_traits::id_type, id_pgsql >::get_null ( + i.package_value)) + v = ptr_traits::pointer_type (); + else + { + obj_traits::id_type ptr_id; + composite_value_traits< obj_traits::id_type, id_pgsql >::init ( + ptr_id, + i.package_value, + db); + + v = ptr_traits::pointer_type ( + *static_cast (db), ptr_id); + } + } + } + + // build_package + // + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >:: + persist_statement_name[] = "persist_brep_build_package"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >:: + find_statement_name[] = "find_brep_build_package"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >:: + erase_statement_name[] = "erase_brep_build_package"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >:: + query_statement_name[] = "query_brep_build_package"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >:: + erase_query_statement_name[] = "erase_query_brep_build_package"; + + const unsigned int access::object_traits_impl< ::brep::build_package, id_pgsql >:: + persist_statement_types[] = + { + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::bool_oid + }; + + const unsigned int access::object_traits_impl< ::brep::build_package, id_pgsql >:: + find_statement_types[] = + { + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid + }; + + const char alias_traits< ::brep::build_repository, + id_pgsql, + access::object_traits_impl< ::brep::build_package, id_pgsql >::internal_repository_tag>:: + table_name[] = "\"internal_repository\""; + + struct access::object_traits_impl< ::brep::build_package, id_pgsql >::extra_statement_cache_type + { + pgsql::container_statements_impl< tests_traits > tests; + pgsql::container_statements_impl< builds_traits > builds; + pgsql::container_statements_impl< constraints_traits > constraints; + + extra_statement_cache_type ( + pgsql::connection& c, + image_type&, + id_image_type&, + pgsql::binding& id, + pgsql::binding&, + pgsql::native_binding& idn, + const unsigned int* idt) + : tests (c, id, idn, idt), + builds (c, id, idn, idt), + constraints (c, id, idn, idt) + { + } + }; + + // tests + // + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + select_name[] = "select_brep_build_package_tests"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + insert_name[] = "insert_brep_build_package_tests"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + delete_name[] = "delete_brep_build_package_tests"; + + const unsigned int access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + insert_types[] = + { + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::int8_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid + }; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + select_statement[] = + "SELECT " + "\"build_package_tests\".\"index\", " + "\"build_package_tests\".\"test_name\"::TEXT, " + "\"build_package_tests\".\"test_package_tenant\", " + "\"build_package_tests\".\"test_package_name\"::TEXT, " + "\"build_package_tests\".\"test_package_version_epoch\", " + "\"build_package_tests\".\"test_package_version_canonical_upstream\", " + "\"build_package_tests\".\"test_package_version_canonical_release\", " + "\"build_package_tests\".\"test_package_version_revision\" " + "FROM \"build_package_tests\" " + "WHERE \"build_package_tests\".\"tenant\"=$1 AND \"build_package_tests\".\"name\"=$2::CITEXT AND \"build_package_tests\".\"version_epoch\"=$3 AND \"build_package_tests\".\"version_canonical_upstream\"=$4 AND \"build_package_tests\".\"version_canonical_release\"=$5 AND \"build_package_tests\".\"version_revision\"=$6 ORDER BY \"build_package_tests\".\"index\""; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + insert_statement[] = + "INSERT INTO \"build_package_tests\" " + "(\"tenant\", " + "\"name\", " + "\"version_epoch\", " + "\"version_canonical_upstream\", " + "\"version_canonical_release\", " + "\"version_revision\", " + "\"index\", " + "\"test_name\", " + "\"test_package_tenant\", " + "\"test_package_name\", " + "\"test_package_version_epoch\", " + "\"test_package_version_canonical_upstream\", " + "\"test_package_version_canonical_release\", " + "\"test_package_version_revision\") " + "VALUES " + "($1, $2::CITEXT, $3, $4, $5, $6, $7, $8::CITEXT, $9, $10::CITEXT, $11, $12, $13, $14)"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + delete_statement[] = + "DELETE FROM \"build_package_tests\" " + "WHERE \"tenant\"=$1 AND \"name\"=$2::CITEXT AND \"version_epoch\"=$3 AND \"version_canonical_upstream\"=$4 AND \"version_canonical_release\"=$5 AND \"version_revision\"=$6"; + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + bind (pgsql::bind* b, + const pgsql::bind* id, + std::size_t id_size, + data_image_type& d) + { + using namespace pgsql; + + statement_kind sk (statement_select); + ODB_POTENTIALLY_UNUSED (sk); + + size_t n (0); + + // object_id + // + if (id != 0) + std::memcpy (&b[n], id, id_size * sizeof (id[0])); + n += id_size; + + // index + // + b[n].type = pgsql::bind::bigint; + b[n].buffer = &d.index_value; + b[n].is_null = &d.index_null; + n++; + + // value + // + composite_value_traits< value_type, id_pgsql >::bind ( + b + n, d.value_value, sk); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + grow (data_image_type& i, + bool* t) + { + bool grew (false); + + // index + // + t[0UL] = 0; + + // value + // + if (composite_value_traits< value_type, id_pgsql >::grow ( + i.value_value, t + 1UL)) + grew = true; + + if (grew) + i.version++; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + init (data_image_type& i, + index_type* j, + const value_type& v) + { + using namespace pgsql; + + statement_kind sk (statement_insert); + ODB_POTENTIALLY_UNUSED (sk); + + bool grew (false); + + // index + // + if (j != 0) + { + bool is_null (false); + pgsql::value_traits< + index_type, + pgsql::id_bigint >::set_image ( + i.index_value, is_null, *j); + i.index_null = is_null; + } + + // value + // + { + if (composite_value_traits< value_type, id_pgsql >::init ( + i.value_value, + v, + sk)) + grew = true; + } + + if (grew) + i.version++; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + init (index_type& j, + value_type& v, + const data_image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (db); + + // index + // + { + pgsql::value_traits< + index_type, + pgsql::id_bigint >::set_value ( + j, + i.index_value, + i.index_null); + } + + // value + // + { + composite_value_traits< value_type, id_pgsql >::init ( + v, + i.value_value, + db); + } + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + insert (index_type i, const value_type& v, void* d) + { + using namespace pgsql; + + statements_type& sts (*static_cast< statements_type* > (d)); + data_image_type& di (sts.data_image ()); + + init (di, &i, v); + + if (sts.data_binding_test_version ()) + { + const binding& id (sts.id_binding ()); + bind (sts.data_bind (), id.bind, id.count, di); + sts.data_binding_update_version (); + } + + if (!sts.insert_statement ().execute ()) + throw object_already_persistent (); + } + + bool access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + select (index_type& i, value_type& v, void* d) + { + using namespace pgsql; + using pgsql::select_statement; + + statements_type& sts (*static_cast< statements_type* > (d)); + data_image_type& di (sts.data_image ()); + + init (i, v, di, &sts.connection ().database ()); + + select_statement& st (sts.select_statement ()); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + grow (di, sts.select_image_truncated ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), 0, sts.id_binding ().count, di); + sts.data_binding_update_version (); + st.refetch (); + } + } + + return r != select_statement::no_data; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + delete_ (void* d) + { + using namespace pgsql; + + statements_type& sts (*static_cast< statements_type* > (d)); + sts.delete_statement ().execute (); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + persist (const container_type& c, + statements_type& sts) + { + using namespace pgsql; + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::persist (c, fs); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + load (container_type& c, + statements_type& sts) + { + using namespace pgsql; + using pgsql::select_statement; + + const binding& id (sts.id_binding ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), id.bind, id.count, sts.data_image ()); + sts.data_binding_update_version (); + } + + select_statement& st (sts.select_statement ()); + st.execute (); + auto_result ar (st); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + data_image_type& di (sts.data_image ()); + grow (di, sts.select_image_truncated ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), 0, id.count, di); + sts.data_binding_update_version (); + st.refetch (); + } + } + + bool more (r != select_statement::no_data); + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::load (c, more, fs); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::tests_traits:: + erase (statements_type& sts) + { + using namespace pgsql; + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::erase (fs); + } + + // builds + // + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + select_name[] = "select_brep_build_package_builds"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + insert_name[] = "insert_brep_build_package_builds"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + delete_name[] = "delete_brep_build_package_builds"; + + const unsigned int access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + insert_types[] = + { + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::int8_oid, + pgsql::text_oid, + pgsql::text_oid + }; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + select_statement[] = + "SELECT " + "\"build_package_builds\".\"index\", " + "\"build_package_builds\".\"expression\", " + "\"build_package_builds\".\"comment\" " + "FROM \"build_package_builds\" " + "WHERE \"build_package_builds\".\"tenant\"=$1 AND \"build_package_builds\".\"name\"=$2::CITEXT AND \"build_package_builds\".\"version_epoch\"=$3 AND \"build_package_builds\".\"version_canonical_upstream\"=$4 AND \"build_package_builds\".\"version_canonical_release\"=$5 AND \"build_package_builds\".\"version_revision\"=$6 ORDER BY \"build_package_builds\".\"index\""; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + insert_statement[] = + "INSERT INTO \"build_package_builds\" " + "(\"tenant\", " + "\"name\", " + "\"version_epoch\", " + "\"version_canonical_upstream\", " + "\"version_canonical_release\", " + "\"version_revision\", " + "\"index\", " + "\"expression\", " + "\"comment\") " + "VALUES " + "($1, $2::CITEXT, $3, $4, $5, $6, $7, $8, $9)"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + delete_statement[] = + "DELETE FROM \"build_package_builds\" " + "WHERE \"tenant\"=$1 AND \"name\"=$2::CITEXT AND \"version_epoch\"=$3 AND \"version_canonical_upstream\"=$4 AND \"version_canonical_release\"=$5 AND \"version_revision\"=$6"; + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + bind (pgsql::bind* b, + const pgsql::bind* id, + std::size_t id_size, + data_image_type& d) + { + using namespace pgsql; + + statement_kind sk (statement_select); + ODB_POTENTIALLY_UNUSED (sk); + + size_t n (0); + + // object_id + // + if (id != 0) + std::memcpy (&b[n], id, id_size * sizeof (id[0])); + n += id_size; + + // index + // + b[n].type = pgsql::bind::bigint; + b[n].buffer = &d.index_value; + b[n].is_null = &d.index_null; + n++; + + // value + // + composite_value_traits< value_type, id_pgsql >::bind ( + b + n, d.value_value, sk); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + grow (data_image_type& i, + bool* t) + { + bool grew (false); + + // index + // + t[0UL] = 0; + + // value + // + if (composite_value_traits< value_type, id_pgsql >::grow ( + i.value_value, t + 1UL)) + grew = true; + + if (grew) + i.version++; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + init (data_image_type& i, + index_type* j, + const value_type& v) + { + using namespace pgsql; + + statement_kind sk (statement_insert); + ODB_POTENTIALLY_UNUSED (sk); + + bool grew (false); + + // index + // + if (j != 0) + { + bool is_null (false); + pgsql::value_traits< + index_type, + pgsql::id_bigint >::set_image ( + i.index_value, is_null, *j); + i.index_null = is_null; + } + + // value + // + { + if (composite_value_traits< value_type, id_pgsql >::init ( + i.value_value, + v, + sk)) + grew = true; + } + + if (grew) + i.version++; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + init (index_type& j, + value_type& v, + const data_image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (db); + + // index + // + { + pgsql::value_traits< + index_type, + pgsql::id_bigint >::set_value ( + j, + i.index_value, + i.index_null); + } + + // value + // + { + composite_value_traits< value_type, id_pgsql >::init ( + v, + i.value_value, + db); + } + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + insert (index_type i, const value_type& v, void* d) + { + using namespace pgsql; + + statements_type& sts (*static_cast< statements_type* > (d)); + data_image_type& di (sts.data_image ()); + + init (di, &i, v); + + if (sts.data_binding_test_version ()) + { + const binding& id (sts.id_binding ()); + bind (sts.data_bind (), id.bind, id.count, di); + sts.data_binding_update_version (); + } + + if (!sts.insert_statement ().execute ()) + throw object_already_persistent (); + } + + bool access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + select (index_type& i, value_type& v, void* d) + { + using namespace pgsql; + using pgsql::select_statement; + + statements_type& sts (*static_cast< statements_type* > (d)); + data_image_type& di (sts.data_image ()); + + init (i, v, di, &sts.connection ().database ()); + + select_statement& st (sts.select_statement ()); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + grow (di, sts.select_image_truncated ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), 0, sts.id_binding ().count, di); + sts.data_binding_update_version (); + st.refetch (); + } + } + + return r != select_statement::no_data; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + delete_ (void* d) + { + using namespace pgsql; + + statements_type& sts (*static_cast< statements_type* > (d)); + sts.delete_statement ().execute (); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + persist (const container_type& c, + statements_type& sts) + { + using namespace pgsql; + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::persist (c, fs); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + load (container_type& c, + statements_type& sts) + { + using namespace pgsql; + using pgsql::select_statement; + + const binding& id (sts.id_binding ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), id.bind, id.count, sts.data_image ()); + sts.data_binding_update_version (); + } + + select_statement& st (sts.select_statement ()); + st.execute (); + auto_result ar (st); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + data_image_type& di (sts.data_image ()); + grow (di, sts.select_image_truncated ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), 0, id.count, di); + sts.data_binding_update_version (); + st.refetch (); + } + } + + bool more (r != select_statement::no_data); + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::load (c, more, fs); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::builds_traits:: + erase (statements_type& sts) + { + using namespace pgsql; + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::erase (fs); + } + + // constraints + // + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + select_name[] = "select_brep_build_package_constraints"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + insert_name[] = "insert_brep_build_package_constraints"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + delete_name[] = "delete_brep_build_package_constraints"; + + const unsigned int access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + insert_types[] = + { + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::int4_oid, + pgsql::int8_oid, + pgsql::bool_oid, + pgsql::text_oid, + pgsql::text_oid, + pgsql::text_oid + }; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + select_statement[] = + "SELECT " + "\"build_package_constraints\".\"index\", " + "\"build_package_constraints\".\"exclusion\", " + "\"build_package_constraints\".\"config\", " + "\"build_package_constraints\".\"target\", " + "\"build_package_constraints\".\"comment\" " + "FROM \"build_package_constraints\" " + "WHERE \"build_package_constraints\".\"tenant\"=$1 AND \"build_package_constraints\".\"name\"=$2::CITEXT AND \"build_package_constraints\".\"version_epoch\"=$3 AND \"build_package_constraints\".\"version_canonical_upstream\"=$4 AND \"build_package_constraints\".\"version_canonical_release\"=$5 AND \"build_package_constraints\".\"version_revision\"=$6 ORDER BY \"build_package_constraints\".\"index\""; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + insert_statement[] = + "INSERT INTO \"build_package_constraints\" " + "(\"tenant\", " + "\"name\", " + "\"version_epoch\", " + "\"version_canonical_upstream\", " + "\"version_canonical_release\", " + "\"version_revision\", " + "\"index\", " + "\"exclusion\", " + "\"config\", " + "\"target\", " + "\"comment\") " + "VALUES " + "($1, $2::CITEXT, $3, $4, $5, $6, $7, $8, $9, $10, $11)"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + delete_statement[] = + "DELETE FROM \"build_package_constraints\" " + "WHERE \"tenant\"=$1 AND \"name\"=$2::CITEXT AND \"version_epoch\"=$3 AND \"version_canonical_upstream\"=$4 AND \"version_canonical_release\"=$5 AND \"version_revision\"=$6"; + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + bind (pgsql::bind* b, + const pgsql::bind* id, + std::size_t id_size, + data_image_type& d) + { + using namespace pgsql; + + statement_kind sk (statement_select); + ODB_POTENTIALLY_UNUSED (sk); + + size_t n (0); + + // object_id + // + if (id != 0) + std::memcpy (&b[n], id, id_size * sizeof (id[0])); + n += id_size; + + // index + // + b[n].type = pgsql::bind::bigint; + b[n].buffer = &d.index_value; + b[n].is_null = &d.index_null; + n++; + + // value + // + composite_value_traits< value_type, id_pgsql >::bind ( + b + n, d.value_value, sk); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + grow (data_image_type& i, + bool* t) + { + bool grew (false); + + // index + // + t[0UL] = 0; + + // value + // + if (composite_value_traits< value_type, id_pgsql >::grow ( + i.value_value, t + 1UL)) + grew = true; + + if (grew) + i.version++; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + init (data_image_type& i, + index_type* j, + const value_type& v) + { + using namespace pgsql; + + statement_kind sk (statement_insert); + ODB_POTENTIALLY_UNUSED (sk); + + bool grew (false); + + // index + // + if (j != 0) + { + bool is_null (false); + pgsql::value_traits< + index_type, + pgsql::id_bigint >::set_image ( + i.index_value, is_null, *j); + i.index_null = is_null; + } + + // value + // + { + if (composite_value_traits< value_type, id_pgsql >::init ( + i.value_value, + v, + sk)) + grew = true; + } + + if (grew) + i.version++; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + init (index_type& j, + value_type& v, + const data_image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (db); + + // index + // + { + pgsql::value_traits< + index_type, + pgsql::id_bigint >::set_value ( + j, + i.index_value, + i.index_null); + } + + // value + // + { + composite_value_traits< value_type, id_pgsql >::init ( + v, + i.value_value, + db); + } + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + insert (index_type i, const value_type& v, void* d) + { + using namespace pgsql; + + statements_type& sts (*static_cast< statements_type* > (d)); + data_image_type& di (sts.data_image ()); + + init (di, &i, v); + + if (sts.data_binding_test_version ()) + { + const binding& id (sts.id_binding ()); + bind (sts.data_bind (), id.bind, id.count, di); + sts.data_binding_update_version (); + } + + if (!sts.insert_statement ().execute ()) + throw object_already_persistent (); + } + + bool access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + select (index_type& i, value_type& v, void* d) + { + using namespace pgsql; + using pgsql::select_statement; + + statements_type& sts (*static_cast< statements_type* > (d)); + data_image_type& di (sts.data_image ()); + + init (i, v, di, &sts.connection ().database ()); + + select_statement& st (sts.select_statement ()); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + grow (di, sts.select_image_truncated ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), 0, sts.id_binding ().count, di); + sts.data_binding_update_version (); + st.refetch (); + } + } + + return r != select_statement::no_data; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + delete_ (void* d) + { + using namespace pgsql; + + statements_type& sts (*static_cast< statements_type* > (d)); + sts.delete_statement ().execute (); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + persist (const container_type& c, + statements_type& sts) + { + using namespace pgsql; + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::persist (c, fs); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + load (container_type& c, + statements_type& sts) + { + using namespace pgsql; + using pgsql::select_statement; + + const binding& id (sts.id_binding ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), id.bind, id.count, sts.data_image ()); + sts.data_binding_update_version (); + } + + select_statement& st (sts.select_statement ()); + st.execute (); + auto_result ar (st); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + data_image_type& di (sts.data_image ()); + grow (di, sts.select_image_truncated ()); + + if (sts.data_binding_test_version ()) + { + bind (sts.data_bind (), 0, id.count, di); + sts.data_binding_update_version (); + st.refetch (); + } + } + + bool more (r != select_statement::no_data); + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::load (c, more, fs); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >::constraints_traits:: + erase (statements_type& sts) + { + using namespace pgsql; + + functions_type& fs (sts.functions ()); + fs.ordered_ = true; + container_traits_type::erase (fs); + } + + access::object_traits_impl< ::brep::build_package, id_pgsql >::id_type + access::object_traits_impl< ::brep::build_package, id_pgsql >:: + id (const image_type& i) + { + pgsql::database* db (0); + ODB_POTENTIALLY_UNUSED (db); + + id_type id; + { + composite_value_traits< ::brep::package_id, id_pgsql >::init ( + id, + i.id_value, + db); + } + + return id; + } + + bool access::object_traits_impl< ::brep::build_package, id_pgsql >:: + grow (image_type& i, + bool* t) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (t); + + bool grew (false); + + // id + // + if (composite_value_traits< ::brep::package_id, id_pgsql >::grow ( + i.id_value, t + 0UL)) + grew = true; + + // version + // + if (composite_value_traits< ::brep::upstream_version, id_pgsql >::grow ( + i.version_value, t + 6UL)) + grew = true; + + // internal_repository + // + if (composite_value_traits< ::brep::repository_id, id_pgsql >::grow ( + i.internal_repository_value, t + 8UL)) + grew = true; + + // buildable + // + t[10UL] = 0; + + return grew; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >:: + bind (pgsql::bind* b, + image_type& i, + pgsql::statement_kind sk) + { + ODB_POTENTIALLY_UNUSED (sk); + + using namespace pgsql; + + assert (sk != statement_update); + + std::size_t n (0); + + // id + // + composite_value_traits< ::brep::package_id, id_pgsql >::bind ( + b + n, i.id_value, sk); + n += 6UL; + + // version + // + composite_value_traits< ::brep::upstream_version, id_pgsql >::bind ( + b + n, i.version_value, sk); + n += 2UL; + + // internal_repository + // + composite_value_traits< ::brep::repository_id, id_pgsql >::bind ( + b + n, i.internal_repository_value, sk); + n += 2UL; + + // buildable + // + b[n].type = pgsql::bind::boolean_; + b[n].buffer = &i.buildable_value; + b[n].is_null = &i.buildable_null; + n++; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >:: + bind (pgsql::bind* b, id_image_type& i) + { + std::size_t n (0); + pgsql::statement_kind sk (pgsql::statement_select); + composite_value_traits< ::brep::package_id, id_pgsql >::bind ( + b + n, i.id_value, sk); + } + + bool access::object_traits_impl< ::brep::build_package, id_pgsql >:: + init (image_type& i, + const object_type& o, + pgsql::statement_kind sk) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (sk); + + using namespace pgsql; + + assert (sk != statement_update); + + bool grew (false); + + // id + // + { + ::brep::package_id const& v = + o.id; + + if (composite_value_traits< ::brep::package_id, id_pgsql >::init ( + i.id_value, + v, + sk)) + grew = true; + } + + // version + // + { + ::brep::upstream_version const& v = + o.version; + + if (composite_value_traits< ::brep::upstream_version, id_pgsql >::init ( + i.version_value, + v, + sk)) + grew = true; + } + + // internal_repository + // + { + ::odb::lazy_shared_ptr< ::brep::build_repository > const& v = + o.internal_repository; + + typedef object_traits< ::brep::build_repository > obj_traits; + typedef odb::pointer_traits< ::odb::lazy_shared_ptr< ::brep::build_repository > > ptr_traits; + + bool is_null (ptr_traits::null_ptr (v)); + if (!is_null) + { + const obj_traits::id_type& ptr_id ( + ptr_traits::object_id< ptr_traits::element_type > (v)); + + if (composite_value_traits< obj_traits::id_type, id_pgsql >::init ( + i.internal_repository_value, + ptr_id, + sk)) + grew = true; + } + else + composite_value_traits< obj_traits::id_type, id_pgsql >::set_null (i.internal_repository_value, sk); + } + + // buildable + // + { + bool const& v = + o.buildable; + + bool is_null (false); + pgsql::value_traits< + bool, + pgsql::id_boolean >::set_image ( + i.buildable_value, is_null, v); + i.buildable_null = is_null; + } + + return grew; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >:: + init (object_type& o, + const image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (db); + + // id + // + { + ::brep::package_id& v = + o.id; + + composite_value_traits< ::brep::package_id, id_pgsql >::init ( + v, + i.id_value, + db); + } + + // version + // + { + // From build-package.hxx:117:32 + ::brep::upstream_version v; + + composite_value_traits< ::brep::upstream_version, id_pgsql >::init ( + v, + i.version_value, + db); + + // From build-package.hxx:117:32 + o.version.init (o.id.version, (v)); + } + + // internal_repository + // + { + ::odb::lazy_shared_ptr< ::brep::build_repository >& v = + o.internal_repository; + + typedef object_traits< ::brep::build_repository > obj_traits; + typedef odb::pointer_traits< ::odb::lazy_shared_ptr< ::brep::build_repository > > ptr_traits; + + if (composite_value_traits< obj_traits::id_type, id_pgsql >::get_null ( + i.internal_repository_value)) + v = ptr_traits::pointer_type (); + else + { + obj_traits::id_type ptr_id; + composite_value_traits< obj_traits::id_type, id_pgsql >::init ( + ptr_id, + i.internal_repository_value, + db); + + v = ptr_traits::pointer_type ( + *static_cast (db), ptr_id); + } + } + + // buildable + // + { + bool& v = + o.buildable; + + pgsql::value_traits< + bool, + pgsql::id_boolean >::set_value ( + v, + i.buildable_value, + i.buildable_null); + } + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >:: + init (id_image_type& i, const id_type& id) + { + bool grew (false); + pgsql::statement_kind sk (pgsql::statement_select); + { + if (composite_value_traits< ::brep::package_id, id_pgsql >::init ( + i.id_value, + id, + sk)) + grew = true; + } + + if (grew) + i.version++; + } + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::persist_statement[] = + "INSERT INTO \"build_package\" " + "(\"tenant\", " + "\"name\", " + "\"version_epoch\", " + "\"version_canonical_upstream\", " + "\"version_canonical_release\", " + "\"version_revision\", " + "\"version_upstream\", " + "\"version_release\", " + "\"internal_repository_tenant\", " + "\"internal_repository_canonical_name\", " + "\"buildable\") " + "VALUES " + "($1, $2::CITEXT, $3, $4, $5, $6, $7, $8, $9, $10, $11)"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::find_statement[] = + "SELECT " + "\"build_package\".\"tenant\", " + "\"build_package\".\"name\"::TEXT, " + "\"build_package\".\"version_epoch\", " + "\"build_package\".\"version_canonical_upstream\", " + "\"build_package\".\"version_canonical_release\", " + "\"build_package\".\"version_revision\", " + "\"build_package\".\"version_upstream\", " + "\"build_package\".\"version_release\", " + "\"build_package\".\"internal_repository_tenant\", " + "\"build_package\".\"internal_repository_canonical_name\", " + "\"build_package\".\"buildable\" " + "FROM \"build_package\" " + "WHERE \"build_package\".\"tenant\"=$1 AND \"build_package\".\"name\"=$2::CITEXT AND \"build_package\".\"version_epoch\"=$3 AND \"build_package\".\"version_canonical_upstream\"=$4 AND \"build_package\".\"version_canonical_release\"=$5 AND \"build_package\".\"version_revision\"=$6"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::erase_statement[] = + "DELETE FROM \"build_package\" " + "WHERE \"tenant\"=$1 AND \"name\"=$2::CITEXT AND \"version_epoch\"=$3 AND \"version_canonical_upstream\"=$4 AND \"version_canonical_release\"=$5 AND \"version_revision\"=$6"; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::query_statement[] = + "SELECT\n" + "\"build_package\".\"tenant\",\n" + "\"build_package\".\"name\"::TEXT,\n" + "\"build_package\".\"version_epoch\",\n" + "\"build_package\".\"version_canonical_upstream\",\n" + "\"build_package\".\"version_canonical_release\",\n" + "\"build_package\".\"version_revision\",\n" + "\"build_package\".\"version_upstream\",\n" + "\"build_package\".\"version_release\",\n" + "\"build_package\".\"internal_repository_tenant\",\n" + "\"build_package\".\"internal_repository_canonical_name\",\n" + "\"build_package\".\"buildable\"\n" + "FROM \"build_package\"\n" + "LEFT JOIN \"build_repository\" AS \"internal_repository\" ON \"internal_repository\".\"tenant\"=\"build_package\".\"internal_repository_tenant\" AND \"internal_repository\".\"canonical_name\"=\"build_package\".\"internal_repository_canonical_name\""; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::erase_query_statement[] = + "DELETE FROM \"build_package\""; + + const char access::object_traits_impl< ::brep::build_package, id_pgsql >::table_name[] = + "\"build_package\""; + + void access::object_traits_impl< ::brep::build_package, id_pgsql >:: + persist (database& db, const object_type& obj) + { + ODB_POTENTIALLY_UNUSED (db); + + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + callback (db, + obj, + callback_event::pre_persist); + + image_type& im (sts.image ()); + binding& imb (sts.insert_image_binding ()); + + if (init (im, obj, statement_insert)) + im.version++; + + if (im.version != sts.insert_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_insert); + sts.insert_image_version (im.version); + imb.version++; + } + + insert_statement& st (sts.persist_statement ()); + if (!st.execute ()) + throw object_already_persistent (); + + id_image_type& i (sts.id_image ()); + init (i, id (obj)); + + binding& idb (sts.id_image_binding ()); + if (i.version != sts.id_image_version () || idb.version == 0) + { + bind (idb.bind, i); + sts.id_image_version (i.version); + idb.version++; + } + + extra_statement_cache_type& esc (sts.extra_statement_cache ()); + + // tests + // + { + ::butl::small_vector< ::brep::build_test_dependency, 1 > const& v = + obj.tests; + + tests_traits::persist ( + v, + esc.tests); + } + + // builds + // + { + ::brep::build_class_exprs const& v = + obj.builds; + + builds_traits::persist ( + v, + esc.builds); + } + + // constraints + // + { + ::brep::build_constraints const& v = + obj.constraints; + + constraints_traits::persist ( + v, + esc.constraints); + } + + callback (db, + obj, + callback_event::post_persist); + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >:: + erase (database& db, const id_type& id) + { + using namespace pgsql; + + ODB_POTENTIALLY_UNUSED (db); + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + id_image_type& i (sts.id_image ()); + init (i, id); + + binding& idb (sts.id_image_binding ()); + if (i.version != sts.id_image_version () || idb.version == 0) + { + bind (idb.bind, i); + sts.id_image_version (i.version); + idb.version++; + } + + extra_statement_cache_type& esc (sts.extra_statement_cache ()); + + // tests + // + { + tests_traits::erase ( + esc.tests); + } + + // builds + // + { + builds_traits::erase ( + esc.builds); + } + + // constraints + // + { + constraints_traits::erase ( + esc.constraints); + } + + if (sts.erase_statement ().execute () != 1) + throw object_not_persistent (); + + pointer_cache_traits::erase (db, id); + } + + access::object_traits_impl< ::brep::build_package, id_pgsql >::pointer_type + access::object_traits_impl< ::brep::build_package, id_pgsql >:: + find (database& db, const id_type& id) + { + using namespace pgsql; + + { + pointer_type p (pointer_cache_traits::find (db, id)); + + if (!pointer_traits::null_ptr (p)) + return p; + } + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + + if (l.locked ()) + { + if (!find_ (sts, &id)) + return pointer_type (); + } + + pointer_type p ( + access::object_factory::create ()); + pointer_traits::guard pg (p); + + pointer_cache_traits::insert_guard ig ( + pointer_cache_traits::insert (db, id, p)); + + object_type& obj (pointer_traits::get_ref (p)); + + if (l.locked ()) + { + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, false); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + pointer_cache_traits::load (ig.position ()); + } + else + sts.delay_load (id, obj, ig.position ()); + + ig.release (); + pg.release (); + return p; + } + + bool access::object_traits_impl< ::brep::build_package, id_pgsql >:: + find (database& db, const id_type& id, object_type& obj) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + assert (l.locked ()) /* Must be a top-level call. */; + + if (!find_ (sts, &id)) + return false; + + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + reference_cache_traits::position_type pos ( + reference_cache_traits::insert (db, id, obj)); + reference_cache_traits::insert_guard ig (pos); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, false); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + reference_cache_traits::load (pos); + ig.release (); + return true; + } + + bool access::object_traits_impl< ::brep::build_package, id_pgsql >:: + reload (database& db, object_type& obj) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_object ()); + + statements_type::auto_lock l (sts); + assert (l.locked ()) /* Must be a top-level call. */; + + const id_type& id (object_traits_impl::id (obj)); + if (!find_ (sts, &id)) + return false; + + select_statement& st (sts.find_statement ()); + ODB_POTENTIALLY_UNUSED (st); + + callback (db, obj, callback_event::pre_load); + init (obj, sts.image (), &db); + load_ (sts, obj, true); + sts.load_delayed (0); + l.unlock (); + callback (db, obj, callback_event::post_load); + return true; + } + + bool access::object_traits_impl< ::brep::build_package, id_pgsql >:: + find_ (statements_type& sts, + const id_type* id) + { + using namespace pgsql; + + id_image_type& i (sts.id_image ()); + init (i, *id); + + binding& idb (sts.id_image_binding ()); + if (i.version != sts.id_image_version () || idb.version == 0) + { + bind (idb.bind, i); + sts.id_image_version (i.version); + idb.version++; + } + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + select_statement& st (sts.find_statement ()); + + st.execute (); + auto_result ar (st); + select_statement::result r (st.fetch ()); + + if (r == select_statement::truncated) + { + if (grow (im, sts.select_image_truncated ())) + im.version++; + + if (im.version != sts.select_image_version ()) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + st.refetch (); + } + } + + return r != select_statement::no_data; + } + + void access::object_traits_impl< ::brep::build_package, id_pgsql >:: + load_ (statements_type& sts, + object_type& obj, + bool reload) + { + ODB_POTENTIALLY_UNUSED (reload); + + extra_statement_cache_type& esc (sts.extra_statement_cache ()); + + // tests + // + { + ::butl::small_vector< ::brep::build_test_dependency, 1 >& v = + obj.tests; + + tests_traits::load ( + v, + esc.tests); + } + + // builds + // + { + ::brep::build_class_exprs& v = + obj.builds; + + builds_traits::load ( + v, + esc.builds); + } + + // constraints + // + { + ::brep::build_constraints& v = + obj.constraints; + + constraints_traits::load ( + v, + esc.constraints); + } + } + + result< access::object_traits_impl< ::brep::build_package, id_pgsql >::object_type > + access::object_traits_impl< ::brep::build_package, id_pgsql >:: + query (database&, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + std::string text (query_statement); + if (!q.empty ()) + { + text += "\n"; + text += q.clause (); + } + + q.init_parameters (); + shared_ptr st ( + new (shared) select_statement ( + sts.connection (), + query_statement_name, + text, + true, + true, + q.parameter_types (), + q.parameter_count (), + q.parameters_binding (), + imb)); + + st->execute (); + st->deallocate (); + + shared_ptr< odb::object_result_impl > r ( + new (shared) pgsql::object_result_impl ( + q, st, sts, 0)); + + return result (r); + } + + unsigned long long access::object_traits_impl< ::brep::build_package, id_pgsql >:: + erase_query (database&, const query_base_type& q) + { + using namespace pgsql; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + std::string text (erase_query_statement); + if (!q.empty ()) + { + text += ' '; + text += q.clause (); + } + + q.init_parameters (); + delete_statement st ( + conn, + erase_query_statement_name, + text, + q.parameter_types (), + q.parameter_count (), + q.parameters_binding ()); + + return st.execute (); + } + + odb::details::shared_ptr + access::object_traits_impl< ::brep::build_package, id_pgsql >:: + prepare_query (connection& c, const char* n, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + static_cast (c)); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + std::string text (query_statement); + if (!q.empty ()) + { + text += "\n"; + text += q.clause (); + } + + shared_ptr r ( + new (shared) pgsql::prepared_query_impl (conn)); + r->name = n; + r->execute = &execute_query; + r->query = q; + r->stmt.reset ( + new (shared) select_statement ( + sts.connection (), + n, + text, + true, + true, + r->query.parameter_types (), + r->query.parameter_count (), + r->query.parameters_binding (), + imb)); + + return r; + } + + odb::details::shared_ptr + access::object_traits_impl< ::brep::build_package, id_pgsql >:: + execute_query (prepared_query_impl& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::prepared_query_impl& pq ( + static_cast (q)); + shared_ptr st ( + odb::details::inc_ref ( + static_cast (pq.stmt.get ()))); + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + // The connection used by the current transaction and the + // one used to prepare this statement must be the same. + // + assert (&conn == &st->connection ()); + + statements_type& sts ( + conn.statement_cache ().find_object ()); + + image_type& im (sts.image ()); + binding& imb (sts.select_image_binding ()); + + if (im.version != sts.select_image_version () || + imb.version == 0) + { + bind (imb.bind, im, statement_select); + sts.select_image_version (im.version); + imb.version++; + } + + pq.query.init_parameters (); + st->execute (); + + return shared_ptr ( + new (shared) pgsql::object_result_impl ( + pq.query, st, sts, 0)); + } + + // buildable_package + // + + const char access::view_traits_impl< ::brep::buildable_package, id_pgsql >:: + query_statement_name[] = "query_brep_buildable_package"; + + bool access::view_traits_impl< ::brep::buildable_package, id_pgsql >:: + grow (image_type& i, + bool* t) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (t); + + bool grew (false); + + // id + // + if (composite_value_traits< ::brep::package_id, id_pgsql >::grow ( + i.id_value, t + 0UL)) + grew = true; + + // version + // + if (composite_value_traits< ::brep::upstream_version, id_pgsql >::grow ( + i.version_value, t + 6UL)) + grew = true; + + // archived + // + t[8UL] = 0; + + return grew; + } + + void access::view_traits_impl< ::brep::buildable_package, id_pgsql >:: + bind (pgsql::bind* b, + image_type& i) + { + using namespace pgsql; + + pgsql::statement_kind sk (statement_select); + ODB_POTENTIALLY_UNUSED (sk); + + std::size_t n (0); + + // id + // + composite_value_traits< ::brep::package_id, id_pgsql >::bind ( + b + n, i.id_value, sk); + n += 6UL; + + // version + // + composite_value_traits< ::brep::upstream_version, id_pgsql >::bind ( + b + n, i.version_value, sk); + n += 2UL; + + // archived + // + b[n].type = pgsql::bind::boolean_; + b[n].buffer = &i.archived_value; + b[n].is_null = &i.archived_null; + n++; + } + + void access::view_traits_impl< ::brep::buildable_package, id_pgsql >:: + init (view_type& o, + const image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (db); + + // id + // + { + ::brep::package_id& v = + o.id; + + composite_value_traits< ::brep::package_id, id_pgsql >::init ( + v, + i.id_value, + db); + } + + // version + // + { + // From build-package.hxx:148:32 + ::brep::upstream_version v; + + composite_value_traits< ::brep::upstream_version, id_pgsql >::init ( + v, + i.version_value, + db); + + // From build-package.hxx:148:32 + o.version.init (o.id.version, (v)); + } + + // archived + // + { + bool& v = + o.archived; + + pgsql::value_traits< + bool, + pgsql::id_boolean >::set_value ( + v, + i.archived_value, + i.archived_null); + } + } + + access::view_traits_impl< ::brep::buildable_package, id_pgsql >::query_base_type + access::view_traits_impl< ::brep::buildable_package, id_pgsql >:: + query_statement (const query_base_type& q) + { + query_base_type r ( + "SELECT " + "\"build_package\".\"tenant\", " + "\"build_package\".\"name\"::TEXT, " + "\"build_package\".\"version_epoch\", " + "\"build_package\".\"version_canonical_upstream\", " + "\"build_package\".\"version_canonical_release\", " + "\"build_package\".\"version_revision\", " + "\"build_package\".\"version_upstream\", " + "\"build_package\".\"version_release\", " + "\"build_tenant\".\"archived\" "); + + r += "FROM \"build_package\""; + + r += " INNER JOIN \"build_repository\" ON"; + // From build-package.hxx:134:5 + r += query_columns::build_package::buildable && brep::operator == (query_columns::build_package::internal_repository, query_columns::build_repository::id); + + r += " LEFT JOIN \"build_tenant\" ON"; + // From build-package.hxx:138:5 + r += query_columns::build_package::id.tenant == query_columns::build_tenant::id; + + if (!q.empty ()) + { + r += " "; + r += q.clause_prefix (); + r += q; + } + + return r; + } + + result< access::view_traits_impl< ::brep::buildable_package, id_pgsql >::view_type > + access::view_traits_impl< ::brep::buildable_package, id_pgsql >:: + query (database&, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_view ()); + + image_type& im (sts.image ()); + binding& imb (sts.image_binding ()); + + if (im.version != sts.image_version () || imb.version == 0) + { + bind (imb.bind, im); + sts.image_version (im.version); + imb.version++; + } + + const query_base_type& qs (query_statement (q)); + qs.init_parameters (); + shared_ptr st ( + new (shared) select_statement ( + sts.connection (), + query_statement_name, + qs.clause (), + false, + true, + qs.parameter_types (), + qs.parameter_count (), + qs.parameters_binding (), + imb)); + + st->execute (); + st->deallocate (); + + shared_ptr< odb::view_result_impl > r ( + new (shared) pgsql::view_result_impl ( + qs, st, sts, 0)); + + return result (r); + } + + odb::details::shared_ptr + access::view_traits_impl< ::brep::buildable_package, id_pgsql >:: + prepare_query (connection& c, const char* n, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + static_cast (c)); + statements_type& sts ( + conn.statement_cache ().find_view ()); + + image_type& im (sts.image ()); + binding& imb (sts.image_binding ()); + + if (im.version != sts.image_version () || imb.version == 0) + { + bind (imb.bind, im); + sts.image_version (im.version); + imb.version++; + } + + shared_ptr r ( + new (shared) pgsql::prepared_query_impl (conn)); + r->name = n; + r->execute = &execute_query; + r->query = query_statement (q); + r->stmt.reset ( + new (shared) select_statement ( + sts.connection (), + n, + r->query.clause (), + false, + true, + r->query.parameter_types (), + r->query.parameter_count (), + r->query.parameters_binding (), + imb)); + + return r; + } + + odb::details::shared_ptr + access::view_traits_impl< ::brep::buildable_package, id_pgsql >:: + execute_query (prepared_query_impl& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::prepared_query_impl& pq ( + static_cast (q)); + shared_ptr st ( + odb::details::inc_ref ( + static_cast (pq.stmt.get ()))); + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + // The connection used by the current transaction and the + // one used to prepare this statement must be the same. + // + assert (&conn == &st->connection ()); + + statements_type& sts ( + conn.statement_cache ().find_view ()); + + image_type& im (sts.image ()); + binding& imb (sts.image_binding ()); + + if (im.version != sts.image_version () || imb.version == 0) + { + bind (imb.bind, im); + sts.image_version (im.version); + imb.version++; + } + + pq.query.init_parameters (); + st->execute (); + + return shared_ptr ( + new (shared) pgsql::view_result_impl ( + pq.query, st, sts, 0)); + } + + // buildable_package_count + // + + const char access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >:: + query_statement_name[] = "query_brep_buildable_package_count"; + + bool access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >:: + grow (image_type& i, + bool* t) + { + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (t); + + bool grew (false); + + // result + // + t[0UL] = 0; + + return grew; + } + + void access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >:: + bind (pgsql::bind* b, + image_type& i) + { + using namespace pgsql; + + pgsql::statement_kind sk (statement_select); + ODB_POTENTIALLY_UNUSED (sk); + + std::size_t n (0); + + // result + // + b[n].type = pgsql::bind::bigint; + b[n].buffer = &i.result_value; + b[n].is_null = &i.result_null; + n++; + } + + void access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >:: + init (view_type& o, + const image_type& i, + database* db) + { + ODB_POTENTIALLY_UNUSED (o); + ODB_POTENTIALLY_UNUSED (i); + ODB_POTENTIALLY_UNUSED (db); + + // result + // + { + ::std::size_t& v = + o.result; + + pgsql::value_traits< + ::std::size_t, + pgsql::id_bigint >::set_value ( + v, + i.result_value, + i.result_null); + } + } + + access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >::query_base_type + access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >:: + query_statement (const query_base_type& q) + { + query_base_type r ( + "SELECT " + "count(\"build_package\".\"name\") "); + + r += "FROM \"build_package\""; + + r += " INNER JOIN \"build_repository\" ON"; + // From build-package.hxx:153:5 + r += query_columns::build_package::buildable && brep::operator == (query_columns::build_package::internal_repository, query_columns::build_repository::id); + + r += " LEFT JOIN \"build_tenant\" ON"; + // From build-package.hxx:157:5 + r += query_columns::build_package::id.tenant == query_columns::build_tenant::id; + + if (!q.empty ()) + { + r += " "; + r += q.clause_prefix (); + r += q; + } + + return r; + } + + result< access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >::view_type > + access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >:: + query (database&, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + statements_type& sts ( + conn.statement_cache ().find_view ()); + + image_type& im (sts.image ()); + binding& imb (sts.image_binding ()); + + if (im.version != sts.image_version () || imb.version == 0) + { + bind (imb.bind, im); + sts.image_version (im.version); + imb.version++; + } + + const query_base_type& qs (query_statement (q)); + qs.init_parameters (); + shared_ptr st ( + new (shared) select_statement ( + sts.connection (), + query_statement_name, + qs.clause (), + false, + true, + qs.parameter_types (), + qs.parameter_count (), + qs.parameters_binding (), + imb)); + + st->execute (); + st->deallocate (); + + shared_ptr< odb::view_result_impl > r ( + new (shared) pgsql::view_result_impl ( + qs, st, sts, 0)); + + return result (r); + } + + odb::details::shared_ptr + access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >:: + prepare_query (connection& c, const char* n, const query_base_type& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::connection& conn ( + static_cast (c)); + statements_type& sts ( + conn.statement_cache ().find_view ()); + + image_type& im (sts.image ()); + binding& imb (sts.image_binding ()); + + if (im.version != sts.image_version () || imb.version == 0) + { + bind (imb.bind, im); + sts.image_version (im.version); + imb.version++; + } + + shared_ptr r ( + new (shared) pgsql::prepared_query_impl (conn)); + r->name = n; + r->execute = &execute_query; + r->query = query_statement (q); + r->stmt.reset ( + new (shared) select_statement ( + sts.connection (), + n, + r->query.clause (), + false, + true, + r->query.parameter_types (), + r->query.parameter_count (), + r->query.parameters_binding (), + imb)); + + return r; + } + + odb::details::shared_ptr + access::view_traits_impl< ::brep::buildable_package_count, id_pgsql >:: + execute_query (prepared_query_impl& q) + { + using namespace pgsql; + using odb::details::shared; + using odb::details::shared_ptr; + + pgsql::prepared_query_impl& pq ( + static_cast (q)); + shared_ptr st ( + odb::details::inc_ref ( + static_cast (pq.stmt.get ()))); + + pgsql::connection& conn ( + pgsql::transaction::current ().connection ()); + + // The connection used by the current transaction and the + // one used to prepare this statement must be the same. + // + assert (&conn == &st->connection ()); + + statements_type& sts ( + conn.statement_cache ().find_view ()); + + image_type& im (sts.image ()); + binding& imb (sts.image_binding ()); + + if (im.version != sts.image_version () || imb.version == 0) + { + bind (imb.bind, im); + sts.image_version (im.version); + imb.version++; + } + + pq.query.init_parameters (); + st->execute (); + + return shared_ptr ( + new (shared) pgsql::view_result_impl ( + pq.query, st, sts, 0)); + } +} + +#include -- cgit v1.1