ByteAからBLOBへの変換は通常、lo_open()
を呼び出します。
CREATE OR REPLACE FUNCTION make_lo(bytea)
RETURNS oid AS $$
DECLARE
loid oid;
fd integer;
bytes integer;
BEGIN
loid := lo_creat(-1);
fd := lo_open(loid, 131072); -- <<< --==HERE==--
bytes := lowrite(fd, $1);
IF (bytes != LENGTH($1)) THEN
RAISE EXCEPTION 'Not all data copied to blob';
END IF;
PERFORM lo_close(fd);
RETURN loid;
END;
$$ LANGUAGE plpgsql STRICT;
上記では何ですか
fd := lo_open(loid, 131072);
他の人も同じように尋ねているのを見ることができます ここで質問 、
数字
131072
は、意味がわからなかったフラグです。999999999は最大読み取りサイズですが、とにかく値を読み取ることができました。
この変数は「モードパラメータ」と呼ばれ、INV_READ
(x'20000'
)のint表現です。
-- lo_open(lobjId oid, mode integer) returns integer
-- The mode parameter to lo_open uses two constants:
-- INV_READ = 0x20000
-- INV_WRITE = 0x40000
あなたはこのような整数表現を見ることができます、
SELECT CAST( x'20000' AS integer);
int4
--------
131072
(1 row)
個人的には、x'20000'
を使用したいのですが、これはより明確です。コメントで言及されているINV_READ
は largeobject.source
で確認でき、コードで定義されていることは libpq-fs.h
のコードで確認できます。
イベントでは、262144
を数値化したINV_WRITE
(0x40000
)を目にすることがあります。