[fpc-pascal] [PATCH] Add Oid_JSON in pqconnection unit
silvioprog
silvioprog at gmail.com
Thu Mar 5 03:32:11 CET 2015
Hello,
The patch allows to use this ... :
select row_to_json(row(1,'foo'))
... instead of this (in this case, the ::text cast avoids the "Missing
(compatible) underlying dataset, can not open" error):
select row_to_json(row(1,'foo'))::text
--- result of both ---
{ "f1" : 1, "f2" : "foo" }
It worked fine too:
drop table if exists person cascade;
create table person (
id serial not null primary key,
name varchar(50) not null unique
);
insert into person (name) values ('Foo');
insert into person (name) values ('Bar');
...
select array_to_json(array_agg(row_to_json(t)))
from (
select id, name from person
) t
--- result ---
[{ "id" : 1, "name" : "Foo" }, { "id" : 2, "name" : "Bar" }]
=== begin patch ===
>From 079807a984a0f414860e599c8836c9f099add46c Mon Sep 17 00:00:00 2001
From: silvioprog <silvioprog at gmail.com>
Date: Wed, 4 Mar 2015 22:10:48 -0300
Subject: [PATCH 1/1] fcl-db: postgresql: add support for JSON.
---
packages/fcl-db/src/sqldb/postgres/pqconnection.pp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/packages/fcl-db/src/sqldb/postgres/pqconnection.pp
b/packages/fcl-db/src/sqldb/postgres/pqconnection.pp
index bcf4382..bdf036d 100644
--- a/packages/fcl-db/src/sqldb/postgres/pqconnection.pp
+++ b/packages/fcl-db/src/sqldb/postgres/pqconnection.pp
@@ -176,6 +176,7 @@ const Oid_Bool = 16;
Oid_Int8 = 20;
Oid_int2 = 21;
Oid_Int4 = 23;
+ Oid_JSON = 114;
Oid_Float4 = 700;
Oid_Money = 790;
Oid_Float8 = 701;
@@ -736,7 +737,7 @@ begin
ATypeOID:=0;
AOID:=PQftype(res,Tuple);
case AOID of
- Oid_varchar,Oid_bpchar,
+ Oid_varchar,Oid_bpchar,Oid_JSON,
Oid_name : begin
Result := ftstring;
size := PQfsize(Res, Tuple);
--
1.9.5.msysgit.0
=== end patch ===
== begin test ==
program project1;
{$mode objfpc}{$H+}
uses
pqconnection,
sqldb,
jsonparser,
fpjson;
procedure ValidateJson(const S: string);
var
j: TJSONData;
begin
// just to validade the JSON result
with TJSONParser.Create(S) do
try
j := Parse;
try
// WriteLn(j.AsJSON); uncomment to print the JSON resut
finally
j.Free;
end;
finally
Free;
end;
end;
var
q: TSQLQuery;
con: TPQConnection;
begin
con := TPQConnection.Create(nil);
con.Transaction := TSQLTransaction.Create(con);
q := TSQLQuery.Create(con);
try
con.HostName := '127.0.0.1';
con.DatabaseName := 'postgres';
con.UserName := 'postgres';
con.Password := 'postgres';
q.Transaction := con.Transaction;
q.SQL.Text := 'select row_to_json(row(1,''foo''))';
q.Open;
while not q.EOF do
begin
ValidateJson(q.Fields[0].AsString);
q.Next;
end;
finally
con.Free;
end;
end.
== end test ==
P.S.: Get the 114 type via:
$ psql -qAt -F $'\t' -p 5432 postgres -c
$ "select 'Oid_' || upper(typname), '=' || oid from pg_type"
A: why get it as string instead of memo or blob?
R: the string it is easy to be parsed, converted to other sources (eg:
stream), and internally the FCL-JSON uses a stringlist as JSON data source,
so the string type could be the best type for JSON representation.
Thank you!
--
Silvio Clécio
My public projects - github.com/silvioprog
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20150304/eff0cf96/attachment.html>
More information about the fpc-pascal
mailing list