Re: Email function using c instead of tclu - Mailing list pgsql-sql

From Christoph Haller
Subject Re: Email function using c instead of tclu
Date
Msg-id 200401160901.KAA09998@rodos
Whole thread Raw
In response to Email function using c instead of tclu  (beyaRecords - The home Urban music <uzo@beya-records.com>)
List pgsql-sql
> 
> Hi,
> I have tried without any success to get this pgmail for tclu resolved. 
> Does anyone have or know of the same sort of function as pgmail but 
> supporting c, as this is one of the installed languages I have access 
> to under postgresql. So for instance:
> 
> CREATE FUNCTION sendemail(x,x)
> ....
> LANGUAGE 'c';
> 
> regards
> 
> 
> Uzo
> 
> 
Pretty late and pretty old stuff of mine (Sep 19  2001) 
but it should still work or at least give you some hint. 

Regards, Christoph


I'm working on a HP-UX system, so some of the 
following has to be adapted, but in principle 
it's the same on every system and it works. 
First piece of code is a standalone program, 
which you should always write and test before 
you start creating C functions inside PostgreSQL. 
Second piece is your sendemail function slightly 
modified to make it run on my system. 
When I do a 
select sendemail('ch', 'was soll das?') ;
I'm receiving an email from postgres. 
Regards, Christoph 

First piece:

/*
cc -Aa -g -I/opt/pgsql/include/ -c sendemtest.c
cc sendemail.o sendemtest.o -o sendemtest
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "postgres.h"

void main() {  char buf[1024];  int ln;  text *res;  text *to;  int sendemail(text *email,text *message);
strcpy(buf,"Kissenminister Aussinger \n");  ln = strlen(buf);    res = (text *) malloc(VARHDRSZ + ln);  memset(res, 0,
VARHDRSZ+ ln);  res->vl_len = VARHDRSZ + ln;  memcpy(res->vl_dat, buf, (int) ln);    strcpy(buf, "ch");  ln =
strlen(buf);   to = (text *) malloc(VARHDRSZ + ln);  memset(to, 0, VARHDRSZ + ln);  to->vl_len = VARHDRSZ + ln;
memcpy(to->vl_dat,buf, (int) ln);    sendemail(to, res);
 
}

Second piece: 

/*
cc -Aa -g -I/opt/pgsql/include/ +z -c sendemail.c
ld -b -o sendemail.sl sendemail.o

CREATE FUNCTION sendemail(text,text) RETURNS int4AS '/fdsk2/users/ch/tools/pgsql.mydoc/sendemail.sl' LANGUAGE 'c';
DROP FUNCTION sendemail(text,text);
*/#include <stdio.h>#include <stdlib.h>#include "postgres.h"
int sendemail(text *email,text *message){    int result = 0 ; 
    char string_tosend [300];
    sprintf(string_tosend,"/usr/bin/echo \"%s\" >/tmp/mailtmp.txt\n",VARDATA(message));
    result += system(string_tosend);
    sprintf(string_tosend,"/usr/bin/mail -dt %s </tmp/mailtmp.txt \n",     VARDATA(email));
    result += system(string_tosend);
    result += system("/usr/bin/rm /tmp/mailtmp.txt");
    return result;

}



pgsql-sql by date:

Previous
From: Stephan Szabo
Date:
Subject: Re: Initially Deffered - FK
Next
From: Christoph Haller
Date:
Subject: Re: problem with function trigger