Skip to content

Commit 0249c24

Browse files
committed
More binary I/O routines.
1 parent 72f311b commit 0249c24

File tree

11 files changed

+584
-25
lines changed

11 files changed

+584
-25
lines changed

src/backend/utils/adt/cash.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* workings can be found in the book "Software Solutions in C" by
1010
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
1111
*
12-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.57 2003/03/11 21:01:33 tgl Exp $
12+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.58 2003/05/13 18:03:07 tgl Exp $
1313
*/
1414

1515
#include "postgres.h"
@@ -19,6 +19,7 @@
1919
#include <math.h>
2020
#include <locale.h>
2121

22+
#include "libpq/pqformat.h"
2223
#include "miscadmin.h"
2324
#include "utils/builtins.h"
2425
#include "utils/cash.h"
@@ -310,6 +311,31 @@ cash_out(PG_FUNCTION_ARGS)
310311
PG_RETURN_CSTRING(result);
311312
}
312313

314+
/*
315+
* cash_recv - converts external binary format to cash
316+
*/
317+
Datum
318+
cash_recv(PG_FUNCTION_ARGS)
319+
{
320+
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
321+
322+
PG_RETURN_CASH((Cash) pq_getmsgint(buf, sizeof(Cash)));
323+
}
324+
325+
/*
326+
* cash_send - converts cash to binary format
327+
*/
328+
Datum
329+
cash_send(PG_FUNCTION_ARGS)
330+
{
331+
Cash arg1 = PG_GETARG_CASH(0);
332+
StringInfoData buf;
333+
334+
pq_begintypsend(&buf);
335+
pq_sendint(&buf, arg1, sizeof(Cash));
336+
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
337+
}
338+
313339

314340
Datum
315341
cash_eq(PG_FUNCTION_ARGS)

src/backend/utils/adt/geo_ops.c

Lines changed: 266 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.76 2003/05/09 21:19:49 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.77 2003/05/13 18:03:07 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -409,6 +409,58 @@ box_out(PG_FUNCTION_ARGS)
409409
PG_RETURN_CSTRING(path_encode(-1, 2, &(box->high)));
410410
}
411411

412+
/*
413+
* box_recv - converts external binary format to box
414+
*/
415+
Datum
416+
box_recv(PG_FUNCTION_ARGS)
417+
{
418+
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
419+
BOX *box;
420+
double x,
421+
y;
422+
423+
box = (BOX *) palloc(sizeof(BOX));
424+
425+
box->high.x = pq_getmsgfloat8(buf);
426+
box->high.y = pq_getmsgfloat8(buf);
427+
box->low.x = pq_getmsgfloat8(buf);
428+
box->low.y = pq_getmsgfloat8(buf);
429+
430+
/* reorder corners if necessary... */
431+
if (box->high.x < box->low.x)
432+
{
433+
x = box->high.x;
434+
box->high.x = box->low.x;
435+
box->low.x = x;
436+
}
437+
if (box->high.y < box->low.y)
438+
{
439+
y = box->high.y;
440+
box->high.y = box->low.y;
441+
box->low.y = y;
442+
}
443+
444+
PG_RETURN_BOX_P(box);
445+
}
446+
447+
/*
448+
* box_send - converts box to binary format
449+
*/
450+
Datum
451+
box_send(PG_FUNCTION_ARGS)
452+
{
453+
BOX *box = PG_GETARG_BOX_P(0);
454+
StringInfoData buf;
455+
456+
pq_begintypsend(&buf);
457+
pq_sendfloat8(&buf, box->high.x);
458+
pq_sendfloat8(&buf, box->high.y);
459+
pq_sendfloat8(&buf, box->low.x);
460+
pq_sendfloat8(&buf, box->low.y);
461+
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
462+
}
463+
412464

413465
/* box_construct - fill in a new box.
414466
*/
@@ -915,6 +967,26 @@ line_out(PG_FUNCTION_ARGS)
915967
PG_RETURN_CSTRING(result);
916968
}
917969

970+
/*
971+
* line_recv - converts external binary format to line
972+
*/
973+
Datum
974+
line_recv(PG_FUNCTION_ARGS)
975+
{
976+
elog(ERROR, "line not yet implemented");
977+
return 0;
978+
}
979+
980+
/*
981+
* line_send - converts line to binary format
982+
*/
983+
Datum
984+
line_send(PG_FUNCTION_ARGS)
985+
{
986+
elog(ERROR, "line not yet implemented");
987+
return 0;
988+
}
989+
918990

