diff options
| author | Bruce Momjian | 2000-06-15 18:55:34 +0000 |
|---|---|---|
| committer | Bruce Momjian | 2000-06-15 18:55:34 +0000 |
| commit | f7f177d372750e4f766ccefdf20e1b30d66cba0a (patch) | |
| tree | d4e2a148640ba36d9a1e8cbf8557faa606ce5ba1 /contrib/spi | |
| parent | 82c4733116813ff862dade1984b6fb74149f4124 (diff) | |
/contrib patch from Karel.
Diffstat (limited to 'contrib/spi')
| -rw-r--r-- | contrib/spi/Makefile | 67 | ||||
| -rw-r--r-- | contrib/spi/README.MAX | 109 | ||||
| -rw-r--r-- | contrib/spi/autoinc.source | 6 | ||||
| -rw-r--r-- | contrib/spi/insert_username.source | 6 | ||||
| -rw-r--r-- | contrib/spi/moddatetime.source | 6 | ||||
| -rw-r--r-- | contrib/spi/refint.source | 14 | ||||
| -rw-r--r-- | contrib/spi/timetravel.source | 12 |
7 files changed, 51 insertions, 169 deletions
diff --git a/contrib/spi/Makefile b/contrib/spi/Makefile index 639a6247dae..efc99a5df91 100644 --- a/contrib/spi/Makefile +++ b/contrib/spi/Makefile @@ -1,29 +1,64 @@ +# +# $Header: /cvsroot/pgsql/contrib/spi/Makefile,v 1.13 2000/06/15 18:55:17 momjian Exp $ +# -SRCDIR= ../../src +TOPDIR=../.. -include $(SRCDIR)/Makefile.global +include ../Makefile.global -CFLAGS+= $(CFLAGS_SL) +NAME = + +PROGRAM = +OBJS = autoinc.o insert_username.o moddatetime.o refint.o timetravel.o +DOCS = spi.doc +SQLS = $(OBJS:.o=.sql) +BINS = +EXAMPLES= $(OBJS:.o=.example) +MODS = $(OBJS:.o=$(DLSUFFIX)) + +CFLAGS += -I. $(CFLAGS_SL) ifdef REFINT_VERBOSE CFLAGS+= -DREFINT_VERBOSE endif -TARGETS= refint$(DLSUFFIX) refint.sql \ - timetravel$(DLSUFFIX) timetravel.sql \ - autoinc$(DLSUFFIX) autoinc.sql \ - moddatetime$(DLSUFFIX) moddatetime.sql \ - insert_username$(DLSUFFIX) insert_username.sql +OTHER_CLEAN = $(SQLS) + +all: $(MODS) $(SQLS) + +%.sql: %.sql.in + $(SED) "s|MODULE_PATHNAME|$(CONTRIB_MODDIR)/$@|" < $< > $@ + +install: install_doc install_sql install_mod install_example + +install_doc: + for inst_file in $(DOCS); do \ + $(INSTALL) $(INSTL_LIB_OPTS) $$inst_file $(CONTRIB_DOCDIR); \ + done -CLEANFILES+= $(TARGETS) +install_sql: + for inst_file in $(SQLS); do \ + $(INSTALL) $(INSTL_LIB_OPTS) $$inst_file $(CONTRIB_SQLDIR); \ + done -all:: $(TARGETS) +install_mod: + for inst_file in $(MODS); do \ + $(INSTALL) $(INSTL_SHLIB_OPTS) $$inst_file $(CONTRIB_MODDIR); \ + done -%.sql: %.source - rm -f $@; \ - C=`pwd`; \ - sed -e "s:_OBJWD_:$$C:g" \ - -e "s:_DLSUFFIX_:$(DLSUFFIX):g" < $< > $@ +install_example: + for inst_file in $(EXAMPLES); do \ + $(INSTALL) $(INSTL_LIB_OPTS) $$inst_file $(CONTRIB_EXAMPLESDIR); \ + done + +depend dep: + $(CC) -MM -MG $(CFLAGS) *.c > depend clean: - rm -f $(TARGETS) *.o + $(RM) *~ $(OBJS) $(MODS) $(PROGRAM) depend $(OTHER_CLEAN) core log + +ifeq (depend,$(wildcard depend)) +include depend +endif + + diff --git a/contrib/spi/README.MAX b/contrib/spi/README.MAX index 025ed4925ef..e69de29bb2d 100644 --- a/contrib/spi/README.MAX +++ b/contrib/spi/README.MAX @@ -1,109 +0,0 @@ - -Here are general trigger functions provided as workable examples -of using SPI and triggers. "General" means that functions may be -used for defining triggers for any tables but you have to specify -table/field names (as described below) while creating a trigger. - -1. refint.c - functions for implementing referential integrity. - -check_primary_key () is to used for foreign keys of a table. - - You are to create trigger (BEFORE INSERT OR UPDATE) using this -function on a table referencing another table. You are to specify -as function arguments: triggered table column names which correspond -to foreign key, referenced table name and column names in referenced -table which correspond to primary/unique key. - You may create as many triggers as you need - one trigger for -one reference. - -check_foreign_key () is to used for primary/unique keys of a table. - - You are to create trigger (BEFORE DELETE OR UPDATE) using this -function on a table referenced by another table(s). You are to specify -as function arguments: number of references for which function has to -performe checking, action if referencing key found ('cascade' - to delete -corresponding foreign key, 'restrict' - to abort transaction if foreign keys -exist, 'setnull' - to set foreign key referencing primary/unique key -being deleted to null), triggered table column names which correspond -to primary/unique key, referencing table name and column names corresponding -to foreign key (, ... - as many referencing tables/keys as specified -by first argument). - Note, that NOT NULL constraint and unique index have to be defined by -youself. - - There are examples in refint.example and regression tests -(sql/triggers.sql). - - To CREATE FUNCTIONs use refint.sql (will be made by gmake from -refint.source). - - - - -# Excuse me for my bad english. Massimo Lambertini -# -# -# New check foreign key -# -I think that cascade mode is to be considered like that the operation over -main table is to be made also in referenced table . -When i Delete , i must delete from referenced table , -but when i update , i update referenced table and not delete like unmodified refint.c . - -I made a new version of refint.c that when i update it check the type of modified key ( if is a text , char() i -added '') and then create a update query that do the right thing . - -For my point of view that policy is helpfull because i do not have in referenced table -loss of information . - - -In preprocessor subdir i have placed a little utility that from a SQL92 table definition, -it create all trigger for foreign key . - - -the schema that i use to analyze the problem is this - -create table -A -( key int4 not null primary key ,..., -) ; - -create table -REFERENCED_B -( key int 4 , ... , -foreign key ( key ) references A -- -); - - --- --- Trigger for REFERENCED_B --- - -CREATE INDEX I_REFERENCED_B_KEY ON REFERENCED_B ( KEY ) ; - -CREATE TRIGGER T_P_REFERENCED_B_A BEFORE INSERT OR UPDATE ON REFERENCED_B FOR EACH ROW -EXECUTE PROCEDURE -check_primary_key('KEY','A','KEY' ); - -CREATE TRIGGER T_F_D_A_REFERENCED_B BEFORE DELETE ON A FOR EACH ROW -EXECUTE PROCEDURE -check_foreign_key(1,'cascade','KEY','REFERENCED_B ','KEY' ); - -CREATE TRIGGER T_F_U_A_REFERENCED_B AFTER UPDATE ON A FOR EACH ROW -EXECUTE PROCEDURE -check_foreign_key(1,'cascade','KEY','REFERENCED_B ','KEY' ); - --- ******************************** - -I write TRIGGER T_F_U_A_REFERENCED_B ( AFTER ) and not BEFORE because if i set -BEFORE , when i try to modify ( update ) a key of A , i start a execution of TRIGGER T_P_REFERENCED_B_A -( check_primary_key) before the real modification of key in A , then the execution of ( check_primary_key) return -not ok. -With AFTER Clausole i modify first key of A then a update the value of referenced table REFERENCED_B. - -Try also the new_example.sql to view the modified policy. -I wish that my explain of problem is quite clear . -If there is miss understanding ( cause my bad english ) please send email to massimo.lambertini@everex.it - - - diff --git a/contrib/spi/autoinc.source b/contrib/spi/autoinc.source index 3423ec92ebe..e69de29bb2d 100644 --- a/contrib/spi/autoinc.source +++ b/contrib/spi/autoinc.source @@ -1,6 +0,0 @@ -DROP FUNCTION autoinc(); - -CREATE FUNCTION autoinc() - RETURNS opaque - AS '_OBJWD_/autoinc_DLSUFFIX_' - LANGUAGE 'newC'; diff --git a/contrib/spi/insert_username.source b/contrib/spi/insert_username.source index 4b7a684305f..e69de29bb2d 100644 --- a/contrib/spi/insert_username.source +++ b/contrib/spi/insert_username.source @@ -1,6 +0,0 @@ -DROP FUNCTION insert_username(); - -CREATE FUNCTION insert_username() - RETURNS opaque - AS '_OBJWD_/insert_username_DLSUFFIX_' - LANGUAGE 'newC'; diff --git a/contrib/spi/moddatetime.source b/contrib/spi/moddatetime.source index 2aafedb38b2..e69de29bb2d 100644 --- a/contrib/spi/moddatetime.source +++ b/contrib/spi/moddatetime.source @@ -1,6 +0,0 @@ -DROP FUNCTION moddatetime(); - -CREATE FUNCTION moddatetime() - RETURNS opaque - AS '_OBJWD_/moddatetime_DLSUFFIX_' - LANGUAGE 'newC'; diff --git a/contrib/spi/refint.source b/contrib/spi/refint.source index 04323446617..e69de29bb2d 100644 --- a/contrib/spi/refint.source +++ b/contrib/spi/refint.source @@ -1,14 +0,0 @@ -DROP FUNCTION check_primary_key (); -DROP FUNCTION check_foreign_key (); - -CREATE FUNCTION check_primary_key () - RETURNS opaque - AS '_OBJWD_/refint_DLSUFFIX_' - LANGUAGE 'newC' -; - -CREATE FUNCTION check_foreign_key () - RETURNS opaque - AS '_OBJWD_/refint_DLSUFFIX_' - LANGUAGE 'newC' -; diff --git a/contrib/spi/timetravel.source b/contrib/spi/timetravel.source index 8012cb93c20..e69de29bb2d 100644 --- a/contrib/spi/timetravel.source +++ b/contrib/spi/timetravel.source @@ -1,12 +0,0 @@ -DROP FUNCTION timetravel(); -DROP FUNCTION set_timetravel(name, int4); - -CREATE FUNCTION timetravel() - RETURNS opaque - AS '_OBJWD_/timetravel_DLSUFFIX_' - LANGUAGE 'newC'; - -CREATE FUNCTION set_timetravel(name, int4) - RETURNS int4 - AS '_OBJWD_/timetravel_DLSUFFIX_' - LANGUAGE 'newC' WITH (isStrict); |
