-- Funktionen um Laender zu verwalten --
-- [
create function "chk_land" (text,varchar(3),varchar(4))
    returns int4 as '
        /* 
         * chk_land(land, lnd_kz, vorwahl_l)
         *
         * ueberpruefen ob das Land schon in der DB gespeichert ist.
         *
         * returns: -1: falsche Parameter
         *          -2: Inkonsistenz endeckt. Es existiert bereits ein
         *              Land mit dem einer, aber nicht alle der Parameter 
         *              uebereinstimmen
         *          0: Land existiert noch nicht in der DB
         *          >0: Land existiert bereits, gibt id_land zurueck.
         */

        DECLARE
            idl adresse.land%ROWTYPE;
        BEGIN
            IF $1 IS NULL OR $1 = '''' OR
               $2 IS NULL OR $2 = '''' OR
               $3 IS NULL OR $3 = '''' THEN
                RETURN -1;
            END IF;

            /*
             * Jeder der Teile is unique, existiert also einer der Teile
             * schon aber mit anderen Partnern dann is ein Fehler aufgetreten.
             */
            select INTO idl * from adresse.land where
                land = $1 or
                lnd_kz = $2 or
                vorwahl_l = $3;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                IF idl.land <> $1 OR idl.lnd_kz <> $2 OR
                   idl.vorwahl_l <> $3 THEN
                    RETURN -2;
                END IF;
            END IF;

            RETURN idl._id_;
        END;
    ' language 'plpgsql';

create function "ins_land" (text,varchar(3),varchar(4)) 
    returns int4 as '
        /* 
         * ins_land(land, lnd_kz, vorwahl_l)
         *
         * fuegt ein Land in die DB ein sofern es nicht schon existiert,
         * inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
         * sind.
         *
         * returns: 0: wenn das Land nicht eingefuegt werden kann
         *          >0: wenn das Land eingefuegt werden konnte oder bereits
         *              existierte, gibt id_land zurueck.
         */

        DECLARE
            id_land adresse.land._id_%TYPE;
        BEGIN
            /* 
             * Daten ueberpruefen (siehe chk_land) 
             */
            select INTO id_land adresse.chk_land($1, $2, $3);

            IF id_land < 0 THEN
                RETURN 0;
            ELSE
                IF id_land = 0 THEN
                    insert into adresse.land (land, lnd_kz, vorwahl_l)
                        values ($1, $2, $3);

                    select INTO id_land adresse.chk_land($1, $2, $3);
                END IF;
            END IF;

            RETURN id_land;
        END;
    ' language 'plpgsql';

create function "id_land_by_land" (text)
    returns int4 as '
        /* 
         * get_id_land_by_land(land)
         *
         * Ermittelt die id (id_land) eines in der DB enthaltenen Landes 
         * anhand seiner Bezeuchnung (land.land) 
         *
         * returns: 0: wenn das Land nicht eingefuegt werden kann
         *          >0: wenn das Land gefunden wurde, gibt id_land zurueck.
         */

        DECLARE
            idl adresse.land._id_%TYPE;
        BEGIN
            select INTO idl _id_ from adresse.land where
                land = $1;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                RETURN idl;
            END IF;
        END;
    ' language 'plpgsql';

create function "id_land_by_lnd_kz" (varchar(3))
    returns int4 as '
        /* 
         * get_id_land_by_lnd_kz(lnd_kz)
         *
         * Ermittelt die id (id_land) eines in der DB enthaltenen Landes 
         * anhand des internationalen Kennzeichens (land.lnd_kz) 
         *
         * returns: 0: wenn das Land nicht eingefuegt werden kann
         *          >0: wenn das Land gefunden wurde, gibt id_land zurueck.
         */

        DECLARE
            idl adresse.land._id_%TYPE;
        BEGIN
            select INTO idl _id_ from adresse.land where
                lnd_kz = $1;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                RETURN idl;
            END IF;
        END;
    ' language 'plpgsql';

create function "id_land_by_vorwahl_l" (varchar(4))
    returns int4 as '
        /* 
         * get_id_land_by_vorwahl_l(vorwahl_l)
         *
         * Ermittelt die id (id_land) eines in der DB enthaltenen Landes 
         * anhand die internationalen Laendervorwahl (land.land_kz) 
         *
         * returns: 0: wenn das Land nicht eingefuegt werden kann
         *          >0: wenn das Land gefunden wurde, gibt id_land zurueck.
         */

        DECLARE
            idl adresse.land._id_%TYPE;
        BEGIN
            select INTO idl _id_ from adresse.land where
                vorwahl_l = $1;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                RETURN idl;
            END IF;
        END;
    ' language 'plpgsql';
-- ]
-- Ende Laender --
