aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes4
-rw-r--r--build/export.build18
-rw-r--r--build/root.build17
-rw-r--r--libbutl-odb/README-DEV40
-rw-r--r--libbutl-odb/buildfile151
l---------libbutl-odb/odb/c-array-traits.hxx1
l---------libbutl-odb/odb/cache-traits.hxx1
l---------libbutl-odb/odb/callback.hxx1
l---------libbutl-odb/odb/connection.cxx1
l---------libbutl-odb/odb/connection.hxx1
l---------libbutl-odb/odb/connection.ixx1
l---------libbutl-odb/odb/connection.txx1
l---------libbutl-odb/odb/container-traits.hxx1
l---------libbutl-odb/odb/core.hxx1
l---------libbutl-odb/odb/database.cxx1
l---------libbutl-odb/odb/database.hxx1
l---------libbutl-odb/odb/database.ixx1
l---------libbutl-odb/odb/database.txx1
l---------libbutl-odb/odb/details/buffer.cxx1
l---------libbutl-odb/odb/details/buffer.hxx1
l---------libbutl-odb/odb/details/c-string.hxx1
l---------libbutl-odb/odb/details/condition.hxx1
l---------libbutl-odb/odb/details/config-vc.h1
l---------libbutl-odb/odb/details/config.h1
l---------libbutl-odb/odb/details/config.hxx1
l---------libbutl-odb/odb/details/exception.hxx1
l---------libbutl-odb/odb/details/export.hxx1
l---------libbutl-odb/odb/details/function-wrapper.hxx1
l---------libbutl-odb/odb/details/function-wrapper.ixx1
l---------libbutl-odb/odb/details/function-wrapper.txx1
l---------libbutl-odb/odb/details/lock.hxx1
l---------libbutl-odb/odb/details/meta1
l---------libbutl-odb/odb/details/mutex.hxx1
l---------libbutl-odb/odb/details/shared-ptr1
l---------libbutl-odb/odb/details/shared-ptr-fwd.hxx1
l---------libbutl-odb/odb/details/shared-ptr.hxx1
l---------libbutl-odb/odb/details/thread.hxx1
l---------libbutl-odb/odb/details/tls.hxx1
l---------libbutl-odb/odb/details/transfer-ptr.hxx1
l---------libbutl-odb/odb/details/type-info.hxx1
l---------libbutl-odb/odb/details/unique-ptr.hxx1
l---------libbutl-odb/odb/details/unused.hxx1
l---------libbutl-odb/odb/details/win32/windows.hxx1
l---------libbutl-odb/odb/details/wrapper-p.hxx1
l---------libbutl-odb/odb/exception.hxx1
l---------libbutl-odb/odb/exceptions.cxx1
l---------libbutl-odb/odb/exceptions.hxx1
l---------libbutl-odb/odb/forward.hxx1
l---------libbutl-odb/odb/function-table.hxx1
l---------libbutl-odb/odb/lazy-pointer-traits.hxx1
l---------libbutl-odb/odb/lazy-ptr-impl.hxx1
l---------libbutl-odb/odb/lazy-ptr-impl.ixx1
l---------libbutl-odb/odb/lazy-ptr-impl.txx1
l---------libbutl-odb/odb/lazy-ptr.hxx1
l---------libbutl-odb/odb/lazy-ptr.ixx1
l---------libbutl-odb/odb/lazy-ptr.txx1
l---------libbutl-odb/odb/nested-container.hxx1
l---------libbutl-odb/odb/no-id-object-result.hxx1
l---------libbutl-odb/odb/no-id-object-result.txx1
l---------libbutl-odb/odb/no-op-cache-traits.hxx1
l---------libbutl-odb/odb/nullable.hxx1
l---------libbutl-odb/odb/object-result.hxx1
l---------libbutl-odb/odb/pointer-traits.hxx1
l---------libbutl-odb/odb/polymorphic-info.hxx1
l---------libbutl-odb/odb/polymorphic-map.hxx1
l---------libbutl-odb/odb/polymorphic-map.ixx1
l---------libbutl-odb/odb/polymorphic-map.txx1
l---------libbutl-odb/odb/polymorphic-object-result.hxx1
l---------libbutl-odb/odb/polymorphic-object-result.txx1
l---------libbutl-odb/odb/post.hxx1
l---------libbutl-odb/odb/pre.hxx1
l---------libbutl-odb/odb/prepared-query.cxx1
l---------libbutl-odb/odb/prepared-query.hxx1
l---------libbutl-odb/odb/query-dynamic.cxx1
l---------libbutl-odb/odb/query-dynamic.hxx1
l---------libbutl-odb/odb/query-dynamic.ixx1
l---------libbutl-odb/odb/query-dynamic.txx1
l---------libbutl-odb/odb/query.hxx1
l---------libbutl-odb/odb/result.cxx1
l---------libbutl-odb/odb/result.hxx1
l---------libbutl-odb/odb/result.txx1
l---------libbutl-odb/odb/schema-catalog-impl.hxx1
l---------libbutl-odb/odb/schema-catalog.cxx1
l---------libbutl-odb/odb/schema-catalog.hxx1
l---------libbutl-odb/odb/schema-version.hxx1
l---------libbutl-odb/odb/section.cxx1
l---------libbutl-odb/odb/section.hxx1
l---------libbutl-odb/odb/session.cxx1
l---------libbutl-odb/odb/session.hxx1
l---------libbutl-odb/odb/session.ixx1
l---------libbutl-odb/odb/session.txx1
l---------libbutl-odb/odb/simple-object-result.hxx1
l---------libbutl-odb/odb/simple-object-result.txx1
l---------libbutl-odb/odb/sqlite/auto-handle.hxx1
l---------libbutl-odb/odb/sqlite/binding.hxx1
l---------libbutl-odb/odb/sqlite/blob-stream.hxx1
l---------libbutl-odb/odb/sqlite/blob.hxx1
l---------libbutl-odb/odb/sqlite/connection-factory.cxx1
l---------libbutl-odb/odb/sqlite/connection-factory.hxx1
l---------libbutl-odb/odb/sqlite/connection.cxx1
l---------libbutl-odb/odb/sqlite/connection.hxx1
l---------libbutl-odb/odb/sqlite/connection.ixx1
l---------libbutl-odb/odb/sqlite/container-statements.hxx1
l---------libbutl-odb/odb/sqlite/container-statements.txx1
l---------libbutl-odb/odb/sqlite/database.cxx1
l---------libbutl-odb/odb/sqlite/database.hxx1
l---------libbutl-odb/odb/sqlite/database.ixx1
l---------libbutl-odb/odb/sqlite/details/config.hxx1
l---------libbutl-odb/odb/sqlite/details/conversion.hxx1
l---------libbutl-odb/odb/sqlite/details/export.hxx1
l---------libbutl-odb/odb/sqlite/details/options.cxx1
l---------libbutl-odb/odb/sqlite/details/options.hxx1
l---------libbutl-odb/odb/sqlite/details/options.ixx1
l---------libbutl-odb/odb/sqlite/error.cxx1
l---------libbutl-odb/odb/sqlite/error.hxx1
l---------libbutl-odb/odb/sqlite/exceptions.cxx1
l---------libbutl-odb/odb/sqlite/exceptions.hxx1
l---------libbutl-odb/odb/sqlite/forward.hxx1
l---------libbutl-odb/odb/sqlite/no-id-object-result.hxx1
l---------libbutl-odb/odb/sqlite/no-id-object-result.txx1
l---------libbutl-odb/odb/sqlite/no-id-object-statements.hxx1
l---------libbutl-odb/odb/sqlite/no-id-object-statements.txx1
l---------libbutl-odb/odb/sqlite/polymorphic-object-result.hxx1
l---------libbutl-odb/odb/sqlite/polymorphic-object-result.txx1
l---------libbutl-odb/odb/sqlite/polymorphic-object-statements.hxx1
l---------libbutl-odb/odb/sqlite/polymorphic-object-statements.txx1
l---------libbutl-odb/odb/sqlite/prepared-query.cxx1
l---------libbutl-odb/odb/sqlite/prepared-query.hxx1
l---------libbutl-odb/odb/sqlite/query-const-expr.cxx1
l---------libbutl-odb/odb/sqlite/query-dynamic.cxx1
l---------libbutl-odb/odb/sqlite/query-dynamic.hxx1
l---------libbutl-odb/odb/sqlite/query-dynamic.ixx1
l---------libbutl-odb/odb/sqlite/query-dynamic.txx1
l---------libbutl-odb/odb/sqlite/query.cxx1
l---------libbutl-odb/odb/sqlite/query.hxx1
l---------libbutl-odb/odb/sqlite/query.ixx1
l---------libbutl-odb/odb/sqlite/query.txx1
l---------libbutl-odb/odb/sqlite/section-statements.hxx1
l---------libbutl-odb/odb/sqlite/section-statements.txx1
l---------libbutl-odb/odb/sqlite/simple-object-result.hxx1
l---------libbutl-odb/odb/sqlite/simple-object-result.txx1
l---------libbutl-odb/odb/sqlite/simple-object-statements.cxx1
l---------libbutl-odb/odb/sqlite/simple-object-statements.hxx1
l---------libbutl-odb/odb/sqlite/simple-object-statements.ixx1
l---------libbutl-odb/odb/sqlite/simple-object-statements.txx1
l---------libbutl-odb/odb/sqlite/sqlite-types.hxx1
l---------libbutl-odb/odb/sqlite/statement-cache.hxx1
l---------libbutl-odb/odb/sqlite/statement-cache.txx1
l---------libbutl-odb/odb/sqlite/statement.cxx1
l---------libbutl-odb/odb/sqlite/statement.hxx1
l---------libbutl-odb/odb/sqlite/statements-base.cxx1
l---------libbutl-odb/odb/sqlite/statements-base.hxx1
l---------libbutl-odb/odb/sqlite/stream.cxx1
l---------libbutl-odb/odb/sqlite/stream.hxx1
l---------libbutl-odb/odb/sqlite/text-stream.hxx1
l---------libbutl-odb/odb/sqlite/text.hxx1
l---------libbutl-odb/odb/sqlite/tracer.cxx1
l---------libbutl-odb/odb/sqlite/tracer.hxx1
l---------libbutl-odb/odb/sqlite/traits-calls.hxx1
l---------libbutl-odb/odb/sqlite/traits.cxx1
l---------libbutl-odb/odb/sqlite/traits.hxx1
l---------libbutl-odb/odb/sqlite/transaction-impl.cxx1
l---------libbutl-odb/odb/sqlite/transaction-impl.hxx1
l---------libbutl-odb/odb/sqlite/transaction.cxx1
l---------libbutl-odb/odb/sqlite/transaction.hxx1
l---------libbutl-odb/odb/sqlite/transaction.ixx1
-rw-r--r--libbutl-odb/odb/sqlite/version.hxx65
l---------libbutl-odb/odb/sqlite/view-result.hxx1
l---------libbutl-odb/odb/sqlite/view-result.txx1
l---------libbutl-odb/odb/sqlite/view-statements.hxx1
l---------libbutl-odb/odb/sqlite/view-statements.txx1
l---------libbutl-odb/odb/statement-processing-common.hxx1
l---------libbutl-odb/odb/statement-processing.cxx1
l---------libbutl-odb/odb/statement.cxx1
l---------libbutl-odb/odb/statement.hxx1
l---------libbutl-odb/odb/std-array-traits.hxx1
l---------libbutl-odb/odb/std-deque-traits.hxx1
l---------libbutl-odb/odb/std-forward-list-traits.hxx1
l---------libbutl-odb/odb/std-list-traits.hxx1
l---------libbutl-odb/odb/std-map-traits.hxx1
l---------libbutl-odb/odb/std-set-traits.hxx1
l---------libbutl-odb/odb/std-unordered-map-traits.hxx1
l---------libbutl-odb/odb/std-unordered-set-traits.hxx1
l---------libbutl-odb/odb/std-vector-traits.hxx1
l---------libbutl-odb/odb/tracer.cxx1
l---------libbutl-odb/odb/tracer.hxx1
l---------libbutl-odb/odb/traits.hxx1
l---------libbutl-odb/odb/transaction.cxx1
l---------libbutl-odb/odb/transaction.hxx1
l---------libbutl-odb/odb/transaction.ixx1
l---------libbutl-odb/odb/vector-impl.cxx1
l---------libbutl-odb/odb/vector-impl.hxx1
l---------libbutl-odb/odb/vector-impl.ixx1
l---------libbutl-odb/odb/vector-traits.hxx1
l---------libbutl-odb/odb/vector-traits.txx1
l---------libbutl-odb/odb/vector.hxx1
l---------libbutl-odb/odb/vector.ixx1
-rw-r--r--libbutl-odb/odb/version.hxx65
l---------libbutl-odb/odb/view-image.hxx1
l---------libbutl-odb/odb/view-result.hxx1
l---------libbutl-odb/odb/view-result.txx1
l---------libbutl-odb/odb/wrapper-traits.hxx1
l---------libbutl-odb/sqlite/sqlite3.c1
l---------libbutl-odb/sqlite/sqlite3.h1
-rw-r--r--tests/odb/buildfile6
l---------tests/odb/driver.cxx1
206 files changed, 559 insertions, 5 deletions
diff --git a/.gitattributes b/.gitattributes
index d01efdc..cf4b5ef 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -18,3 +18,7 @@
#
#*.png binary
*.lz4 binary
+
+libbutl-odb/odb/details/meta symlink=dir
+libbutl-odb/odb/details/shared-ptr symlink=dir
+
diff --git a/build/export.build b/build/export.build
index 427f76b..5f921cb 100644
--- a/build/export.build
+++ b/build/export.build
@@ -1,9 +1,21 @@
# file : build/export.build
# license : MIT; see accompanying LICENSE file
-$out_root/
+if ($name($import.target) == 'butl-odb')
{
- include libbutl/
+ $out_root/
+ {
+ include libbutl-odb/
+ }
+
+ export $out_root/libbutl-odb/$import.target
}
+else
+{
+ $out_root/
+ {
+ include libbutl/
+ }
-export $out_root/libbutl/lib{butl}
+ export $out_root/libbutl/$import.target
+}
diff --git a/build/root.build b/build/root.build
index 17e42b1..274b23b 100644
--- a/build/root.build
+++ b/build/root.build
@@ -1,9 +1,22 @@
# file : build/root.build
# license : MIT; see accompanying LICENSE file
+# Ability to build with system libsqlite3.
+#
+# Note that unless libsqlite3 on your system was built with an increased
+# SQLITE_MAX_ATTACHED value (the default is 10), you will most likely come to
+# regret using the system version.
+#
+# Also, while most distributions have to build libsqlite3 in a multi-threaded
+# configuration, we build it single-threaded (and with disabled shared cache
+# support), which gives us a non-negligible performance boost.
+#
+config [bool, config.report=false] config.libbutl.system_libsqlite3 ?= false
+
cxx.std = latest
using cxx
+using c
hxx{*}: extension = hxx
ixx{*}: extension = ixx
@@ -11,10 +24,10 @@ txx{*}: extension = txx
cxx{*}: extension = cxx
if ($cxx.target.system == 'win32-msvc')
- cxx.poptions += -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
+ cc.poptions += -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
if ($cxx.class == 'msvc')
- cxx.coptions += /wd4251 /wd4275 /wd4800
+ cc.coptions += /wd4251 /wd4275 /wd4800
elif ($cxx.id == 'gcc')
{
# See GCC bugs 100115, 98753 (attachment 50081/comment 15), and 101361. Note
diff --git a/libbutl-odb/README-DEV b/libbutl-odb/README-DEV
new file mode 100644
index 0000000..f058901
--- /dev/null
+++ b/libbutl-odb/README-DEV
@@ -0,0 +1,40 @@
+Excluded/replaced/relocated ODB upstream files/directories:
+ - libodb/odb/tr1/
+ - libodb/odb/buildfile
+ - libodb/odb/details/{condition.cxx lock.cxx mutex.cxx thread.cxx}
+ - libodb/odb/details/posix/
+ - libodb/odb/details/win32/* except for windows.hxx
+
+
+ - libodb/odb/sqlite/buildfile
+ - libodb/odb/sqlite/details/.gitignore
+ - libodb/odb/sqlite/details/options.cli
+ - libodb/odb/sqlite/details/pregenerated/ -- symlink options.?xx directly in details/
+
+ - libodb/odb/version.hxx.in
+ - libodb/odb/sqlite/version.hxx.in
+ - libodb/odb/version.hxx -- replace with pre-generated for submodule commit
+ - libodb/odb/sqlite/version.hxx -- replace with pre-generated for submodule commit
+
+SQLite is placed into a subdirectory to support the use of external version
+(in which case we omit the corresponding -I option).
+
+Submodule update procedure (similar to updating to a new version of a
+third-party package):
+
+1. Update submodule:
+
+ https://build2.org/stage/build2-toolchain/doc/build2-toolchain-packaging.xhtml#core-version-management-new-version-submodule
+
+2. Review upstream changes:
+
+ https://build2.org/stage/build2-toolchain/doc/build2-toolchain-packaging.xhtml#core-version-management-new-version-review
+
+ Look for:
+
+ - files to add/remove (see above)
+ - changes to buildfiles that would need to be replicated
+
+3. Replace verison.hxx with pre-generated for this submodule commit.
+
+4. Review .gitattributes for any symlink=dir changes.
diff --git a/libbutl-odb/buildfile b/libbutl-odb/buildfile
new file mode 100644
index 0000000..be04ed0
--- /dev/null
+++ b/libbutl-odb/buildfile
@@ -0,0 +1,151 @@
+# file : libbutl-odb/buildfile
+# license : MIT; see accompanying LICENSE file
+
+sys_sqlite = $config.libbutl.system_libsqlite3
+
+intf_libs =
+
+if $sys_sqlite
+ import intf_libs += libsqlite3%lib{sqlite3}
+
+lib{butl-odb}: odb/{h hxx ixx txx cxx}{**}
+lib{butl-odb}: sqlite/{h c}{*}: include = (!$sys_sqlite)
+lib{butl-odb}: $intf_libs
+
+# Build options.
+#
+cxx.poptions =+ "-I$src_base"
+
+if! $sys_sqlite
+ cxx.poptions =+ "-I($src_base/sqlite)"
+
+# For now we only need single-threaded ODB and SQLite. Note that if we need to
+# change that, then we will most likely need to deal with MinGW stdthread mess
+# (see libbutl/buildfile for details). Also see SQLITE_THREADSAFE=0 below.
+#
+cxx.poptions += -DODB_THREADS_NONE
+
+obja{*}: cxx.poptions += -DLIBODB_STATIC_BUILD -DLIBODB_SQLITE_STATIC_BUILD
+objs{*}: cxx.poptions += -DLIBODB_SHARED_BUILD -DLIBODB_SQLITE_SHARED_BUILD
+
+if! $sys_sqlite
+{
+ # Note: copy of libsqlite3/buildfile except for SQLITE_THREADSAFE=0,
+ # -DSQLITE_OMIT_SHARED_CACHE, and removed ENABLE_UNLOCK_NOTIFY=1.
+ #
+ # We also add -Wno-unused-variable and -Wno-unused-but-set-variable.
+ #
+ tclass = $c.target.class
+
+ bsd = ($tclass == 'bsd')
+ windows = ($tclass == 'windows')
+
+ gcc = ($c.class == 'gcc')
+ clang = ($c.id.type == 'clang')
+ clang_msvc = ($clang && $c.target.system == 'win32-msvc')
+
+ sqlite/
+ {
+ c.poptions += \
+ -DSQLITE_ALLOW_ROWID_IN_VIEW=1 \
+ -DSQLITE_ENABLE_COLUMN_METADATA=1 \
+ -DSQLITE_ENABLE_DBPAGE_VTAB=1 \
+ -DSQLITE_ENABLE_DBSTAT_VTAB=1 \
+ -DSQLITE_ENABLE_EXPLAIN_COMMENTS=1 \
+ -DSQLITE_ENABLE_FTS3=1 \
+ -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 \
+ -DSQLITE_ENABLE_FTS3_TOKENIZER=1 \
+ -DSQLITE_ENABLE_FTS4=1 \
+ -DSQLITE_ENABLE_FTS5=1 \
+ -DSQLITE_ENABLE_GEOPOLY=1 \
+ -DSQLITE_ENABLE_JSON1=1 \
+ -DSQLITE_ENABLE_LOAD_EXTENSION=1 \
+ -DSQLITE_ENABLE_MATH_FUNCTIONS=1 \
+ -DSQLITE_ENABLE_PREUPDATE_HOOK=1 \
+ -DSQLITE_ENABLE_RTREE=1 \
+ -DSQLITE_ENABLE_SESSION=1 \
+ -DSQLITE_ENABLE_STMTVTAB=1 \
+ -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 \
+ -DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 \
+ -DSQLITE_MAX_SCHEMA_RETRY=25 \
+ -DSQLITE_MAX_VARIABLE_NUMBER=250000 \
+ -DSQLITE_OMIT_LOOKASIDE=1 \
+ -DSQLITE_SECURE_DELETE=1 \
+ -DSQLITE_SOUNDEX=1 \
+ -DSQLITE_THREADSAFE=0 \
+ -DSQLITE_USE_URI=1 \
+ -DSQLITE_OMIT_SHARED_CACHE=1
+
+ c.poptions += -DSQLITE_MAX_ATTACHED=125
+
+ if! $windows
+ c.poptions += -DHAVE_USLEEP=1
+
+ if $gcc
+ c.coptions += -fno-strict-aliasing
+
+ if $clang_msvc
+ c.coptions += -Wno-deprecated-declarations
+
+ if ($clang && $c.version.major >= 15)
+ c.coptions += -Wno-unused-but-set-variable
+
+ if $gcc
+ c.coptions += -Wno-unused-variable -Wno-extra -Wno-error
+ }
+
+ if! $windows
+ {
+ cxx.libs += -lm
+
+ if! $bsd
+ cxx.libs += -ldl
+ }
+}
+
+# Export options.
+#
+lib{butl-odb}:
+{
+ cxx.export.poptions = "-I$src_base" -DODB_THREADS_NONE
+ cxx.export.libs = $intf_libs
+}
+
+liba{butl-odb}: cxx.export.poptions += -DLIBODB_STATIC -DLIBODB_SQLITE_STATIC
+libs{butl-odb}: cxx.export.poptions += -DLIBODB_SHARED -DLIBODB_SQLITE_SHARED
+
+if! $sys_sqlite
+{
+ lib{butl-odb}: cc.export.poptions = "-I($src_base/sqlite)"
+
+ if $windows
+ libs{butl-odb}: cc.export.poptions += '-DSQLITE_API=__declspec(dllimport)'
+}
+
+# For pre-releases use the complete version to make sure they cannot be used
+# in place of another pre-release or the final version. See the version module
+# for details on the version.* variable values.
+#
+if $version.pre_release
+ lib{butl-odb}: bin.lib.version = @"-$version.project_id"
+else
+ lib{butl-odb}: bin.lib.version = @"-$version.major.$version.minor"
+
+# Install into the libbutl/odb/ subdirectory of, say, /usr/include/. For odb/,
+# recreate subdirectories (so we end up with libbutl/odb/odb/...>). For
+# sqlite/, install directly into libbutl/odb/. Arrange via pkg-config to be
+# able to include ODB headers as <odb/...> and SQLite as just <sqlite3.h>.
+#
+# The reason we add an extra odb/ subdirectory instead of installing directly
+# into libbutl/ is because adding -I for libbutl/ will make all the libbutl
+# headers includable without a prefix and thus prone to clashes.
+#
+odb/{h hxx ixx txx}{*}:
+{
+ install = include/libbutl/odb/odb/
+ install.subdirs = true
+}
+
+sqlite/h{*}: install = include/libbutl/odb/
+
+lib{butl-odb}: cxx.pkgconfig.include = include/libbutl/odb/
diff --git a/libbutl-odb/odb/c-array-traits.hxx b/libbutl-odb/odb/c-array-traits.hxx
new file mode 120000
index 0000000..112e8bc
--- /dev/null
+++ b/libbutl-odb/odb/c-array-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/c-array-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/cache-traits.hxx b/libbutl-odb/odb/cache-traits.hxx
new file mode 120000
index 0000000..73c5fbf
--- /dev/null
+++ b/libbutl-odb/odb/cache-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/cache-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/callback.hxx b/libbutl-odb/odb/callback.hxx
new file mode 120000
index 0000000..1144ff5
--- /dev/null
+++ b/libbutl-odb/odb/callback.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/callback.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/connection.cxx b/libbutl-odb/odb/connection.cxx
new file mode 120000
index 0000000..89f6c19
--- /dev/null
+++ b/libbutl-odb/odb/connection.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/connection.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/connection.hxx b/libbutl-odb/odb/connection.hxx
new file mode 120000
index 0000000..cc8a0a5
--- /dev/null
+++ b/libbutl-odb/odb/connection.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/connection.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/connection.ixx b/libbutl-odb/odb/connection.ixx
new file mode 120000
index 0000000..bc1cfb0
--- /dev/null
+++ b/libbutl-odb/odb/connection.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/connection.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/connection.txx b/libbutl-odb/odb/connection.txx
new file mode 120000
index 0000000..37e8e2e
--- /dev/null
+++ b/libbutl-odb/odb/connection.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/connection.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/container-traits.hxx b/libbutl-odb/odb/container-traits.hxx
new file mode 120000
index 0000000..d71c3e7
--- /dev/null
+++ b/libbutl-odb/odb/container-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/container-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/core.hxx b/libbutl-odb/odb/core.hxx
new file mode 120000
index 0000000..f59ab1c
--- /dev/null
+++ b/libbutl-odb/odb/core.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/core.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/database.cxx b/libbutl-odb/odb/database.cxx
new file mode 120000
index 0000000..11e9538
--- /dev/null
+++ b/libbutl-odb/odb/database.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/database.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/database.hxx b/libbutl-odb/odb/database.hxx
new file mode 120000
index 0000000..0def196
--- /dev/null
+++ b/libbutl-odb/odb/database.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/database.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/database.ixx b/libbutl-odb/odb/database.ixx
new file mode 120000
index 0000000..f3a769b
--- /dev/null
+++ b/libbutl-odb/odb/database.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/database.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/database.txx b/libbutl-odb/odb/database.txx
new file mode 120000
index 0000000..9d439a5
--- /dev/null
+++ b/libbutl-odb/odb/database.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/database.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/buffer.cxx b/libbutl-odb/odb/details/buffer.cxx
new file mode 120000
index 0000000..6af5fbc
--- /dev/null
+++ b/libbutl-odb/odb/details/buffer.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/buffer.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/buffer.hxx b/libbutl-odb/odb/details/buffer.hxx
new file mode 120000
index 0000000..a05e24f
--- /dev/null
+++ b/libbutl-odb/odb/details/buffer.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/buffer.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/c-string.hxx b/libbutl-odb/odb/details/c-string.hxx
new file mode 120000
index 0000000..6e1cd46
--- /dev/null
+++ b/libbutl-odb/odb/details/c-string.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/c-string.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/condition.hxx b/libbutl-odb/odb/details/condition.hxx
new file mode 120000
index 0000000..80ddb83
--- /dev/null
+++ b/libbutl-odb/odb/details/condition.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/condition.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/config-vc.h b/libbutl-odb/odb/details/config-vc.h
new file mode 120000
index 0000000..2e879c9
--- /dev/null
+++ b/libbutl-odb/odb/details/config-vc.h
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/config-vc.h \ No newline at end of file
diff --git a/libbutl-odb/odb/details/config.h b/libbutl-odb/odb/details/config.h
new file mode 120000
index 0000000..8fc2729
--- /dev/null
+++ b/libbutl-odb/odb/details/config.h
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/config.h \ No newline at end of file
diff --git a/libbutl-odb/odb/details/config.hxx b/libbutl-odb/odb/details/config.hxx
new file mode 120000
index 0000000..16ad4db
--- /dev/null
+++ b/libbutl-odb/odb/details/config.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/config.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/exception.hxx b/libbutl-odb/odb/details/exception.hxx
new file mode 120000
index 0000000..41e9c35
--- /dev/null
+++ b/libbutl-odb/odb/details/exception.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/exception.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/export.hxx b/libbutl-odb/odb/details/export.hxx
new file mode 120000
index 0000000..ddbd800
--- /dev/null
+++ b/libbutl-odb/odb/details/export.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/export.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/function-wrapper.hxx b/libbutl-odb/odb/details/function-wrapper.hxx
new file mode 120000
index 0000000..94b8f9e
--- /dev/null
+++ b/libbutl-odb/odb/details/function-wrapper.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/function-wrapper.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/function-wrapper.ixx b/libbutl-odb/odb/details/function-wrapper.ixx
new file mode 120000
index 0000000..05ec736
--- /dev/null
+++ b/libbutl-odb/odb/details/function-wrapper.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/function-wrapper.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/function-wrapper.txx b/libbutl-odb/odb/details/function-wrapper.txx
new file mode 120000
index 0000000..4e33625
--- /dev/null
+++ b/libbutl-odb/odb/details/function-wrapper.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/function-wrapper.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/lock.hxx b/libbutl-odb/odb/details/lock.hxx
new file mode 120000
index 0000000..4099cee
--- /dev/null
+++ b/libbutl-odb/odb/details/lock.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/lock.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/meta b/libbutl-odb/odb/details/meta
new file mode 120000
index 0000000..c12653e
--- /dev/null
+++ b/libbutl-odb/odb/details/meta
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/meta \ No newline at end of file
diff --git a/libbutl-odb/odb/details/mutex.hxx b/libbutl-odb/odb/details/mutex.hxx
new file mode 120000
index 0000000..7bae0aa
--- /dev/null
+++ b/libbutl-odb/odb/details/mutex.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/mutex.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/shared-ptr b/libbutl-odb/odb/details/shared-ptr
new file mode 120000
index 0000000..591da08
--- /dev/null
+++ b/libbutl-odb/odb/details/shared-ptr
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/shared-ptr \ No newline at end of file
diff --git a/libbutl-odb/odb/details/shared-ptr-fwd.hxx b/libbutl-odb/odb/details/shared-ptr-fwd.hxx
new file mode 120000
index 0000000..21e771e
--- /dev/null
+++ b/libbutl-odb/odb/details/shared-ptr-fwd.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/shared-ptr-fwd.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/shared-ptr.hxx b/libbutl-odb/odb/details/shared-ptr.hxx
new file mode 120000
index 0000000..871bd50
--- /dev/null
+++ b/libbutl-odb/odb/details/shared-ptr.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/shared-ptr.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/thread.hxx b/libbutl-odb/odb/details/thread.hxx
new file mode 120000
index 0000000..9e3a478
--- /dev/null
+++ b/libbutl-odb/odb/details/thread.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/thread.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/tls.hxx b/libbutl-odb/odb/details/tls.hxx
new file mode 120000
index 0000000..72e1d04
--- /dev/null
+++ b/libbutl-odb/odb/details/tls.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/tls.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/transfer-ptr.hxx b/libbutl-odb/odb/details/transfer-ptr.hxx
new file mode 120000
index 0000000..360e1b9
--- /dev/null
+++ b/libbutl-odb/odb/details/transfer-ptr.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/transfer-ptr.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/type-info.hxx b/libbutl-odb/odb/details/type-info.hxx
new file mode 120000
index 0000000..c0aadef
--- /dev/null
+++ b/libbutl-odb/odb/details/type-info.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/type-info.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/unique-ptr.hxx b/libbutl-odb/odb/details/unique-ptr.hxx
new file mode 120000
index 0000000..63cf03a
--- /dev/null
+++ b/libbutl-odb/odb/details/unique-ptr.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/unique-ptr.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/unused.hxx b/libbutl-odb/odb/details/unused.hxx
new file mode 120000
index 0000000..d2d3488
--- /dev/null
+++ b/libbutl-odb/odb/details/unused.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/unused.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/win32/windows.hxx b/libbutl-odb/odb/details/win32/windows.hxx
new file mode 120000
index 0000000..9c1ebea
--- /dev/null
+++ b/libbutl-odb/odb/details/win32/windows.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb/odb/details/win32/windows.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/details/wrapper-p.hxx b/libbutl-odb/odb/details/wrapper-p.hxx
new file mode 120000
index 0000000..a8389ae
--- /dev/null
+++ b/libbutl-odb/odb/details/wrapper-p.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb/odb/details/wrapper-p.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/exception.hxx b/libbutl-odb/odb/exception.hxx
new file mode 120000
index 0000000..e7f27bc
--- /dev/null
+++ b/libbutl-odb/odb/exception.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/exception.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/exceptions.cxx b/libbutl-odb/odb/exceptions.cxx
new file mode 120000
index 0000000..7d6764e
--- /dev/null
+++ b/libbutl-odb/odb/exceptions.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/exceptions.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/exceptions.hxx b/libbutl-odb/odb/exceptions.hxx
new file mode 120000
index 0000000..29476de
--- /dev/null
+++ b/libbutl-odb/odb/exceptions.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/exceptions.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/forward.hxx b/libbutl-odb/odb/forward.hxx
new file mode 120000
index 0000000..fce7288
--- /dev/null
+++ b/libbutl-odb/odb/forward.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/forward.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/function-table.hxx b/libbutl-odb/odb/function-table.hxx
new file mode 120000
index 0000000..be670b3
--- /dev/null
+++ b/libbutl-odb/odb/function-table.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/function-table.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-pointer-traits.hxx b/libbutl-odb/odb/lazy-pointer-traits.hxx
new file mode 120000
index 0000000..40886bb
--- /dev/null
+++ b/libbutl-odb/odb/lazy-pointer-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-pointer-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr-impl.hxx b/libbutl-odb/odb/lazy-ptr-impl.hxx
new file mode 120000
index 0000000..d6ebbf9
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr-impl.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr-impl.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr-impl.ixx b/libbutl-odb/odb/lazy-ptr-impl.ixx
new file mode 120000
index 0000000..d1e4d67
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr-impl.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr-impl.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr-impl.txx b/libbutl-odb/odb/lazy-ptr-impl.txx
new file mode 120000
index 0000000..d32a56c
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr-impl.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr-impl.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr.hxx b/libbutl-odb/odb/lazy-ptr.hxx
new file mode 120000
index 0000000..4ec473c
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr.ixx b/libbutl-odb/odb/lazy-ptr.ixx
new file mode 120000
index 0000000..990c6df
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/lazy-ptr.txx b/libbutl-odb/odb/lazy-ptr.txx
new file mode 120000
index 0000000..7d13166
--- /dev/null
+++ b/libbutl-odb/odb/lazy-ptr.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/lazy-ptr.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/nested-container.hxx b/libbutl-odb/odb/nested-container.hxx
new file mode 120000
index 0000000..6204ec6
--- /dev/null
+++ b/libbutl-odb/odb/nested-container.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/nested-container.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/no-id-object-result.hxx b/libbutl-odb/odb/no-id-object-result.hxx
new file mode 120000
index 0000000..a4feda3
--- /dev/null
+++ b/libbutl-odb/odb/no-id-object-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/no-id-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/no-id-object-result.txx b/libbutl-odb/odb/no-id-object-result.txx
new file mode 120000
index 0000000..73def1a
--- /dev/null
+++ b/libbutl-odb/odb/no-id-object-result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/no-id-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/no-op-cache-traits.hxx b/libbutl-odb/odb/no-op-cache-traits.hxx
new file mode 120000
index 0000000..c1ab173
--- /dev/null
+++ b/libbutl-odb/odb/no-op-cache-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/no-op-cache-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/nullable.hxx b/libbutl-odb/odb/nullable.hxx
new file mode 120000
index 0000000..be1e9ec
--- /dev/null
+++ b/libbutl-odb/odb/nullable.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/nullable.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/object-result.hxx b/libbutl-odb/odb/object-result.hxx
new file mode 120000
index 0000000..6fc617c
--- /dev/null
+++ b/libbutl-odb/odb/object-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/pointer-traits.hxx b/libbutl-odb/odb/pointer-traits.hxx
new file mode 120000
index 0000000..4d7924f
--- /dev/null
+++ b/libbutl-odb/odb/pointer-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/pointer-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-info.hxx b/libbutl-odb/odb/polymorphic-info.hxx
new file mode 120000
index 0000000..a6d2468
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-info.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-info.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-map.hxx b/libbutl-odb/odb/polymorphic-map.hxx
new file mode 120000
index 0000000..b92e037
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-map.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-map.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-map.ixx b/libbutl-odb/odb/polymorphic-map.ixx
new file mode 120000
index 0000000..ad9ad3f
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-map.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-map.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-map.txx b/libbutl-odb/odb/polymorphic-map.txx
new file mode 120000
index 0000000..ff264dc
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-map.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-map.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-object-result.hxx b/libbutl-odb/odb/polymorphic-object-result.hxx
new file mode 120000
index 0000000..5482901
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-object-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/polymorphic-object-result.txx b/libbutl-odb/odb/polymorphic-object-result.txx
new file mode 120000
index 0000000..b935bb4
--- /dev/null
+++ b/libbutl-odb/odb/polymorphic-object-result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/polymorphic-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/post.hxx b/libbutl-odb/odb/post.hxx
new file mode 120000
index 0000000..64aba2c
--- /dev/null
+++ b/libbutl-odb/odb/post.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/post.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/pre.hxx b/libbutl-odb/odb/pre.hxx
new file mode 120000
index 0000000..f1acec8
--- /dev/null
+++ b/libbutl-odb/odb/pre.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/pre.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/prepared-query.cxx b/libbutl-odb/odb/prepared-query.cxx
new file mode 120000
index 0000000..02adc31
--- /dev/null
+++ b/libbutl-odb/odb/prepared-query.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/prepared-query.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/prepared-query.hxx b/libbutl-odb/odb/prepared-query.hxx
new file mode 120000
index 0000000..a512cbb
--- /dev/null
+++ b/libbutl-odb/odb/prepared-query.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/prepared-query.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/query-dynamic.cxx b/libbutl-odb/odb/query-dynamic.cxx
new file mode 120000
index 0000000..9d09183
--- /dev/null
+++ b/libbutl-odb/odb/query-dynamic.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query-dynamic.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/query-dynamic.hxx b/libbutl-odb/odb/query-dynamic.hxx
new file mode 120000
index 0000000..742ee6e
--- /dev/null
+++ b/libbutl-odb/odb/query-dynamic.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query-dynamic.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/query-dynamic.ixx b/libbutl-odb/odb/query-dynamic.ixx
new file mode 120000
index 0000000..1857aac
--- /dev/null
+++ b/libbutl-odb/odb/query-dynamic.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query-dynamic.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/query-dynamic.txx b/libbutl-odb/odb/query-dynamic.txx
new file mode 120000
index 0000000..6f3d196
--- /dev/null
+++ b/libbutl-odb/odb/query-dynamic.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query-dynamic.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/query.hxx b/libbutl-odb/odb/query.hxx
new file mode 120000
index 0000000..1012caa
--- /dev/null
+++ b/libbutl-odb/odb/query.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/query.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/result.cxx b/libbutl-odb/odb/result.cxx
new file mode 120000
index 0000000..1a4accb
--- /dev/null
+++ b/libbutl-odb/odb/result.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/result.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/result.hxx b/libbutl-odb/odb/result.hxx
new file mode 120000
index 0000000..19ecb55
--- /dev/null
+++ b/libbutl-odb/odb/result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/result.txx b/libbutl-odb/odb/result.txx
new file mode 120000
index 0000000..c19db9b
--- /dev/null
+++ b/libbutl-odb/odb/result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/schema-catalog-impl.hxx b/libbutl-odb/odb/schema-catalog-impl.hxx
new file mode 120000
index 0000000..46b2940
--- /dev/null
+++ b/libbutl-odb/odb/schema-catalog-impl.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/schema-catalog-impl.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/schema-catalog.cxx b/libbutl-odb/odb/schema-catalog.cxx
new file mode 120000
index 0000000..6489260
--- /dev/null
+++ b/libbutl-odb/odb/schema-catalog.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/schema-catalog.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/schema-catalog.hxx b/libbutl-odb/odb/schema-catalog.hxx
new file mode 120000
index 0000000..3eac326
--- /dev/null
+++ b/libbutl-odb/odb/schema-catalog.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/schema-catalog.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/schema-version.hxx b/libbutl-odb/odb/schema-version.hxx
new file mode 120000
index 0000000..e151791
--- /dev/null
+++ b/libbutl-odb/odb/schema-version.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/schema-version.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/section.cxx b/libbutl-odb/odb/section.cxx
new file mode 120000
index 0000000..554e98a
--- /dev/null
+++ b/libbutl-odb/odb/section.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/section.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/section.hxx b/libbutl-odb/odb/section.hxx
new file mode 120000
index 0000000..c56cc2b
--- /dev/null
+++ b/libbutl-odb/odb/section.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/section.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/session.cxx b/libbutl-odb/odb/session.cxx
new file mode 120000
index 0000000..4fd4e61
--- /dev/null
+++ b/libbutl-odb/odb/session.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/session.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/session.hxx b/libbutl-odb/odb/session.hxx
new file mode 120000
index 0000000..b614bf3
--- /dev/null
+++ b/libbutl-odb/odb/session.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/session.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/session.ixx b/libbutl-odb/odb/session.ixx
new file mode 120000
index 0000000..8301774
--- /dev/null
+++ b/libbutl-odb/odb/session.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/session.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/session.txx b/libbutl-odb/odb/session.txx
new file mode 120000
index 0000000..78525ff
--- /dev/null
+++ b/libbutl-odb/odb/session.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/session.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/simple-object-result.hxx b/libbutl-odb/odb/simple-object-result.hxx
new file mode 120000
index 0000000..75ff145
--- /dev/null
+++ b/libbutl-odb/odb/simple-object-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/simple-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/simple-object-result.txx b/libbutl-odb/odb/simple-object-result.txx
new file mode 120000
index 0000000..24a73c6
--- /dev/null
+++ b/libbutl-odb/odb/simple-object-result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/simple-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/auto-handle.hxx b/libbutl-odb/odb/sqlite/auto-handle.hxx
new file mode 120000
index 0000000..d2beea3
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/auto-handle.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/auto-handle.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/binding.hxx b/libbutl-odb/odb/sqlite/binding.hxx
new file mode 120000
index 0000000..368fe4f
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/binding.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/binding.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/blob-stream.hxx b/libbutl-odb/odb/sqlite/blob-stream.hxx
new file mode 120000
index 0000000..a669754
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/blob-stream.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/blob-stream.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/blob.hxx b/libbutl-odb/odb/sqlite/blob.hxx
new file mode 120000
index 0000000..39952c3
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/blob.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/blob.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection-factory.cxx b/libbutl-odb/odb/sqlite/connection-factory.cxx
new file mode 120000
index 0000000..24bc557
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection-factory.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection-factory.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection-factory.hxx b/libbutl-odb/odb/sqlite/connection-factory.hxx
new file mode 120000
index 0000000..a0628ec
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection-factory.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection-factory.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection.cxx b/libbutl-odb/odb/sqlite/connection.cxx
new file mode 120000
index 0000000..ab9dac9
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection.hxx b/libbutl-odb/odb/sqlite/connection.hxx
new file mode 120000
index 0000000..b191dcf
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/connection.ixx b/libbutl-odb/odb/sqlite/connection.ixx
new file mode 120000
index 0000000..d46f148
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/connection.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/connection.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/container-statements.hxx b/libbutl-odb/odb/sqlite/container-statements.hxx
new file mode 120000
index 0000000..bd7fe17
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/container-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/container-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/container-statements.txx b/libbutl-odb/odb/sqlite/container-statements.txx
new file mode 120000
index 0000000..6fc9bef
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/container-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/container-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/database.cxx b/libbutl-odb/odb/sqlite/database.cxx
new file mode 120000
index 0000000..d8e8079
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/database.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/database.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/database.hxx b/libbutl-odb/odb/sqlite/database.hxx
new file mode 120000
index 0000000..008d1fc
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/database.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/database.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/database.ixx b/libbutl-odb/odb/sqlite/database.ixx
new file mode 120000
index 0000000..52a723c
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/database.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/database.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/config.hxx b/libbutl-odb/odb/sqlite/details/config.hxx
new file mode 120000
index 0000000..ba48e30
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/config.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/config.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/conversion.hxx b/libbutl-odb/odb/sqlite/details/conversion.hxx
new file mode 120000
index 0000000..41e31b4
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/conversion.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/conversion.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/export.hxx b/libbutl-odb/odb/sqlite/details/export.hxx
new file mode 120000
index 0000000..22a9ea3
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/export.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/export.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/options.cxx b/libbutl-odb/odb/sqlite/details/options.cxx
new file mode 120000
index 0000000..61950de
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/options.cxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/pregenerated/odb/sqlite/details/options.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/options.hxx b/libbutl-odb/odb/sqlite/details/options.hxx
new file mode 120000
index 0000000..7e674dd
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/options.hxx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/pregenerated/odb/sqlite/details/options.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/details/options.ixx b/libbutl-odb/odb/sqlite/details/options.ixx
new file mode 120000
index 0000000..f562a57
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/details/options.ixx
@@ -0,0 +1 @@
+../../../../upstream/odb/libodb-sqlite/odb/sqlite/details/pregenerated/odb/sqlite/details/options.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/error.cxx b/libbutl-odb/odb/sqlite/error.cxx
new file mode 120000
index 0000000..1bfc433
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/error.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/error.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/error.hxx b/libbutl-odb/odb/sqlite/error.hxx
new file mode 120000
index 0000000..c82f49f
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/error.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/error.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/exceptions.cxx b/libbutl-odb/odb/sqlite/exceptions.cxx
new file mode 120000
index 0000000..b49ae98
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/exceptions.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/exceptions.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/exceptions.hxx b/libbutl-odb/odb/sqlite/exceptions.hxx
new file mode 120000
index 0000000..ada5548
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/exceptions.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/exceptions.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/forward.hxx b/libbutl-odb/odb/sqlite/forward.hxx
new file mode 120000
index 0000000..a9b323c
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/forward.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/forward.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/no-id-object-result.hxx b/libbutl-odb/odb/sqlite/no-id-object-result.hxx
new file mode 120000
index 0000000..07ff3bd
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/no-id-object-result.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/no-id-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/no-id-object-result.txx b/libbutl-odb/odb/sqlite/no-id-object-result.txx
new file mode 120000
index 0000000..c20e86e
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/no-id-object-result.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/no-id-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/no-id-object-statements.hxx b/libbutl-odb/odb/sqlite/no-id-object-statements.hxx
new file mode 120000
index 0000000..572080c
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/no-id-object-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/no-id-object-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/no-id-object-statements.txx b/libbutl-odb/odb/sqlite/no-id-object-statements.txx
new file mode 120000
index 0000000..51bb914
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/no-id-object-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/no-id-object-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/polymorphic-object-result.hxx b/libbutl-odb/odb/sqlite/polymorphic-object-result.hxx
new file mode 120000
index 0000000..fe429c2
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/polymorphic-object-result.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/polymorphic-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/polymorphic-object-result.txx b/libbutl-odb/odb/sqlite/polymorphic-object-result.txx
new file mode 120000
index 0000000..e856368
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/polymorphic-object-result.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/polymorphic-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/polymorphic-object-statements.hxx b/libbutl-odb/odb/sqlite/polymorphic-object-statements.hxx
new file mode 120000
index 0000000..b3e8263
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/polymorphic-object-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/polymorphic-object-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/polymorphic-object-statements.txx b/libbutl-odb/odb/sqlite/polymorphic-object-statements.txx
new file mode 120000
index 0000000..ef05814
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/polymorphic-object-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/polymorphic-object-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/prepared-query.cxx b/libbutl-odb/odb/sqlite/prepared-query.cxx
new file mode 120000
index 0000000..3fce056
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/prepared-query.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/prepared-query.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/prepared-query.hxx b/libbutl-odb/odb/sqlite/prepared-query.hxx
new file mode 120000
index 0000000..585424d
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/prepared-query.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/prepared-query.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-const-expr.cxx b/libbutl-odb/odb/sqlite/query-const-expr.cxx
new file mode 120000
index 0000000..a37dc67
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-const-expr.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-const-expr.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-dynamic.cxx b/libbutl-odb/odb/sqlite/query-dynamic.cxx
new file mode 120000
index 0000000..0e7b56c
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-dynamic.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-dynamic.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-dynamic.hxx b/libbutl-odb/odb/sqlite/query-dynamic.hxx
new file mode 120000
index 0000000..11158d4
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-dynamic.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-dynamic.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-dynamic.ixx b/libbutl-odb/odb/sqlite/query-dynamic.ixx
new file mode 120000
index 0000000..babc299
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-dynamic.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-dynamic.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query-dynamic.txx b/libbutl-odb/odb/sqlite/query-dynamic.txx
new file mode 120000
index 0000000..6f3cb12
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query-dynamic.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query-dynamic.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query.cxx b/libbutl-odb/odb/sqlite/query.cxx
new file mode 120000
index 0000000..9237561
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query.hxx b/libbutl-odb/odb/sqlite/query.hxx
new file mode 120000
index 0000000..c0cb9b4
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query.ixx b/libbutl-odb/odb/sqlite/query.ixx
new file mode 120000
index 0000000..9d38832
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/query.txx b/libbutl-odb/odb/sqlite/query.txx
new file mode 120000
index 0000000..05c6033
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/query.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/query.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/section-statements.hxx b/libbutl-odb/odb/sqlite/section-statements.hxx
new file mode 120000
index 0000000..6edc0d5
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/section-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/section-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/section-statements.txx b/libbutl-odb/odb/sqlite/section-statements.txx
new file mode 120000
index 0000000..699c6b8
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/section-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/section-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-result.hxx b/libbutl-odb/odb/sqlite/simple-object-result.hxx
new file mode 120000
index 0000000..9bed959
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-result.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-result.txx b/libbutl-odb/odb/sqlite/simple-object-result.txx
new file mode 120000
index 0000000..7dbb9d1
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-result.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-statements.cxx b/libbutl-odb/odb/sqlite/simple-object-statements.cxx
new file mode 120000
index 0000000..fe37130
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-statements.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-statements.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-statements.hxx b/libbutl-odb/odb/sqlite/simple-object-statements.hxx
new file mode 120000
index 0000000..dbf222b
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-statements.ixx b/libbutl-odb/odb/sqlite/simple-object-statements.ixx
new file mode 120000
index 0000000..863b920
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-statements.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-statements.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/simple-object-statements.txx b/libbutl-odb/odb/sqlite/simple-object-statements.txx
new file mode 120000
index 0000000..8a3bcc7
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/simple-object-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/simple-object-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/sqlite-types.hxx b/libbutl-odb/odb/sqlite/sqlite-types.hxx
new file mode 120000
index 0000000..dda05ff
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/sqlite-types.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/sqlite-types.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statement-cache.hxx b/libbutl-odb/odb/sqlite/statement-cache.hxx
new file mode 120000
index 0000000..0ef7a98
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statement-cache.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statement-cache.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statement-cache.txx b/libbutl-odb/odb/sqlite/statement-cache.txx
new file mode 120000
index 0000000..d945fe2
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statement-cache.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statement-cache.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statement.cxx b/libbutl-odb/odb/sqlite/statement.cxx
new file mode 120000
index 0000000..e84cbae
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statement.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statement.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statement.hxx b/libbutl-odb/odb/sqlite/statement.hxx
new file mode 120000
index 0000000..40c7e11
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statement.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statement.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statements-base.cxx b/libbutl-odb/odb/sqlite/statements-base.cxx
new file mode 120000
index 0000000..5cbbd29
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statements-base.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statements-base.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/statements-base.hxx b/libbutl-odb/odb/sqlite/statements-base.hxx
new file mode 120000
index 0000000..022238e
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/statements-base.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/statements-base.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/stream.cxx b/libbutl-odb/odb/sqlite/stream.cxx
new file mode 120000
index 0000000..43d8e7a
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/stream.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/stream.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/stream.hxx b/libbutl-odb/odb/sqlite/stream.hxx
new file mode 120000
index 0000000..4d8f752
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/stream.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/stream.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/text-stream.hxx b/libbutl-odb/odb/sqlite/text-stream.hxx
new file mode 120000
index 0000000..5dfb71b
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/text-stream.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/text-stream.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/text.hxx b/libbutl-odb/odb/sqlite/text.hxx
new file mode 120000
index 0000000..d214506
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/text.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/text.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/tracer.cxx b/libbutl-odb/odb/sqlite/tracer.cxx
new file mode 120000
index 0000000..eb1a179
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/tracer.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/tracer.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/tracer.hxx b/libbutl-odb/odb/sqlite/tracer.hxx
new file mode 120000
index 0000000..1bf3209
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/tracer.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/tracer.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/traits-calls.hxx b/libbutl-odb/odb/sqlite/traits-calls.hxx
new file mode 120000
index 0000000..d736213
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/traits-calls.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/traits-calls.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/traits.cxx b/libbutl-odb/odb/sqlite/traits.cxx
new file mode 120000
index 0000000..71c2b15
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/traits.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/traits.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/traits.hxx b/libbutl-odb/odb/sqlite/traits.hxx
new file mode 120000
index 0000000..0c06d44
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/traits.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction-impl.cxx b/libbutl-odb/odb/sqlite/transaction-impl.cxx
new file mode 120000
index 0000000..006fca5
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction-impl.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction-impl.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction-impl.hxx b/libbutl-odb/odb/sqlite/transaction-impl.hxx
new file mode 120000
index 0000000..c6b5f84
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction-impl.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction-impl.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction.cxx b/libbutl-odb/odb/sqlite/transaction.cxx
new file mode 120000
index 0000000..72946da
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction.cxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction.hxx b/libbutl-odb/odb/sqlite/transaction.hxx
new file mode 120000
index 0000000..1a1b354
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/transaction.ixx b/libbutl-odb/odb/sqlite/transaction.ixx
new file mode 120000
index 0000000..67da3ef
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/transaction.ixx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/transaction.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/version.hxx b/libbutl-odb/odb/sqlite/version.hxx
new file mode 100644
index 0000000..e604c17
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/version.hxx
@@ -0,0 +1,65 @@
+// file : odb/sqlite/version.hxx.in
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef LIBODB_SQLITE_VERSION // Note: using the version macro itself.
+
+// New numeric version format is AAAAABBBBBCCCCCDDDE where:
+//
+// AAAAA - major version number
+// BBBBB - minor version number
+// CCCCC - bugfix version number
+// DDD - alpha / beta (DDD + 500) version number
+// E - final (0) / snapshot (1)
+//
+// When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example:
+//
+// Version AAAAABBBBBCCCCCDDDE
+//
+// 0.1.0 0000000001000000000
+// 0.1.2 0000000001000020000
+// 1.2.3 0000100002000030000
+// 2.2.0-a.1 0000200001999990010
+// 3.0.0-b.2 0000299999999995020
+// 2.2.0-a.1.z 0000200001999990011
+//
+#define LIBODB_SQLITE_VERSION_FULL 200004999995261ULL
+#define LIBODB_SQLITE_VERSION_STR "2.5.0-b.26.20240502090701.7ce5b6d18b67"
+#define LIBODB_SQLITE_VERSION_ID "2.5.0-b.26.7ce5b6d18b67"
+
+#define LIBODB_SQLITE_VERSION_MAJOR 2
+#define LIBODB_SQLITE_VERSION_MINOR 5
+#define LIBODB_SQLITE_VERSION_PATCH 0
+
+#define LIBODB_SQLITE_PRE_RELEASE true
+
+#define LIBODB_SQLITE_SNAPSHOT 20240502090701ULL
+#define LIBODB_SQLITE_SNAPSHOT_ID "7ce5b6d18b67"
+
+#include <odb/version.hxx>
+
+#ifdef LIBODB_VERSION_FULL
+# if !(LIBODB_VERSION_FULL == 200004999995261ULL && LIBODB_SNAPSHOT == 20240502090701ULL)
+# error incompatible libodb version, libodb == 2.5.0-b.26.20240502090701.7ce5b6d18b67 is required
+# endif
+#endif
+
+
+// Old/deprecated numeric version format is AABBCCDD where:
+//
+// AA - major version number
+// BB - minor version number
+// CC - bugfix version number
+// DD - alpha / beta (DD + 50) version number
+//
+// When DD is not 00, 1 is subtracted from AABBCC. For example:
+//
+// Version AABBCCDD
+// 2.0.0 02000000
+// 2.1.0 02010000
+// 2.1.1 02010100
+// 2.2.0.a1 02019901
+// 3.0.0.b2 02999952
+//
+#define LIBODB_SQLITE_VERSION 2049976
+
+#endif // LIBODB_SQLITE_VERSION
diff --git a/libbutl-odb/odb/sqlite/view-result.hxx b/libbutl-odb/odb/sqlite/view-result.hxx
new file mode 120000
index 0000000..bdd35c3
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/view-result.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/view-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/view-result.txx b/libbutl-odb/odb/sqlite/view-result.txx
new file mode 120000
index 0000000..c6219bc
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/view-result.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/view-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/view-statements.hxx b/libbutl-odb/odb/sqlite/view-statements.hxx
new file mode 120000
index 0000000..d0c22cb
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/view-statements.hxx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/view-statements.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/sqlite/view-statements.txx b/libbutl-odb/odb/sqlite/view-statements.txx
new file mode 120000
index 0000000..f522d37
--- /dev/null
+++ b/libbutl-odb/odb/sqlite/view-statements.txx
@@ -0,0 +1 @@
+../../../upstream/odb/libodb-sqlite/odb/sqlite/view-statements.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/statement-processing-common.hxx b/libbutl-odb/odb/statement-processing-common.hxx
new file mode 120000
index 0000000..2a12e3f
--- /dev/null
+++ b/libbutl-odb/odb/statement-processing-common.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/statement-processing-common.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/statement-processing.cxx b/libbutl-odb/odb/statement-processing.cxx
new file mode 120000
index 0000000..2a4d084
--- /dev/null
+++ b/libbutl-odb/odb/statement-processing.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/statement-processing.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/statement.cxx b/libbutl-odb/odb/statement.cxx
new file mode 120000
index 0000000..057d7cf
--- /dev/null
+++ b/libbutl-odb/odb/statement.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/statement.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/statement.hxx b/libbutl-odb/odb/statement.hxx
new file mode 120000
index 0000000..e92cc46
--- /dev/null
+++ b/libbutl-odb/odb/statement.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/statement.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-array-traits.hxx b/libbutl-odb/odb/std-array-traits.hxx
new file mode 120000
index 0000000..308845c
--- /dev/null
+++ b/libbutl-odb/odb/std-array-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-array-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-deque-traits.hxx b/libbutl-odb/odb/std-deque-traits.hxx
new file mode 120000
index 0000000..7ccb3ec
--- /dev/null
+++ b/libbutl-odb/odb/std-deque-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-deque-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-forward-list-traits.hxx b/libbutl-odb/odb/std-forward-list-traits.hxx
new file mode 120000
index 0000000..67c2b47
--- /dev/null
+++ b/libbutl-odb/odb/std-forward-list-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-forward-list-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-list-traits.hxx b/libbutl-odb/odb/std-list-traits.hxx
new file mode 120000
index 0000000..25e8745
--- /dev/null
+++ b/libbutl-odb/odb/std-list-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-list-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-map-traits.hxx b/libbutl-odb/odb/std-map-traits.hxx
new file mode 120000
index 0000000..a1d18e2
--- /dev/null
+++ b/libbutl-odb/odb/std-map-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-map-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-set-traits.hxx b/libbutl-odb/odb/std-set-traits.hxx
new file mode 120000
index 0000000..7106505
--- /dev/null
+++ b/libbutl-odb/odb/std-set-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-set-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-unordered-map-traits.hxx b/libbutl-odb/odb/std-unordered-map-traits.hxx
new file mode 120000
index 0000000..560c9ff
--- /dev/null
+++ b/libbutl-odb/odb/std-unordered-map-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-unordered-map-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-unordered-set-traits.hxx b/libbutl-odb/odb/std-unordered-set-traits.hxx
new file mode 120000
index 0000000..7738e1a
--- /dev/null
+++ b/libbutl-odb/odb/std-unordered-set-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-unordered-set-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/std-vector-traits.hxx b/libbutl-odb/odb/std-vector-traits.hxx
new file mode 120000
index 0000000..f837306
--- /dev/null
+++ b/libbutl-odb/odb/std-vector-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/std-vector-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/tracer.cxx b/libbutl-odb/odb/tracer.cxx
new file mode 120000
index 0000000..403561c
--- /dev/null
+++ b/libbutl-odb/odb/tracer.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/tracer.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/tracer.hxx b/libbutl-odb/odb/tracer.hxx
new file mode 120000
index 0000000..c3ea47c
--- /dev/null
+++ b/libbutl-odb/odb/tracer.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/tracer.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/traits.hxx b/libbutl-odb/odb/traits.hxx
new file mode 120000
index 0000000..d64b1c3
--- /dev/null
+++ b/libbutl-odb/odb/traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/transaction.cxx b/libbutl-odb/odb/transaction.cxx
new file mode 120000
index 0000000..737baca
--- /dev/null
+++ b/libbutl-odb/odb/transaction.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/transaction.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/transaction.hxx b/libbutl-odb/odb/transaction.hxx
new file mode 120000
index 0000000..17d71d9
--- /dev/null
+++ b/libbutl-odb/odb/transaction.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/transaction.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/transaction.ixx b/libbutl-odb/odb/transaction.ixx
new file mode 120000
index 0000000..a54315d
--- /dev/null
+++ b/libbutl-odb/odb/transaction.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/transaction.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-impl.cxx b/libbutl-odb/odb/vector-impl.cxx
new file mode 120000
index 0000000..666ef11
--- /dev/null
+++ b/libbutl-odb/odb/vector-impl.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-impl.cxx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-impl.hxx b/libbutl-odb/odb/vector-impl.hxx
new file mode 120000
index 0000000..1a6d128
--- /dev/null
+++ b/libbutl-odb/odb/vector-impl.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-impl.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-impl.ixx b/libbutl-odb/odb/vector-impl.ixx
new file mode 120000
index 0000000..c432ff8
--- /dev/null
+++ b/libbutl-odb/odb/vector-impl.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-impl.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-traits.hxx b/libbutl-odb/odb/vector-traits.hxx
new file mode 120000
index 0000000..0b52905
--- /dev/null
+++ b/libbutl-odb/odb/vector-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector-traits.txx b/libbutl-odb/odb/vector-traits.txx
new file mode 120000
index 0000000..28991f3
--- /dev/null
+++ b/libbutl-odb/odb/vector-traits.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector-traits.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector.hxx b/libbutl-odb/odb/vector.hxx
new file mode 120000
index 0000000..7e0cb3f
--- /dev/null
+++ b/libbutl-odb/odb/vector.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/vector.ixx b/libbutl-odb/odb/vector.ixx
new file mode 120000
index 0000000..87593d2
--- /dev/null
+++ b/libbutl-odb/odb/vector.ixx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/vector.ixx \ No newline at end of file
diff --git a/libbutl-odb/odb/version.hxx b/libbutl-odb/odb/version.hxx
new file mode 100644
index 0000000..370cda1
--- /dev/null
+++ b/libbutl-odb/odb/version.hxx
@@ -0,0 +1,65 @@
+// file : odb/version.hxx.in
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef LIBODB_VERSION // Note: using the version macro itself.
+
+// New numeric version format is AAAAABBBBBCCCCCDDDE where:
+//
+// AAAAA - major version number
+// BBBBB - minor version number
+// CCCCC - bugfix version number
+// DDD - alpha / beta (DDD + 500) version number
+// E - final (0) / snapshot (1)
+//
+// When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example:
+//
+// Version AAAAABBBBBCCCCCDDDE
+//
+// 0.1.0 0000000001000000000
+// 0.1.2 0000000001000020000
+// 1.2.3 0000100002000030000
+// 2.2.0-a.1 0000200001999990010
+// 3.0.0-b.2 0000299999999995020
+// 2.2.0-a.1.z 0000200001999990011
+//
+#define LIBODB_VERSION_FULL 200004999995261ULL
+#define LIBODB_VERSION_STR "2.5.0-b.26.20240502090701.7ce5b6d18b67"
+#define LIBODB_VERSION_ID "2.5.0-b.26.7ce5b6d18b67"
+
+#define LIBODB_VERSION_MAJOR 2
+#define LIBODB_VERSION_MINOR 5
+#define LIBODB_VERSION_PATCH 0
+
+#define LIBODB_PRE_RELEASE true
+
+#define LIBODB_SNAPSHOT 20240502090701ULL
+#define LIBODB_SNAPSHOT_ID "7ce5b6d18b67"
+
+
+// Old/deprecated numeric version format is AABBCCDD where:
+//
+// AA - major version number
+// BB - minor version number
+// CC - bugfix version number
+// DD - alpha / beta (DD + 50) version number
+//
+// When DD is not 00, 1 is subtracted from AABBCC. For example:
+//
+// Version AABBCCDD
+// 2.0.0 02000000
+// 2.1.0 02010000
+// 2.1.1 02010100
+// 2.2.0.a1 02019901
+// 3.0.0.b2 02999952
+//
+
+// ODB interface version: minor, major, and alpha/beta versions.
+//
+#define ODB_VERSION 20476
+#define ODB_VERSION_STR "2.5-b.26"
+
+// libodb version: interface version plus the bugfix version.
+//
+#define LIBODB_VERSION 2049976
+
+#endif // LIBODB_VERSION
diff --git a/libbutl-odb/odb/view-image.hxx b/libbutl-odb/odb/view-image.hxx
new file mode 120000
index 0000000..8f2aec1
--- /dev/null
+++ b/libbutl-odb/odb/view-image.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/view-image.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/view-result.hxx b/libbutl-odb/odb/view-result.hxx
new file mode 120000
index 0000000..314e6da
--- /dev/null
+++ b/libbutl-odb/odb/view-result.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/view-result.hxx \ No newline at end of file
diff --git a/libbutl-odb/odb/view-result.txx b/libbutl-odb/odb/view-result.txx
new file mode 120000
index 0000000..9e4a6a3
--- /dev/null
+++ b/libbutl-odb/odb/view-result.txx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/view-result.txx \ No newline at end of file
diff --git a/libbutl-odb/odb/wrapper-traits.hxx b/libbutl-odb/odb/wrapper-traits.hxx
new file mode 120000
index 0000000..9641baf
--- /dev/null
+++ b/libbutl-odb/odb/wrapper-traits.hxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb/odb/wrapper-traits.hxx \ No newline at end of file
diff --git a/libbutl-odb/sqlite/sqlite3.c b/libbutl-odb/sqlite/sqlite3.c
new file mode 120000
index 0000000..2aaaa1a
--- /dev/null
+++ b/libbutl-odb/sqlite/sqlite3.c
@@ -0,0 +1 @@
+../../upstream/sqlite/libsqlite3/libsqlite3/sqlite3.c \ No newline at end of file
diff --git a/libbutl-odb/sqlite/sqlite3.h b/libbutl-odb/sqlite/sqlite3.h
new file mode 120000
index 0000000..0e9e0c6
--- /dev/null
+++ b/libbutl-odb/sqlite/sqlite3.h
@@ -0,0 +1 @@
+../../upstream/sqlite/libsqlite3/libsqlite3/sqlite3.h \ No newline at end of file
diff --git a/tests/odb/buildfile b/tests/odb/buildfile
new file mode 100644
index 0000000..c59ab0f
--- /dev/null
+++ b/tests/odb/buildfile
@@ -0,0 +1,6 @@
+# file : tests/odb/buildfile
+# license : MIT; see accompanying LICENSE file
+
+import libs = libbutl%lib{butl-odb}
+
+exe{driver}: {hxx cxx}{*} $libs
diff --git a/tests/odb/driver.cxx b/tests/odb/driver.cxx
new file mode 120000
index 0000000..d880fda
--- /dev/null
+++ b/tests/odb/driver.cxx
@@ -0,0 +1 @@
+../../upstream/odb/libodb-sqlite/tests/basics/driver.cxx \ No newline at end of file