#include "postgres.h" #include #include "fmgr.h" PG_FUNCTION_INFO_V1(post_crypt); Datum post_crypt(PG_FUNCTION_ARGS) { char *password, *crypt(); text *ret; long now=time((long *) 0); char salt[7]; strcpy(salt,l64a(now)); salt[2]='\0'; password = crypt((char *) VARDATA(PG_GETARG_TEXT_P(0)), salt); ret= (text *) palloc(strlen(password) + VARHDRSZ); VARATT_SIZEP(ret) = strlen(password) + VARHDRSZ; memcpy(VARDATA(ret),password,strlen(password)); PG_RETURN_TEXT_P(ret); } PG_FUNCTION_INFO_V1(sql_crypt); Datum sql_crypt(PG_FUNCTION_ARGS) { char *password, *crypt(); char s[3], *user; /* *salt=VARDATA(PG_GETARG_TEXT_P(1)), */ text *ret; memcpy(s,VARDATA(PG_GETARG_TEXT_P(1)),2); user=palloc(VARATT_SIZEP(PG_GETARG_TEXT_P(0))); memcpy(user,VARDATA(PG_GETARG_TEXT_P(0)),VARATT_SIZEP(PG_GETARG_TEXT_P(0))); s[2]='\0'; password = crypt(user,s); ret= (text *) palloc(strlen(password) + VARHDRSZ); VARATT_SIZEP(ret) = strlen(password) + VARHDRSZ; memcpy(VARDATA(ret),password,strlen(password)); PG_RETURN_TEXT_P(ret); } /* Compile using something like this: gcc -I/home/postgres/postgresql-6.5.1/src/include -I/home/postgres/postgresql-6.5.1/src/backend -O2 -Wall -Wmissing-prototypes -fpic -I/home/postgres/postgresql-6.5.1/src/include -c -o encrypt.o encrypt.c gcc -shared -o encrypt.so encrypt.o And last, you create the trigger in PostgreSQL using this: create function encrypt(text) returns text as '/usr/local/pgsql/lib/encrypt.so' language 'c'; If everything is okay, you'll probably have: select encrypt('secret') working and showing: encrypt ------------ HPK1Jt2NX21G. (1 row) */