Binary Output Functions

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Binary Output Functions

Paul Ramsey
Nevermind, with a little poking into the system catalogues, I found the
answer:

The "binary send format" is controlled by the "typsend" attribute in the
"pg_type" catalogue. So for example, for int4, the "typsend" is defined
as "int4send" and the C code is:

Datum
int4send(PG_FUNCTION_ARGS)
{
         int32           arg1 = PG_GETARG_INT32(0);
         StringInfoData buf;

         pq_begintypsend(&buf);
         pq_sendint(&buf, arg1, sizeof(int32));
         PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}

So the return is a BYTEA. I am not sure what the right return type is
for geometry in this case to get interoperability with ESRI, whether it
is the OpenGIS WKB format or something else. Probably WKB. The user
could probably test this by simply updating the "geometry" entry in
pg_type and setting the typsend function to be "asbinary". This returns
(in postgis 1.0) a bytea in the OGC WKB format, which is (probably) what
ESRI is expecting.

Paul


> Shachar,
> You wrote (in response to a question about PgOleDB and PostGIS):
>
>
> "OleDb, and accordingly, PgOleDb, is a binary interface driver. As such,
> it gets all data types in binary form from the database. In order for a
> datatype to be supported, two conditions must be satisfied:
> 1. The data type must have a binary output function defined in PG itself.
> 2. PgOleDb must know how to handle this type, to translate it to the
> binary interface OLE DB is expected to return said type."
>
> Could you elabourate on item 1. above? What is the function signature
> that PgOleDB expects for the binary output function? It is a typecast to
> bytea? Something else? In a binary cursor, if you ask for a column, you
> should just get back the backend struct, which would then drop the
> system into your problem 2. above. And for that the guy you were talking
> to will actually need to start hacking in PgOleDb.  ESRI has some
> directions on doing spatial OLEDB, but the documentation is very very
> thin...
>
> http://arcgisdeveloperonline.esri.com/ArcGISDeveloper/ArcGISDevHelp/TechnicalDocuments/Geodatabase/Arc8_provider.htm






_______________________________________________
postgis-devel mailing list
[hidden email]
http://postgis.refractions.net/mailman/listinfo/postgis-devel
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Binary Output Functions

Paul Ramsey
Here is what I did to try and enable this idea (I have not tested it
with ArcMap yet). I did this for PostgreSQL 7.4. For version 8.0 the
bytea() case would not be required:

create function geometrysend(geometry) returns bytea as 'select
bytea(asbinary($1))' language sql;
update pg_type set typsend='geometrysend' where oid = (select oid from
pg_type where typname = 'geometry');

Paul

Paul Ramsey wrote:

> Nevermind, with a little poking into the system catalogues, I found the
> answer:
>
> The "binary send format" is controlled by the "typsend" attribute in the
> "pg_type" catalogue. So for example, for int4, the "typsend" is defined
> as "int4send" and the C code is:
>
> Datum
> int4send(PG_FUNCTION_ARGS)
> {
>         int32           arg1 = PG_GETARG_INT32(0);
>         StringInfoData buf;
>
>         pq_begintypsend(&buf);
>         pq_sendint(&buf, arg1, sizeof(int32));
>         PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
> }
>
> So the return is a BYTEA. I am not sure what the right return type is
> for geometry in this case to get interoperability with ESRI, whether it
> is the OpenGIS WKB format or something else. Probably WKB. The user
> could probably test this by simply updating the "geometry" entry in
> pg_type and setting the typsend function to be "asbinary". This returns
> (in postgis 1.0) a bytea in the OGC WKB format, which is (probably) what
> ESRI is expecting.
>
> Paul
>
>
>> Shachar,
>> You wrote (in response to a question about PgOleDB and PostGIS):
>>
>>
>> "OleDb, and accordingly, PgOleDb, is a binary interface driver. As such,
>> it gets all data types in binary form from the database. In order for a
>> datatype to be supported, two conditions must be satisfied:
>> 1. The data type must have a binary output function defined in PG itself.
>> 2. PgOleDb must know how to handle this type, to translate it to the
>> binary interface OLE DB is expected to return said type."
>>
>> Could you elabourate on item 1. above? What is the function signature
>> that PgOleDB expects for the binary output function? It is a typecast
>> to bytea? Something else? In a binary cursor, if you ask for a column,
>> you should just get back the backend struct, which would then drop the
>> system into your problem 2. above. And for that the guy you were
>> talking to will actually need to start hacking in PgOleDb.  ESRI has
>> some directions on doing spatial OLEDB, but the documentation is very
>> very thin...
>>
>> http://arcgisdeveloperonline.esri.com/ArcGISDeveloper/ArcGISDevHelp/TechnicalDocuments/Geodatabase/Arc8_provider.htm 
>>
>
>
>
>
>
>

_______________________________________________
postgis-devel mailing list
[hidden email]
http://postgis.refractions.net/mailman/listinfo/postgis-devel
Loading...