Re: [NOVICE] Re: [GENERAL] Postgres superuser priviledges - Mailing list pgsql-general

From Konstantinos Vassiliadis
Subject Re: [NOVICE] Re: [GENERAL] Postgres superuser priviledges
Date
Msg-id Pine.LNX.3.95.980721184410.28715A-400000@p05.cs.man.ac.uk
Whole thread Raw
In response to Re: [GENERAL] Postgres superuser priviledges  ("Gene Selkov, Jr." <selkovjr@mcs.anl.gov>)
List pgsql-general
Thanks in advance for your help.
I had a look at your defined type. I have some questions:
a) I don't really understand the syntax of the Makefile. I understand it
is required to do the job and I simply substituted your files with mine.
b) Do I need to place my directory with all the files under $PGROOT/src/
where $PGROOT is the postgres directory?

I have issued
 %make
from the directory where all my files are and gave
make: *** ..: Is a directory.  Stop.

I attach the C source, the SQL definitions and my Makefile.
Thanks again
Kostas



On Tue, 21 Jul 1998, Gene Selkov, Jr. wrote:

> Konstantinos Vassiliadis wrote:
> >
> > Hi
> > I am new to Postgres. I am trying to load a C function in Postgres under
> > Red Hat Linux.
> > I compile using
> >  gcc -I$PGROOT -I$PGROOT/include -I$PGROOT/src/include -c phone.c
> > to produce the object file 'phone.o'
> > Then I link using
> >  ld -Bdynamic -o phone.so phone.o -lc
> > to produce the shared object 'phone.so'.
> > (Assuming I am doing things right so far) Then from psql:
> >
> >  =>  CREATE FUNCTION phone_in(opaque)
> >      RETURNS phone
> >       AS '/home/M97/acs/vassilik/protein/phone.so'
> >      LANGUAGE 'c';
> >  NOTICE:  ProcedureCreate: type 'phone' is not yet defined
> >  CREATE
> >
> > Same for the output function, the type itself and a table that uses the
> > type.
> > Then
> >  test=> INSERT INTO test_phone VALUES ('01483-827294','0161-2242394');
> >  PQexec() -- Request was sent to backend, but backend closed the channel
> > before responding.
>
> There more than one thing that can go wrong. You are welcome to send me
> your c source and sql to create the type. I will check.
>
> > Can somebody help me? Anybody used Postgres under Linux Red Hat before?
>
> That's how is used most often, I think. You could also try to build one
> of my own extensions, found at
>
>     http://wit.mcs.anl.gov/~selkovjr/
>
> ec-type.tgz is the easiest of these.
>
>
> Gene
>
>

#include <stdio.h>
/* In the FAQ section 4.2 it says not to include this header
 file when writing user-defined functions #include "libpq-fe.h"*/
/* #include "libpq-fe.h"*/
#include "postgres.h"
#include "utils/palloc.h"
#include "utils/mcxt.h"

typedef struct {
  char natcode[6]; /* one extra for the NUL character to fit*/
  char number[8];} /* one extra for the NUL character to fit*/ 
phone;

/* These prototypes declare the requirements that Postgres places on these
   user written functions.
*/
phone *phone_in(char *outphone);
char  *phone_out(phone *inphone);
/*****************************************************************************
* Input/Output functions
 *****************************************************************************/

phone *
phone_in(char  *outphone)
{
 char nat[6],num[8]; /* one extra for the NUL character to fit*/
 phone *result;
 int arguments,i;
 
  arguments=sscanf(outphone,"%[0-9]-%[0-9]",nat,num);/* the input string stops at white space or at the maximum field
width,whichever occurs first*/
 
  printf("The function returned %d arguments\n",arguments);
  printf("national code:%s\nnumber:%s\n",nat,num);
  if (arguments!=2) 
   return NULL;
 result=(phone *) palloc(sizeof(phone));
 i=0; 
 while (nat[i]!='\0')
 {
  result->natcode[i]=nat[i];
  i++;
 }
 i=0;
 while (num[i]!='\0')
 {
  result->number[i]=num[i];
  i++;
 }
 return (result);
 }

char *
phone_out(phone *inphone)
 {
 char *result;
 if (inphone==NULL)
  return NULL;
 result=(char *)palloc(60);
 sprintf(result,"%s-%-s",inphone->natcode,inphone->number);
 return result;
 }

main()
 {

  phone *a,*b,*c;
  
  a = phone_in("01483-827294");
  printf("a = %s\n", phone_out(a));
  b = phone_in("0161-2242394");
  printf("b = %s\n", phone_out(b));
  c = phone_in("01189-887762");
  printf("c = %s\n", phone_out(c));

}
CREATE FUNCTION phone_in(opaque)
 RETURNS phone
 AS '/home/postgres/linux/src/phone/phone.so'
 LANGUAGE 'c';

CREATE FUNCTION phone_out(opaque)
 RETURNS opaque
 AS '/home/postgres/linux/src/phone/phone.so'
 LANGUAGE 'c';

CREATE TYPE phone (
 internallength =8,
 input = phone_in,
 output = phone_out);

CREATE TABLE test_phone (
 mynumber phone,
 hernumber phone);

INSERT INTO test_phone VALUES ('01483-827294','0161-2242394');
INSERT INTO test_phone VALUES ('0171-8235465','01189-887762');

SELECT * FROM test_phone; 

DROP FUNCTION phone_in(opaque);
DROP FUNCTION phone_out(opaque);
DROP TYPE phone;
DROP TABLE test_phone;
SRCDIR= .. 
include ../Makefile.global

CFLAGS+= -I$(LIBPQDIR) -I../../include

#
# DLOBJS is the dynamically-loaded object files.
#

DLOBJS= phone$(DLSUFFIX)

ifdef EXPSUFF
DLOBJS+=$(DLOBJS:.o=$(EXPSUFF))

all: $(DLOBJS)

$(DLOBJS): phone.o
        gcc -shared -o phone.so phone.o

clean:
    rm -f $(DLOBJS)
        rm -f *.o *~ *# 

pgsql-general by date:

Previous
From: Ken McGlothlen
Date:
Subject: Re: [GENERAL] Re: [HACKERS] [Fwd: SGVLLUG Oracle and Informix on Linux]
Next
From: Doug Younger
Date:
Subject: Encrypting Data Requests (& returns)?