initial commit
This commit is contained in:
commit
461b25829f
3
.cargo/config.toml
Normal file
3
.cargo/config.toml
Normal file
@ -0,0 +1,3 @@
|
||||
[target.'cfg(target_os="macos")']
|
||||
# Postgres symbols won't be available until runtime
|
||||
rustflags = ["-Clink-arg=-Wl,-undefined,dynamic_lookup"]
|
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
.DS_Store
|
||||
.idea/
|
||||
/target
|
||||
*.iml
|
||||
**/*.rs.bk
|
||||
Cargo.lock
|
32
Cargo.toml
Normal file
32
Cargo.toml
Normal file
@ -0,0 +1,32 @@
|
||||
[package]
|
||||
name = "pqddlread"
|
||||
version = "0.0.0"
|
||||
edition = "2021"
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
|
||||
[features]
|
||||
default = ["pg13"]
|
||||
pg11 = ["pgrx/pg11", "pgrx-tests/pg11" ]
|
||||
pg12 = ["pgrx/pg12", "pgrx-tests/pg12" ]
|
||||
pg13 = ["pgrx/pg13", "pgrx-tests/pg13" ]
|
||||
pg14 = ["pgrx/pg14", "pgrx-tests/pg14" ]
|
||||
pg15 = ["pgrx/pg15", "pgrx-tests/pg15" ]
|
||||
pg16 = ["pgrx/pg16", "pgrx-tests/pg16" ]
|
||||
pg_test = []
|
||||
|
||||
[dependencies]
|
||||
pgrx = "=0.11.4"
|
||||
|
||||
[dev-dependencies]
|
||||
pgrx-tests = "=0.11.4"
|
||||
|
||||
[profile.dev]
|
||||
panic = "unwind"
|
||||
|
||||
[profile.release]
|
||||
panic = "unwind"
|
||||
opt-level = 3
|
||||
lto = "fat"
|
||||
codegen-units = 1
|
23
README.md
Normal file
23
README.md
Normal file
@ -0,0 +1,23 @@
|
||||
Базовый пример установки хука на `ExecutorEnd_hook`. Для наглядности в примере сразу вызывается сбой после завершения выполнения любого запроса.
|
||||
Как выглядит работа:
|
||||
```sql
|
||||
psql (13.15)
|
||||
Type "help" for help.
|
||||
|
||||
pqddlread=# create extension pqddlread;
|
||||
CREATE EXTENSION
|
||||
pqddlread=# -- Хук пока не установлен, все запросы выполняются.
|
||||
pqddlread=# select 1;
|
||||
?column?
|
||||
----------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
pqddlread=# -- Устанавливаем хук. Он сразу же заработает т.к. на момент завершения вызова функции хук уже стоит.
|
||||
pqddlread=# select pqddlread();
|
||||
ERROR: This panic indicates that hook was called successfully. Last query info: QueryDesc { operation: 1, plannedstmt: 0x5f9ec2a32650, sourceText: 0x5f9ec2958740, snapshot: 0x5f9ec29df648, crosscheck_snapshot: 0x0, dest: 0x5f9ec2a327c0, params: 0x0, queryEnv: 0x0, instrument_options: 0, tupDesc: 0x5f9ec2a2c3b0, estate: 0x5f9ec2a2bf70, planstate: 0x5f9ec2a2c1a8, already_executed: true, totaltime: 0x0 }
|
||||
pqddlread=# -- Теперь ВСЕ запросы сломаны :)
|
||||
pqddlread=# select 1;
|
||||
ERROR: This panic indicates that hook was called successfully. Last query info: QueryDesc { operation: 1, plannedstmt: 0x5f9ec2a32458, sourceText: 0x5f9ec2958740, snapshot: 0x5f9ec2a1c868, crosscheck_snapshot: 0x0, dest: 0x5f9ec2a325c8, params: 0x0, queryEnv: 0x0, instrument_options: 0, tupDesc: 0x5f9ec29dfa50, estate: 0x5f9ec29df610, planstate: 0x5f9ec29df848, already_executed: true, totaltime: 0x0 }
|
||||
pqddlread=# -- Хук выводит всю информацию о запросе. Мы можем делать с ней что угодно.
|
||||
```
|
5
pqddlread.control
Normal file
5
pqddlread.control
Normal file
@ -0,0 +1,5 @@
|
||||
comment = 'pqddlread: Created by pgrx'
|
||||
default_version = '@CARGO_VERSION@'
|
||||
module_pathname = '$libdir/pqddlread'
|
||||
relocatable = false
|
||||
superuser = true
|
23
src/hook.rs
Normal file
23
src/hook.rs
Normal file
@ -0,0 +1,23 @@
|
||||
use pgrx::prelude::*;
|
||||
use pgrx::hooks::PgHooks;
|
||||
use pgrx::hooks::HookResult;
|
||||
|
||||
pub struct Catcher {}
|
||||
|
||||
impl Catcher {
|
||||
pub fn new() -> &'static mut (dyn PgHooks + 'static) {
|
||||
let val: &'static mut Catcher = Box::leak(Box::new(Catcher {}));
|
||||
val
|
||||
}
|
||||
}
|
||||
|
||||
impl PgHooks for Catcher {
|
||||
fn executor_finish(
|
||||
&mut self,
|
||||
query_desc: PgBox<pg_sys::QueryDesc>,
|
||||
prev_hook: fn(query_desc: PgBox<pg_sys::QueryDesc>) -> HookResult<()>,
|
||||
) -> HookResult<()> {
|
||||
panic!("{}", format!("This panic indicates that hook was called successfully. Last query info: {:?}", query_desc));
|
||||
prev_hook(query_desc)
|
||||
}
|
||||
}
|
12
src/lib.rs
Normal file
12
src/lib.rs
Normal file
@ -0,0 +1,12 @@
|
||||
use pgrx::prelude::*;
|
||||
|
||||
mod hook;
|
||||
|
||||
::pgrx::pg_module_magic!();
|
||||
|
||||
#[pg_extern]
|
||||
fn pqddlread() {
|
||||
unsafe {
|
||||
pgrx::hooks::register_hook(hook::Catcher::new());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user