diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index a9b81f0..21c24ed 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -19,18 +19,18 @@ jobs: - runner: macos-latest os: macos-latest arch: arm64 - deployment-target: '11.0' - extensions: pgvector pgvectorscale pgtextsearch pg_duckdb + deployment-target: '26.0' + extensions: pgvector pgvectorscale pgtextsearch pg_duckdb pgsql_http - runner: ubuntu-latest os: ubuntu-latest arch: x86_64 deployment-target: '' - extensions: pgvector pgvectorscale pgtextsearch pg_duckdb + extensions: pgvector pgvectorscale pgtextsearch pg_duckdb pgsql_http - runner: ubuntu-24.04-arm os: ubuntu-latest arch: aarch64 deployment-target: '' - extensions: pgvector pgvectorscale pgtextsearch pg_duckdb + extensions: pgvector pgvectorscale pgtextsearch pg_duckdb pgsql_http - runner: windows-2022 os: windows-2022 arch: AMD64 @@ -88,8 +88,8 @@ jobs: - name: Install Rust if: matrix.os != 'ubuntu-latest' run: | - rustup install 1.88.0 - rustup default 1.88.0 + rustup install 1.89.0 + rustup default 1.89.0 - name: Install ccache if: matrix.os != 'ubuntu-latest' shell: bash @@ -168,9 +168,9 @@ jobs: apt-get install -y ccache jq gcc libssl-dev llvm-dev clang-dev pkg-config apt-get install -y cmake ninja-build liblz4-dev libcurl4-openssl-dev libglib2.0-dev fi - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.88.0 + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.89.0 export PATH="$HOME/.cargo/bin:/usr/lib/ccache:$PATH" - rustup default 1.88.0 + rustup default 1.89.0 cargo install cargo-pgrx --version 0.16.1 --locked if command -v ldd &> /dev/null && ldd --version 2>&1 | grep -qi musl; then export IS_MUSL=1 @@ -189,7 +189,7 @@ jobs: CIBW_ENVIRONMENT_LINUX: PATH="$HOME/.cargo/bin:$PATH:/project/src/pgembed/pginstall/bin" CIBW_ENVIRONMENT_MUSLLINUX: LIBCLANG_STATIC_PATH=/usr/lib CIBW_ENVIRONMENT_MANYLINUX: LIBCLANG_PATH=/usr/lib64 - CIBW_ENVIRONMENT_MACOS: PATH="$PWD/src/pgembed/pginstall/bin:$HOME/.cargo/bin:/opt/homebrew/opt/ccache/bin:$PATH" LDFLAGS="-L/opt/homebrew/lib -lssl -lcrypto" MACOSX_DEPLOYMENT_TARGET=15.0 BINDGEN_EXTRA_CLANG_ARGS="$(pg_config --cppflags) -I$(xcrun --show-sdk-path)/usr/include -I/opt/homebrew/include" + CIBW_ENVIRONMENT_MACOS: PATH="$PWD/src/pgembed/pginstall/bin:$HOME/.cargo/bin:/opt/homebrew/opt/ccache/bin:$PATH" LDFLAGS="-L/opt/homebrew/lib -lssl -lcrypto" MACOSX_DEPLOYMENT_TARGET=26.0 BINDGEN_EXTRA_CLANG_ARGS="$(pg_config --cppflags) -I$(xcrun --show-sdk-path)/usr/include -I/opt/homebrew/include" CIBW_TEST_COMMAND_WINDOWS: true # Tests disabled pending issues with executing binaries built CIBW_ENVIRONMENT_WINDOWS: PATH="$PWD\\src\\pgembed\\pginstall\\bin;$USERPROFILE\\.cargo\\bin;C:\\ProgramData\\chocolatey\\lib\\ccache\\tools\\ccache-AMD64-windows;$PATH" LIBCLANG_PATH="C:\\Program Files\\LLVM\\bin" MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deployment-target }} diff --git a/pgbuild/Makefile b/pgbuild/Makefile index 43ce2ed..99dd39a 100644 --- a/pgbuild/Makefile +++ b/pgbuild/Makefile @@ -19,9 +19,9 @@ else endif ifeq ($(RUST_EXTENSIONS_SUPPORTED),1) -EXTENSIONS ?= pgvector pgvectorscale pgtextsearch +EXTENSIONS ?= pgvector pgvectorscale pgtextsearch else -EXTENSIONS ?= pgvector +EXTENSIONS ?= pgvector pgsql_http endif ifneq ($(OS),Windows_NT) EXTENSIONS ?= $(EXTENSIONS) pg_duckdb @@ -41,12 +41,13 @@ EXTENSIONS := $(filter-out $(UNSUPPORTED_EXTENSIONS),$(REQUESTED_EXTENSIONS)) .PHONY: all all: postgres $(EXTENSIONS) -.PHONY: pgvector pgvectorscale pgtextsearch pg_search pg_duckdb +.PHONY: pgvector pgvectorscale pgtextsearch pg_search pg_duckdb pgsql_http pgvector: postgres $(INSTALL_PREFIX)/lib/vector.so pgvectorscale: postgres $(INSTALL_PREFIX)/lib/vectorscale.so pgtextsearch: postgres $(INSTALL_PREFIX)/lib/pg_textsearch.so pg_search: postgres $(INSTALL_PREFIX)/lib/pg_search.so pg_duckdb: postgres $(INSTALL_PREFIX)/lib/pg_duckdb.so +pgsql_http: postgres $(INSTALL_PREFIX)/lib/http.so ### postgres POSTGRES_VERSION := 17-stable @@ -97,6 +98,23 @@ $(INSTALL_PREFIX)/lib/vector.so: $(PGVECTOR_DIR)/Makefile $(INSTALL_PREFIX)/bin/ && $(MAKE) -C $(PGVECTOR_DIR) PG_CONFIG=$(INSTALL_PREFIX)/bin/pg_config$(EXE_EXT) -j \ && $(MAKE) -C $(PGVECTOR_DIR) PG_CONFIG=$(INSTALL_PREFIX)/bin/pg_config$(EXE_EXT) install +### pgsql_http +PGSQL_HTTP_TAG := v1.7.2 +PGSQL_HTTP_URL := https://github.com/pramsey/pgsql-http/archive/refs/tags/$(PGSQL_HTTP_TAG).tar.gz +PGSQL_HTTP_DIR := pgsql-http-$(PGSQL_HTTP_TAG) + +$(PGSQL_HTTP_DIR).tar.gz: + curl -L -o $(PGSQL_HTTP_DIR).tar.gz $(PGSQL_HTTP_URL) + +$(PGSQL_HTTP_DIR)/Makefile: $(PGSQL_HTTP_DIR).tar.gz + mkdir -p $(PGSQL_HTTP_DIR) + tar xzf $(PGSQL_HTTP_DIR).tar.gz -C $(PGSQL_HTTP_DIR) --strip-components=1 + touch $(PGSQL_HTTP_DIR)/Makefile + +$(INSTALL_PREFIX)/lib/http.so: $(PGSQL_HTTP_DIR)/Makefile $(INSTALL_PREFIX)/bin/postgres + unset MAKELEVEL && unset MAKEFLAGS && unset MFLAGS \ + && $(MAKE) -C $(PGSQL_HTTP_DIR) PG_CONFIG=$(INSTALL_PREFIX)/bin/pg_config$(EXE_EXT) -j \ + && $(MAKE) -C $(PGSQL_HTTP_DIR) PG_CONFIG=$(INSTALL_PREFIX)/bin/pg_config$(EXE_EXT) install ### pg_duckdb PG_DUCKDB_TAG := v1.1.1 PG_DUCKDB_REPO := https://github.com/duckdb/pg_duckdb @@ -203,6 +221,7 @@ clean: rm -rf $(PG_DUCKDB_DIR) rm -rf $(PGTEXTSEARCH_DIR) rm -rf $(PGSEARCH_DIR) + rm -rf $(PGSQL_HTTP_DIR) clean-all: clean rm -rf *.tar.gz diff --git a/pyproject.toml b/pyproject.toml index 732f8f3..816aea8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,13 @@ [project] name = "pgembed" # Required -version = "0.2.0" # Required +version = "0.2.1" # Required description = "Self-contained postgres server for your python applications" # Required readme = "README.md" # Optional requires-python = ">=3.12" license = {file = "LICENSE.txt"} urls={repository="https://github.com/Ladybug-Memory/pgembed"} authors=[{ name="Oscar Moll", email="orm@csail.mit.edu" }, { name="Arun Sharma", email="arun@sharma-home.net" }] -keywords=["postgresql", "pgvector", "pg_duckdb", "pgembed", "pg_textsearch", "rag"] +keywords=["postgresql", "pgvector", "pg_duckdb", "pgembed", "pg_textsearch", "rag", "pgsl-http"] dependencies = [ "fasteners>=0.19", "platformdirs>=4.0.0", @@ -21,7 +21,7 @@ dev = [ test = [ "pytest", "psycopg2-binary", - "sqlalchemy>=2", + "sqlalchemy>=2,<2.1", "sqlalchemy-utils" ] diff --git a/src/pgembed/__init__.py b/src/pgembed/__init__.py index 9eda487..994128f 100644 --- a/src/pgembed/__init__.py +++ b/src/pgembed/__init__.py @@ -24,6 +24,7 @@ def _get_pkg_path(): "pgvector": "pgembed_pgvector", "pgvectorscale": "pgembed_pgvectorscale", "pgtextsearch": "pgembed_pgtextsearch", + "pgsql_http": "pgembed_pgsql_http" } EXTENSION_SO_FILES = { @@ -32,6 +33,7 @@ def _get_pkg_path(): "pgtextsearch": "pg_textsearch.so", "pg_search": "pg_search.so", "pg_duckdb": "pg_duckdb.so", + "pgsql_http": "http.so", } EXTENSION_NAMES = ( @@ -40,6 +42,7 @@ def _get_pkg_path(): "pgtextsearch", "pg_search", "pg_duckdb", + "pgsql_http" ) @@ -106,6 +109,7 @@ def get_extension_create_name(name: str) -> str: "pgtextsearch": "pg_textsearch", "pg_search": "pg_search", "pg_duckdb": "pg_duckdb", + "pgsql_http": "http" } return create_names.get(name, name) diff --git a/src/pgembed_pgsql_http/__init__.py b/src/pgembed_pgsql_http/__init__.py new file mode 100644 index 0000000..14bbfeb --- /dev/null +++ b/src/pgembed_pgsql_http/__init__.py @@ -0,0 +1,50 @@ +__version__ = "0.1.8" + +EXTENSION_NAME = "pgsql_http" +EXTENSION_SO = "http.so" +EXTENSION_CREATE = "http" + + +def get_extension_path(): + from pathlib import Path + + pkg_dir = Path(__file__).parent + so_path = pkg_dir / EXTENSION_SO + if so_path.exists(): + return so_path + + try: + import pgembed + + base_lib = pgembed.EXTENSION_LIB_PATH + bundled = base_lib / "postgresql" / EXTENSION_SO + if bundled.exists(): + return bundled + except ImportError: + pass + + return None + + +def get_extension_share_path(): + from pathlib import Path + + try: + import pgembed + + base_share = ( + Path(__file__).parent / "pginstall" / "share" / "postgresql" / "extension" + ) + control_file = base_share / f"{EXTENSION_NAME}.control" + if control_file.exists(): + return base_share + + base_share = ( + pgembed.EXTENSION_LIB_PATH.parent / "share" / "postgresql" / "extension" + ) + control_file = base_share / f"{EXTENSION_NAME}.control" + if control_file.exists(): + return base_share + except ImportError: + pass + return None diff --git a/src/pgembed_pgsql_http/pyproject.toml b/src/pgembed_pgsql_http/pyproject.toml new file mode 100644 index 0000000..deae4e9 --- /dev/null +++ b/src/pgembed_pgsql_http/pyproject.toml @@ -0,0 +1,17 @@ +[project] +name = "pgembed-http" +version = "0.1.8" +description = "pgsql-http extension for pgembed" +readme = "README.md" +requires-python = ">=3.12" +dependencies = ["pgembed>=0.1.8"] + +[project.optional-dependencies] +test = ["pytest"] + +[tool.setuptools.packages.find] +where = ["src"] + +[build-system] +requires = ["setuptools>=58.0.0", "wheel"] +build-backend = "setuptools.build_meta"