aboutsummaryrefslogtreecommitdiff
path: root/libbrep
diff options
context:
space:
mode:
Diffstat (limited to 'libbrep')
-rw-r--r--libbrep/.gitignore2
-rw-r--r--libbrep/build-extra.sql20
-rw-r--r--libbrep/build-package.hxx56
-rw-r--r--libbrep/build.hxx39
-rw-r--r--libbrep/buildfile38
-rwxr-xr-xlibbrep/odb.sh10
-rw-r--r--libbrep/package-extra.sql2
7 files changed, 147 insertions, 20 deletions
diff --git a/libbrep/.gitignore b/libbrep/.gitignore
index 3f251f5..48fba7b 100644
--- a/libbrep/.gitignore
+++ b/libbrep/.gitignore
@@ -5,6 +5,8 @@ package.sql
package-extra.hxx
build-odb.?xx
+build-package-odb.?xx
build.sql
+build-extra.hxx
version.hxx
diff --git a/libbrep/build-extra.sql b/libbrep/build-extra.sql
new file mode 100644
index 0000000..31736c8
--- /dev/null
+++ b/libbrep/build-extra.sql
@@ -0,0 +1,20 @@
+-- This file should be parsable by the brep-migrate utility. To decrease the
+-- parser complexity, there is a number of restrictions, see package-extra.sql
+-- file for details.
+--
+
+-- The foreign table for build_package object.
+--
+--
+DROP FOREIGN TABLE IF EXISTS build_package;
+
+CREATE FOREIGN TABLE build_package (
+ name TEXT NOT NULL,
+ version_epoch INTEGER NOT NULL,
+ version_canonical_upstream TEXT NOT NULL,
+ version_canonical_release TEXT NOT NULL COLLATE "C",
+ version_revision INTEGER NOT NULL,
+ version_upstream TEXT NOT NULL,
+ version_release TEXT NULL,
+ internal_repository TEXT NULL)
+SERVER package_server OPTIONS (table_name 'package');
diff --git a/libbrep/build-package.hxx b/libbrep/build-package.hxx
new file mode 100644
index 0000000..b0688c2
--- /dev/null
+++ b/libbrep/build-package.hxx
@@ -0,0 +1,56 @@
+// file : libbrep/build-package.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef LIBBREP_BUILD_PACKAGE_HXX
+#define LIBBREP_BUILD_PACKAGE_HXX
+
+#include <odb/core.hxx>
+
+#include <libbrep/types.hxx>
+#include <libbrep/utility.hxx>
+
+#include <libbrep/common.hxx> // Must be included last (see assert).
+
+namespace brep
+{
+ // This is a "foreign object" that is mapped to the subset of package object
+ // using PostgreSQL foreign table mechanism. Note that since we maintain the
+ // two in sync by hand, we should only a have a minimal subset of "core"
+ // members (ideally just the primary key) that are unlikly to disappear or
+ // change.
+ //
+ // The mapping is established in build-extra.sql.
+ //
+ #pragma db object table("build_package") pointer(shared_ptr) readonly
+ class build_package
+ {
+ public:
+ package_id id;
+ upstream_version version;
+ optional<string> internal_repository;
+
+ // Database mapping.
+ //
+ #pragma db member(id) id column("")
+ #pragma db member(version) set(this.version.init (this.id.version, (?)))
+
+ private:
+ friend class odb::access;
+ build_package () = default;
+ };
+
+ #pragma db view object(build_package)
+ struct build_package_count
+ {
+ size_t result;
+
+ operator size_t () const {return result;}
+
+ // Database mapping.
+ //
+ #pragma db member(result) column("count(" + build_package::id.name + ")")
+ };
+}
+
+#endif // LIBBREP_BUILD_PACKAGE_HXX
diff --git a/libbrep/build.hxx b/libbrep/build.hxx
index dd6f10d..7a231bd 100644
--- a/libbrep/build.hxx
+++ b/libbrep/build.hxx
@@ -17,7 +17,10 @@
#include <libbrep/types.hxx>
#include <libbrep/utility.hxx>
-#include <libbrep/common.hxx> // Must be included last (see assert).
+// Must be included last (see assert in libbrep/common.hxx).
+//
+#include <libbrep/common.hxx>
+#include <libbrep/build-package.hxx>
// Used by the data migration entries.
//
@@ -261,6 +264,40 @@ namespace brep
#pragma db transient
canonical_version version_;
};
+
+ // Build of an existing internal package.
+ //
+ #pragma db view \
+ object(build) \
+ object(build_package inner: \
+ build::id.package.name == build_package::id.name && \
+ brep::compare_version_eq (build::id.package.version, \
+ build_package::id.version, \
+ true) && \
+ build_package::internal_repository.is_not_null ())
+ struct package_build
+ {
+ shared_ptr<brep::build> build;
+ };
+
+ #pragma db view \
+ object(build) \
+ object(build_package inner: \
+ build::id.package.name == build_package::id.name && \
+ brep::compare_version_eq (build::id.package.version, \
+ build_package::id.version, \
+ true) && \
+ build_package::internal_repository.is_not_null ())
+ struct package_build_count
+ {
+ size_t result;
+
+ operator size_t () const {return result;}
+
+ // Database mapping.
+ //
+ #pragma db member(result) column("count(" + build::id.package.name + ")")
+ };
}
#endif // LIBBREP_BUILD_HXX
diff --git a/libbrep/buildfile b/libbrep/buildfile
index b4005ab..1403756 100644
--- a/libbrep/buildfile
+++ b/libbrep/buildfile
@@ -12,24 +12,26 @@ import int_libs += libbutl%lib{butl}
import int_libs += libbpkg%lib{bpkg}
import int_libs += libbbot%lib{bbot}
-lib{brep}: \
-{hxx cxx}{ build } \
-{file }{ build.xml } \
-{hxx ixx cxx}{ build-odb } \
-{hxx cxx}{ common } \
-{hxx ixx cxx}{ common-odb } \
-{hxx cxx}{ package } \
-{file }{ package.xml } \
-{hxx ixx cxx}{ package-odb } \
-{hxx }{ package-extra } \
-{hxx cxx}{ package-traits } \
-{hxx cxx}{ database-lock } \
-{hxx }{ types } \
-{hxx }{ utility } \
-{hxx }{ version } \
-{hxx }{ wrapper-traits } \
- $int_libs \
-sql{build package package-extra}
+lib{brep}: \
+{hxx cxx}{ build } \
+{file }{ build.xml } \
+{hxx ixx cxx}{ build-odb } \
+{hxx }{ build-package } \
+{hxx ixx cxx}{ build-package-odb } \
+{hxx cxx}{ common } \
+{hxx ixx cxx}{ common-odb } \
+{hxx cxx}{ package } \
+{file }{ package.xml } \
+{hxx ixx cxx}{ package-odb } \
+{hxx }{ package-extra } \
+{hxx cxx}{ package-traits } \
+{hxx cxx}{ database-lock } \
+{hxx }{ types } \
+{hxx }{ utility } \
+{hxx }{ version } \
+{hxx }{ wrapper-traits } \
+ $int_libs \
+sql{build build-extra package package-extra}
hxx{version}: in{version} $src_root/file{manifest}
hxx{version}: dist = true
diff --git a/libbrep/odb.sh b/libbrep/odb.sh
index 2897afa..5f5a783 100755
--- a/libbrep/odb.sh
+++ b/libbrep/odb.sh
@@ -38,3 +38,13 @@ $odb $lib -d pgsql --std c++11 --generate-query --generate-schema \
--include-with-brackets --include-prefix libbrep \
--guard-prefix LIBBREP \
build.hxx
+
+$odb $lib -d pgsql --std c++11 --generate-query \
+ --odb-epilogue '#include <libbrep/wrapper-traits.hxx>' \
+ --generate-prepared -DLIBODB_BUILD2 -DLIBODB_PGSQL_BUILD2 \
+ -I .. -I ../../libbbot -I ../../libbpkg -I ../../libbutl \
+ --include-with-brackets --include-prefix libbrep \
+ --guard-prefix LIBBREP \
+ build-package.hxx
+
+xxd -i <build-extra.sql >build-extra.hxx
diff --git a/libbrep/package-extra.sql b/libbrep/package-extra.sql
index 823c3af..5c18da2 100644
--- a/libbrep/package-extra.sql
+++ b/libbrep/package-extra.sql
@@ -3,7 +3,7 @@
--
-- * comments must start with -- at the beginning of the line (ignoring
-- leading spaces)
--- * only CREATE and DROP statements for FUNCTION and TYPE
+-- * only CREATE and DROP statements for FUNCTION, TYPE and FOREIGN TABLE
-- * function bodies must be defined using $$-quoted strings
-- * strings other then function bodies must be quoted with ' or "
-- * statements must end with ";\n"