/* * misc.c * Type handler for CHAR, BOOL, MONEY, UUID 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" int pqt_put_char(PGtypeArgs *args) { PGchar *chp = va_arg(args->ap, PGchar *); PUTNULLCHK(args, chp); *args->put.out = *chp; return 1; } int pqt_get_char(PGtypeArgs *args) { DECLVALUE(args); PGchar *chp = va_arg(args->ap, PGchar *); CHKGETVALS(args, chp); *chp = *value; return 0; } int pqt_put_bool(PGtypeArgs *args) { PGbool *boolp = va_arg(args->ap, PGbool *); PUTNULLCHK(args, boolp); *args->put.out = *boolp != 0 ? 1 : 0; return 1; } int pqt_get_bool(PGtypeArgs *args) { DECLVALUE(args); PGbool *boolp = va_arg(args->ap, PGbool *); CHKGETVALS(args, boolp); if (args->format == TEXTFMT) *boolp = (*value == 't') ? 1 : 0; else *boolp = (*value)!=0 ? 1 : 0; return 0; } int pqt_put_money(PGtypeArgs *args) { PGmoney *moneyp = va_arg(args->ap, PGmoney *); PUTNULLCHK(args, moneyp); int len = args->fmtinfo->sversion >= 80300 ? 8 : 4; if (len == 8) pqt_swap8(args->put.out, moneyp, 1); else /* truncate: pre 8.3 server expecting a 4 byte money */ pqt_buf_putint4(args->put.out, (int)*moneyp); return len; } int pqt_get_money(PGtypeArgs *args) { DECLVALUE(args); DECLLENGTH(args); PGmoney *moneyp = va_arg(args->ap, PGmoney *); CHKGETVALS(args, moneyp); if (args->format == TEXTFMT) { char buf[64]; char c, *p = buf; char *bufend = buf + sizeof(buf); for (; (c = *value) != '\0' && pap, PGuuid *); PUTNULLCHK(args, uuid); args->put.out = uuid->data; return sizeof(uuid->data); } int pqt_get_uuid(PGtypeArgs *args) { DECLVALUE(args); DECLLENGTH(args); PGuuid *uuid = va_arg(args->ap, PGuuid *); CHKGETVALS(args, uuid); if (args->format == TEXTFMT) return args->errorf(args, "text format is not supported"); if (valuel != sizeof(uuid->data)) return args->errorf(args, "invalid data: %d bytes expected, %d given", sizeof(uuid->data), valuel); memcpy(uuid->data, value, valuel); return 0; } int pqt_put_null(PGtypeArgs *args) { args->put.out = NULL; return 0; }