web-dev-qa-db-ja.com

lo_open()の呼び出しの131072とは

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は最大読み取りサイズですが、とにかく値を読み取ることができました。

2
Evan Carroll

この変数は「モードパラメータ」と呼ばれ、INV_READx'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_READlargeobject.source で確認でき、コードで定義されていることは libpq-fs.h のコードで確認できます。

イベントでは、262144を数値化したINV_WRITE0x40000)を目にすることがあります。

2
Evan Carroll