packages feed

hpqtypes-1.2.2: libpqtypes/src/varlena.c

/*
 * varlena.c
 *   Type handler for the variable length data types.
 *
 * Copyright (c) 2011 eSilo, LLC. All rights reserved.
 * This is free software; see the source for copying conditions.  There is
 * NO warranty; not even for MERCHANTABILITY or  FITNESS FOR A  PARTICULAR
 * PURPOSE.
 */

#include "libpqtypes-int.h"

/* put a type in its string representation, text format */
int
pqt_put_str(PGtypeArgs *args)
{
	args->format = TEXTFMT;
	args->put.out = va_arg(args->ap, char *);
	return args->put.out ? (int)strlen(args->put.out)+1 : 0;
}

/* varchar, bpchar and name use the text handlers */
int
pqt_put_text(PGtypeArgs *args)
{
	args->put.out = va_arg(args->ap, PGtext);
	return args->put.out ? (int)strlen(args->put.out) : 0;
}

/* varchar, bpchar and name use the text handlers */
int
pqt_get_text(PGtypeArgs *args)
{
	DECLVALUE(args);
	PGtext *textp = va_arg(args->ap, PGtext *);
	CHKGETVALS(args, textp);
	*textp = value;
	return 0;
}

int
pqt_put_bytea(PGtypeArgs *args)
{
	PGbytea *bytea = va_arg(args->ap, PGbytea *);
	PUTNULLCHK(args, bytea);
	args->put.out = bytea->data;
	return bytea->len;
}

int
pqt_get_bytea(PGtypeArgs *args)
{
	DECLVALUE(args);
	DECLLENGTH(args);
	PGbytea *bytea = va_arg(args->ap, PGbytea *);

	CHKGETVALS(args, bytea);

	if (args->format == TEXTFMT)
	{
		size_t len = 0;

		value = (char *) PQunescapeBytea((const unsigned char *) value, &len);
		if (!value)
			RERR_STR2INT(args);

		bytea->data = (char *) PQresultAlloc(args->get.result, len);
		if (!bytea->data)
		{
			PQfreemem(value);
			RERR_MEM(args);
		}

		bytea->len = (int) len;
		memcpy(bytea->data, value, len);
		PQfreemem(value);
		return 0;
  }

	/* binary format */
  bytea->len = valuel;
  bytea->data = value;
	return 0;
}