Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ dbdev is a package manager for Postgres [trusted language extensions (TLE)](http

## Usage

Users primarily interact with the registry using the dbdev SQL client. Once present, pglets can be installed as follows:
Users primarily interact with the registry using the dbdev SQL client. Once present, packages can be installed as follows:

```sql
-- Load the package from the package index
select dbdev.install('olirice-index_advisor');
```
Where `olirice` is the handle of the publisher and `index_advisor` is the name of the pglet.
Where `olirice` is the handle of the publisher and `index_advisor` is the name of the package.

Once installed, pglets are visible in PostgreSQL as extensions. At that point they can be enabled with standard Postgres commands i.e. the `create extension`
Once installed, packages are visible in PostgreSQL as extensions. At that point they can be enabled with standard Postgres commands i.e. the `create extension`

To improve reproducibility, we recommend __always__ specifying the package version in your `create extension` statements.

Expand All @@ -46,11 +46,14 @@ Requires:
*/
create extension if not exists http with schema extensions;
create extension if not exists pg_tle;
-- drop dbdev with older naming scheme if present
drop extension if exists "supabase-dbdev";
select pgtle.uninstall_extension_if_exists('supabase-dbdev');
drop extension if exists "supabase@dbdev";
select pgtle.uninstall_extension_if_exists('supabase@dbdev');
select
pgtle.install_extension(
'supabase-dbdev',
'supabase@dbdev',
resp.contents ->> 'version',
'PostgreSQL package manager',
resp.contents ->> 'sql'
Expand All @@ -60,7 +63,7 @@ from http(
'GET',
'https://api.database.dev/rest/v1/'
|| 'package_versions?select=sql,version'
|| '&package_name=eq.supabase-dbdev'
|| '&package_alias=eq.supabase@dbdev'
|| '&order=version.desc'
|| '&limit=1',
array[
Expand All @@ -74,16 +77,16 @@ lateral (
select
((row_to_json(x) -> 'content') #>> '{}')::json -> 0
) resp(contents);
create extension "supabase-dbdev";
select dbdev.install('supabase-dbdev');
drop extension if exists "supabase-dbdev";
create extension "supabase-dbdev";
create extension "supabase@dbdev";
select dbdev.install('supabase@dbdev');
drop extension if exists "supabase@dbdev";
create extension "supabase@dbdev";
```

With the client ready, search for packages on [database.dev](database.dev) and install them
```sql
select dbdev.install('handle-package_name');
create extension "handle-package_name"
select dbdev.install('handle@package_name');
create extension "handle@package_name"
schema 'public'
version '1.2.3';
```
Expand Down
19 changes: 11 additions & 8 deletions docs/install-in-db-client.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,14 @@ Run the following SQL to install the client:
```sql
create extension if not exists http with schema extensions;
create extension if not exists pg_tle;
-- drop dbdev with older naming scheme if present
drop extension if exists "supabase-dbdev";
select pgtle.uninstall_extension_if_exists('supabase-dbdev');
drop extension if exists "supabase@dbdev";
select pgtle.uninstall_extension_if_exists('supabase@dbdev');
select
pgtle.install_extension(
'supabase-dbdev',
'supabase@dbdev',
resp.contents ->> 'version',
'PostgreSQL package manager',
resp.contents ->> 'sql'
Expand All @@ -30,7 +33,7 @@ from http(
'GET',
'https://api.database.dev/rest/v1/'
|| 'package_versions?select=sql,version'
|| '&package_name=eq.supabase-dbdev'
|| '&package_name=eq.supabase@dbdev'
|| '&order=version.desc'
|| '&limit=1',
array[
Expand All @@ -44,10 +47,10 @@ lateral (
select
((row_to_json(x) -> 'content') #>> '{}')::json -> 0
) resp(contents);
create extension "supabase-dbdev";
select dbdev.install('supabase-dbdev');
drop extension if exists "supabase-dbdev";
create extension "supabase-dbdev";
create extension "supabase@dbdev";
select dbdev.install('supabase@dbdev');
drop extension if exists "supabase@dbdev";
create extension "supabase@dbdev";
```

## Use
Expand All @@ -64,8 +67,8 @@ create extension <extension_name>
For example, to install pg_headerkit version 1.0.0 in schema public run:

```sql
select dbdev.install('burggraf-pg_headerkit');
create extension "burggraf-pg_headerkit"
select dbdev.install('burggraf@pg_headerkit');
create extension "burggraf@pg_headerkit"
schema 'public'
version '1.0.0';
```
82 changes: 82 additions & 0 deletions supabase/migrations/20231207071422_new_package_name.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
create or replace function app.to_package_name(handle app.valid_name, partial_name app.valid_name)
returns text
immutable
language sql
as $$
select format('%s@%s', $1, $2)
$$;

alter table app.packages
add column package_alias text null;

update app.packages
set package_alias = format('%s@%s', handle, partial_name);

-- add package_alias column to the views
create or replace view public.packages as
select
pa.id,
pa.package_name,
pa.handle,
pa.partial_name,
newest_ver.version as latest_version,
newest_ver.description_md,
pa.control_description,
pa.control_requires,
pa.created_at,
pa.default_version,
pa.package_alias
from
app.packages pa,
lateral (
select *
from app.package_versions pv
where pv.package_id = pa.id
order by pv.version_struct desc
limit 1
) newest_ver;

create or replace view public.package_versions as
select
pv.id,
pv.package_id,
pa.package_name,
pv.version,
pv.sql,
pv.description_md,
pa.control_description,
pa.control_requires,
pv.created_at,
pa.package_alias
from
app.packages pa
join app.package_versions pv
on pa.id = pv.package_id;

create or replace view public.package_upgrades
as
select
pu.id,
pu.package_id,
pa.package_name,
pu.from_version,
pu.to_version,
pu.sql,
pu.created_at,
pa.package_alias
from
app.packages pa
join app.package_upgrades pu
on pa.id = pu.package_id;

create or replace function public.register_download(package_name text)
returns void
language sql
security definer
as
$$
insert into app.downloads(package_id)
select id
from app.packages ap
where ap.package_name = $1 or ap.package_alias = $1
$$;
Loading