919991
/*----------------------------------------------------------
920992
* Conversion routines from one line formula to internal.
@@ -1271,6 +1343,64 @@ path_out(PG_FUNCTION_ARGS)
12711343
PG_RETURN_CSTRING(path_encode(path->closed, path->npts, path->p));
12721344
}
12731345

1346+
/*
1347+
* path_recv - converts external binary format to path
1348+
*
1349+
* External representation is closed flag (a boolean byte), int32 number
1350+
* of points, and the points.
1351+
*/
1352+
Datum
1353+
path_recv(PG_FUNCTION_ARGS)
1354+
{
1355+
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
1356+
PATH *path;
1357+
int closed;
1358+
int32 npts;
1359+
int32 i;
1360+
int size;
1361+
1362+
closed = pq_getmsgbyte(buf);
1363+
npts = pq_getmsgint(buf, sizeof(int32));
1364+
if (npts < 0 || npts >= (int32) (INT_MAX / sizeof(Point)))
1365+
elog(ERROR, "Invalid number of points in external path");
1366+
1367+
size = offsetof(PATH, p[0]) +sizeof(path->p[0]) * npts;
1368+
path = (PATH *) palloc(size);
1369+
1370+
path->size = size;
1371+
path->npts = npts;
1372+
path->closed = (closed ? 1 : 0);
1373+
1374+
for (i = 0; i < npts; i++)
1375+
{
1376+
path->p[i].x = pq_getmsgfloat8(buf);
1377+
path->p[i].y = pq_getmsgfloat8(buf);
1378+
}
1379+
1380+
PG_RETURN_PATH_P(path);
1381+
}
1382+
1383+
/*
1384+
* path_send - converts path to binary format
1385+
*/
1386+
Datum
1387+
path_send(PG_FUNCTION_ARGS)
1388+
{
1389+
PATH *path = PG_GETARG_PATH_P(0);
1390+
StringInfoData buf;
1391+
int32 i;
1392+
1393+
pq_begintypsend(&buf);
1394+
pq_sendbyte(&buf, path->closed ? 1 : 0);
1395+
pq_sendint(&buf, path->npts, sizeof(int32));
1396+
for (i = 0; i < path->npts; i++)
1397+
{
1398+
pq_sendfloat8(&buf, path->p[i].x);
1399+
pq_sendfloat8(&buf, path->p[i].y);
1400+
}
1401+
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
1402+
}
1403+
12741404

12751405
/*----------------------------------------------------------
12761406
* Relational operators.
@@ -1815,6 +1945,46 @@ lseg_out(PG_FUNCTION_ARGS)
18151945
PG_RETURN_CSTRING(path_encode(FALSE, 2, (Point *) &(ls->p[0])));
18161946
}
18171947

1948+
/*
1949+
* lseg_recv - converts external binary format to lseg
1950+
*/
1951+
Datum
1952+
lseg_recv(PG_FUNCTION_ARGS)
1953+
{
1954+
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
1955+
LSEG *lseg;
1956+
1957+
lseg = (LSEG *) palloc(sizeof(LSEG));
1958+
1959+
lseg->p[0].x = pq_getmsgfloat8(buf);
1960+
lseg->p[0].y = pq_getmsgfloat8(buf);
1961+
lseg->p[1].x = pq_getmsgfloat8(buf);
1962+
lseg->p[1].y = pq_getmsgfloat8(buf);
1963+
1964+
#ifdef NOT_USED
1965+
lseg->m = point_sl(&lseg->p[0], &lseg->p[1]);
1966+
#endif
1967+
1968+
PG_RETURN_LSEG_P(lseg);
1969+
}
1970+
1971+
/*
1972+
* lseg_send - converts lseg to binary format
1973+
*/
1974+
Datum
1975+
lseg_send(PG_FUNCTION_ARGS)
1976+
{
1977+
LSEG *ls = PG_GETARG_LSEG_P(0);
1978+
StringInfoData buf;
1979+
1980+
pq_begintypsend(&buf);
1981+
pq_sendfloat8(&buf, ls->p[0].x);
1982+
pq_sendfloat8(&buf, ls->p[0].y);
1983+
pq_sendfloat8(&buf, ls->p[1].x);
1984+
pq_sendfloat8(&buf, ls->p[1].y);
1985+
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
1986+
}
1987+
18181988

