From: Christopher Masto <chris@netmonger.net>
To: pgsql-interfaces@postgresql.org
Subject: An strftime function, and function name question
Date: Wed, 7 Feb 2001 11:00:38 -0500
Message-ID: <20010207110038.A28372@netmonger.net> (raw)
First of all, I have attached a simple-minded library I created to wrap
the C strftime() function, since we needed some better date formatting
and it seemed less cumbersome to do it on the server end. I gave up C
for Perl a couple of years ago, so I may be a bit rusty, but I tried to
be careful with the buffers and strings.
In any case, it works for my purposes. I did also create a new typecast:
CREATE FUNCTION int4 (timestamp) RETURNS int4 AS
'SELECT date_part(''epoch'', $1)::int4;' LANGUAGE 'sql';
because I wanted to be able to pass the Unix epoch time in, but I
didn't know what timestamps are internally.
My question is about naming. I would like to be able to call this
function 'strftime'. I've never created libraries before so it may
just be a lack of linker knowledge, but I couldn't see how to do that.
If I call it strftime, it obviously conflicts with the real strftime().
It would be nice if there were something like:
CREATE FUNCTION strftime(int4, varchar) RETURNS varchar AS
'/usr/local/pgsql/lib/strftime.so' LANGUAGE 'c'
USING C FUNCTION 'c_strftime';
I.e. some way to say "here's the name of the function in the library".
If there is, I didn't find it.
--
Christopher Masto Senior Network Monkey NetMonger Communications
chris@netmonger.net info@netmonger.net http://www.netmonger.net
Free yourself, free your machine, free the daemon -- http://www.freebsd.org/Attachments:strftime.c (text/plain, 1.0K) download
#include <string.h>
#include <time.h>
#include "postgres.h"
#include "utils/palloc.h"
typedef struct varlena varchar;
varchar *c_strftime(int now, varchar *fmt_in)
{
char tmpbuf[128];
char *fmt;
struct tm *mytm;
int len;
int32 new_text_size;
varchar *new_text;
/* Copy incoming format string to null-terminated C string */
fmt = (char *)palloc(VARSIZE(fmt_in) - VARHDRSZ + 1);
memcpy((void *)fmt, (void *)VARDATA(fmt_in), VARSIZE(fmt_in) - VARHDRSZ);
fmt[VARSIZE(fmt_in) - VARHDRSZ] = '\0';
/* Call strftime(). XXX portability and buffer complications; see
Perl source POSIX.xs for ideas. */
mytm = localtime((const time_t *)&now);
len = strftime(tmpbuf, sizeof tmpbuf, fmt, mytm);
pfree(fmt);
/* Copy the output into a Postgres varchar */
new_text_size = len + VARHDRSZ;
new_text = (varchar *)palloc(new_text_size);
memset((void *)new_text, 0, new_text_size);
VARSIZE(new_text) = new_text_size;
if (len) {
memcpy((void *)VARDATA(new_text), (void *)tmpbuf, len);
}
return new_text;
}
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-interfaces@postgresql.org
Cc: chris@netmonger.net
Subject: Re: An strftime function, and function name question
In-Reply-To: <20010207110038.A28372@netmonger.net>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox