1 
2 /*
3  * varlena.c
4  *   Type handler for the variable length data types.
5  *
6  * Copyright (c) 2011 eSilo, LLC. All rights reserved.
7  * This is free software; see the source for copying conditions.  There is
8  * NO warranty; not even for MERCHANTABILITY or  FITNESS FOR A  PARTICULAR
9  * PURPOSE.
10  */
11 
12 #include "libpqtypes-int.h"
13 
14 /* put a type in its string representation, text format */
15 int
16 pqt_put_str(PGtypeArgs *args)
17 {
18 	args->format = TEXTFMT;
19 	args->put.out = va_arg(args->ap, char *);
20 	return args->put.out ? (int)strlen(args->put.out)+1 : 0;
21 }
22 
23 /* varchar, bpchar and name use the text handlers */
24 int
25 pqt_put_text(PGtypeArgs *args)
26 {
27 	args->put.out = va_arg(args->ap, PGtext);
28 	return args->put.out ? (int)strlen(args->put.out) : 0;
29 }
30 
31 /* varchar, bpchar and name use the text handlers */
32 int
33 pqt_get_text(PGtypeArgs *args)
34 {
35 	DECLVALUE(args);
36 	PGtext *textp = va_arg(args->ap, PGtext *);
37 	CHKGETVALS(args, textp);
38 	*textp = value;
39 	return 0;
40 }
41 
42 int
43 pqt_put_bytea(PGtypeArgs *args)
44 {
45 	PGbytea *bytea = va_arg(args->ap, PGbytea *);
46 	PUTNULLCHK(args, bytea);
47 	args->put.out = bytea->data;
48 	return bytea->len;
49 }
50 
51 int
52 pqt_get_bytea(PGtypeArgs *args)
53 {
54 	DECLVALUE(args);
55 	DECLLENGTH(args);
56 	PGbytea *bytea = va_arg(args->ap, PGbytea *);
57 
58 	CHKGETVALS(args, bytea);
59 
60 	if (args->format == TEXTFMT)
61 	{
62 		size_t len = 0;
63 
64 		value = (char *) PQunescapeBytea((const unsigned char *) value, &len);
65 		if (!value)
66 			RERR_STR2INT(args);
67 
68 		bytea->data = (char *) PQresultAlloc(args->get.result, len);
69 		if (!bytea->data)
70 		{
71 			PQfreemem(value);
72 			RERR_MEM(args);
73 		}
74 
75 		bytea->len = (int) len;
76 		memcpy(bytea->data, value, len);
77 		PQfreemem(value);
78 		return 0;
79   }
80 
81 	/* binary format */
82   bytea->len = valuel;
83   bytea->data = value;
84 	return 0;
85 }
86 
87 
88 
89