18191989
/* lseg_construct -
18201990
* form a LSEG from two Points.
@@ -3186,6 +3356,64 @@ poly_out(PG_FUNCTION_ARGS)
31863356
PG_RETURN_CSTRING(path_encode(TRUE, poly->npts, poly->p));
31873357
}
31883358

3359+
/*
3360+
* poly_recv - converts external binary format to polygon
3361+
*
3362+
* External representation is int32 number of points, and the points.
3363+
* We recompute the bounding box on read, instead of trusting it to
3364+
* be valid. (Checking it would take just as long, so may as well
3365+
* omit it from external representation.)
3366+
*/
3367+
Datum
3368+
poly_recv(PG_FUNCTION_ARGS)
3369+
{
3370+
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
3371+
POLYGON *poly;
3372+
int32 npts;
3373+
int32 i;
3374+
int size;
3375+
3376+
npts = pq_getmsgint(buf, sizeof(int32));
3377+
if (npts < 0 || npts >= (int32) ((INT_MAX - offsetof(POLYGON, p[0])) / sizeof(Point)))
3378+
elog(ERROR, "Invalid number of points in external polygon");
3379+
3380+
size = offsetof(POLYGON, p[0]) +sizeof(poly->p[0]) * npts;
3381+
poly = (POLYGON *) palloc0(size); /* zero any holes */
3382+
3383+
poly->size = size;
3384+
poly->npts = npts;
3385+
3386+
for (i = 0; i < npts; i++)
3387+
{
3388+
poly->p[i].x = pq_getmsgfloat8(buf);
3389+
poly->p[i].y = pq_getmsgfloat8(buf);
3390+
}
3391+
3392+
make_bound_box(poly);
3393+
3394+
PG_RETURN_POLYGON_P(poly);
3395+
}
3396+
3397+
/*
3398+
* poly_send - converts polygon to binary format
3399+
*/
3400+
Datum
3401+
poly_send(PG_FUNCTION_ARGS)
3402+
{
3403+
POLYGON *poly = PG_GETARG_POLYGON_P(0);
3404+
StringInfoData buf;
3405+
int32 i;
3406+
3407+
pq_begintypsend(&buf);
3408+
pq_sendint(&buf, poly->npts, sizeof(int32));
3409+
for (i = 0; i < poly->npts; i++)
3410+
{
3411+
pq_sendfloat8(&buf, poly->p[i].x);
3412+
pq_sendfloat8(&buf, poly->p[i].y);
3413+
}
3414+
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
3415+
}
3416+
31893417

31903418
/*-------------------------------------------------------
31913419
* Is polygon A strictly left of polygon B? i.e. is
@@ -4001,6 +4229,43 @@ circle_out(PG_FUNCTION_ARGS)
40014229
PG_RETURN_CSTRING(result);
40024230
}
40034231

4232+
/*
4233+
* circle_recv - converts external binary format to circle
4234+
*/
4235+
Datum
4236+
circle_recv(PG_FUNCTION_ARGS)
4237+
{
4238+
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
4239+
CIRCLE *circle;
4240+
4241+
circle = (CIRCLE *) palloc(sizeof(CIRCLE));
4242+
4243+
circle->center.x = pq_getmsgfloat8(buf);
4244+
circle->center.y = pq_getmsgfloat8(buf);
4245+
circle->radius = pq_getmsgfloat8(buf);
4246+
4247+
if (circle->radius < 0)
4248+
elog(ERROR, "Invalid radius in external circle");
4249+
4250+
PG_RETURN_CIRCLE_P(circle);
4251+
}
4252+
4253+
/*
4254+
* circle_send - converts circle to binary format
4255+
*/
4256+
Datum
4257+
circle_send(PG_FUNCTION_ARGS)
4258+
{
4259+
CIRCLE *circle = PG_GETARG_CIRCLE_P(0);
4260+
StringInfoData buf;
4261+
4262+
pq_begintypsend(&buf);
4263+
pq_sendfloat8(&buf, circle->center.x);
4264+
pq_sendfloat8(&buf, circle->center.y);
4265+
pq_sendfloat8(&buf, circle->radius);
4266+
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
4267+
}
4268+
40044269

40054270
/*----------------------------------------------------------
40064271
* Relational operators for CIRCLEs.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy