18.2. 存取PostgreSQL table

18.2.1. 生成資料

舉例:

18.2.2. 讀取資料

舉例:

18.2.3. 更改資料

舉例:

18.2.4. 刪除資料

舉例:

18.2.5. 預先過濾function

如果在資料庫有PostgreSQLapi_pre_check(IN TEXT,IN TEXT,IN TEXT,IN "char",IN TEXT)的function,則伺服器於處理每一次API呼叫之前都會先執行這個function。如果這個function回傳false或raise execption的話,則伺服器忽略該次API請求,並且回傳HTTP回應碼401。(因為PostgreSQL通常被設定成記錄exception的log而佔據硬碟空間,所以請盡量避免製造exception。)

Function api_pre_check()的參數說明如下:

  1. user id

  2. table name

  3. company code

  4. cru、或d

  5. 條件

    以下面的API請求為例,

    curl -v -H "Content-Type:Application/json" -H 'Authorization:abHEi47obYMiCi193xjEiWIFpOouNmkd' -H 'X-Auth-Database:dev5' -d '{"table":"t52","company":"1","query":[[["f0","1"],["f1",1]],[["f4",880],["f5",0]]]}' https://34.terarows.com/fastcgi/api/u
    					

    條件內容就是"query" key的值:[[["f0","1"],["f1",1]],[["f4",880],["f5",0]]]

伺服器於執行API之前轉交這些參數給api_pre_check()

設置api_pre_check()舉例:

CREATE OR REPLACE FUNCTION api_pre_check(user_id TEXT,table_name TEXT,company TEXT,crud "char",query TEXT) RETURNS BOOLEAN AS $$
DECLARE
	result BOOLEAN;
	j JSONB;
BEGIN
	IF crud IN ('u','d') THEN 
		j:=query::JSONB;
		EXECUTE FORMAT('
			SELECT EXISTS (SELECT 1 FROM t43 WHERE f1=$1 AND f8)
				AND EXISTS (SELECT 1 FROM %I WHERE %I=%L AND %I=$2 AND %I=$3 AND (%I=$4 OR %I IS NULL))'
			,table_name
			,j #>> '{0,0,0}'
			,j #>> '{0,0,1}'
			,j #>> '{0,1,0}'
			,j #>> '{1,0,0}'
			,j #>> '{1,1,0}'
			,j #>> '{1,1,0}'
		)
		INTO result
		USING 
			user_id
			,(j #>> '{0,1,1}')::INTEGER
			,(j #>> '{1,0,1}')::INTEGER
			,(j #>> '{1,1,1}')::INTEGER;
		RETURN company='1' AND result;
	END IF;
	RETURN TRUE;
END $$ LANGUAGE PLPGSQL STABLE;