Thread

  1. my strftime func doesn't work. please help.

    Zsolt Varga <redax@agria.hu> — 1998-06-13T07:08:38Z

    hello!
    
    I tried to make a function, like strftime in C
    called pstrtime( format, date )
    
    here's the source... but when I compile it and create the function
    under 6.3.2 first time it gives back an emty string.. after the backend 
    stops ;(
    
    please correct my faults,
    ----------------------------------------------------------------------
    #include <stdio.h>                              /* for sprintf() */
    #include <string.h>
    #include <limits.h>
    #include "postgres.h"
    #include "miscadmin.h"
    #include "utils/builtins.h"
    #include "utils/nabstime.h"
    #include "utils/datetime.h"
    #include "access/xact.h"
    
    #define JDATE_2000      2451545
    
    char       *pstrtime(char *format, DateADT val);
    
    
    char *
    pstrtime( char *format , DateADT val)
    {
            int                     year,
                                    month,
                                    day;
            struct tm * time1;
            char *sometext;
            sometext = malloc(100);
            time1 = malloc(sizeof(struct tm));
    
            j2date(val + JDATE_2000, &year, &month, &day);
    
            time1->tm_year=year;
            time1->tm_mon=month-1;
            time1->tm_mday=day;
    
            strftime(sometext,90,format,time1 );
            free(time1);
            return( sometext );
    }
    
    
    anyway how to create this function under psql ?
    C type               postgres type
    -----------------------------------
    DateADT			date
    char * 			???????????
    
    thanks,
    
    	Best regards, 
    		Redax
    .----------------------------------------------------------.
    |Zsolt Varga            | tel/fax:   +36 36 422811         |
    | AgriaComputer LTD     | email:     redax@agria.hu        |
    | System Administrator  | URL:       http://www.agria.hu/  |
    `----------------------------------------------------------'
    
    
    
  2. Re: [HACKERS] my strftime func doesn't work. please help.

    David Gould <dg@illustra.com> — 1998-06-13T20:49:50Z

    Zsolt Varga writes:
    > I tried to make a function, like strftime in C
    > called pstrtime( format, date )
    > 
    > here's the source... but when I compile it and create the function
    > under 6.3.2 first time it gives back an emty string.. after the backend 
    > stops ;(
    > 
    > please correct my faults,
    > ----------------------------------------------------------------------
    > #include <stdio.h>                              /* for sprintf() */
    > #include <string.h>
    > #include <limits.h>
    > #include "postgres.h"
    > #include "miscadmin.h"
    > #include "utils/builtins.h"
    > #include "utils/nabstime.h"
    > #include "utils/datetime.h"
    > #include "access/xact.h"
    > 
    > #define JDATE_2000      2451545
    > 
    > char       *pstrtime(char *format, DateADT val);
    > 
    > 
    > char *
    > pstrtime( char *format , DateADT val)
    > {
    >         int                     year,
    >                                 month,
    >                                 day;
    >         struct tm * time1;
    >         char *sometext;
    >         sometext = malloc(100);
    >         time1 = malloc(sizeof(struct tm));
    > 
    >         j2date(val + JDATE_2000, &year, &month, &day);
    > 
    >         time1->tm_year=year;
    >         time1->tm_mon=month-1;
    >         time1->tm_mday=day;
    > 
    >         strftime(sometext,90,format,time1 );
    >         free(time1);
    >         return( sometext );
    > }
    
    
    I don't see what is causing your failure, perhaps you might want to test
    it under gdb. But, you are using malloc() way too much which will make this
    quite slow and wastful of memory. Also, you probably should be using palloc()
    not malloc() or it will cause the backend to leak memory. For example:
    
    char *
    pstrtime( char *format , DateADT val)
    {
    	int 	year,
    		month,
    		day;
    	struct tm time1;
    	char	buf[256];
    	char	*result;
    
    	j2date(val + JDATE_2000, &year, &month, &day);
    	memset(time1, 0,  sizeof(time1));
    	time1.tm_year = year;
    	time1.tm_mon = month-1;
    	time1.tm_mday = day;
    
    	strftime(buf, 90, format, &time1);
    
    	result = palloc(1 + strlen(buf));
    	if (result)
    	   strcpy(result, buf, sizeof(buf))
    	return result;
    }
    
    -dg
    
    David Gould           dg@illustra.com            510.628.3783 or 510.305.9468
    Informix Software                      300 Lakeside Drive   Oakland, CA 94612
     - A child of five could understand this!  Fetch me a child of five.