19.2. 存取PostgreSQL table

19.2.1. 生成资料

举例:

19.2.2. 读取资料

举例:

19.2.3. 更改资料

举例:

19.2.4. 删除资料

举例:

19.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;