pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
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; }

view thread (3+ messages)  latest in thread

Message-ID: <20010207110038.A28372@netmonger.net>
Permalink:  ../20010207110038.A28372@netmonger.net/
Also on:    postgresql.org/message-id/20010207110038.A28372@netmonger.net

 · 

reply

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