class PLRuby::Description::Singleton_method - RDoc Documentation

# class PLRuby::Description::Singleton_method

## plruby_singleton_methods¶ ↑

Sometime it can be usefull to define methods (in pure Ruby) which can be called from a PLRuby function or a PLRuby trigger.

In this case, you have 2 possibilities

- the “stupid” way :-) :-) :-)

just close the current definition of the function (or trigger) with a end and define your singleton method without the final end

Here a small and useless example

    plruby_test=# CREATE FUNCTION tutu() RETURNS int4 AS '
    plruby_test'#     toto(1, 3) + toto(4, 4)
    plruby_test'# end
    plruby_test'#
    plruby_test'# def PLtemp.toto(a, b)
    plruby_test'#     a + b
    plruby_test'# ' LANGUAGE 'plruby';
    CREATE
    plruby_test=# select tutu();
    tutu
    ----
      12
    (1 row)

    plruby_test=#

- create a table plruby_singleton_methods with the columns (name, args, body)

At load time, PLRuby look if it exist a table plruby_singleton_methods and if found try, for each row, to define singleton methods with the template :

    def PLtemp.#{name}(#{args})
        #{body}
    end

The previous example can be written (you have a more complete example in test/plp/test_setup.sql)

    plruby_test=# SELECT * FROM plruby_singleton_methods;
    name|args|body
    ----+----+-----
    toto|a, b|a + b
    (1 row)

    plruby_test=# CREATE FUNCTION tutu() RETURNS int4 AS '
    plruby_test'#     toto(1, 3) + toto(4, 4)
    plruby_test'# ' LANGUAGE 'plruby';
    CREATE
    plruby_test=# select tutu();
    tutu
    ----
      12
    (1 row)

    plruby_test=#

- Another example, if PLRuby was compiled with –enable-conversion and it exist a column with the name '***' then it can create a singleton method from a PLRuby function

      plruby_test=# select * from plruby_singleton_methods;
       name | args | body
      ------+------+------
       ***  |      |
      (1 row)

      plruby_test=# create function add_value(int, int) returns int as '
      plruby_test'# args[0] + args[1]
      plruby_test'# ' language 'plruby';
      CREATE FUNCTION
      plruby_test=#
      plruby_test=# select add_value(10, 2);
       add_value
      -----------
              12
      (1 row)

      plruby_test=#
      plruby_test=# create function add_one(int) returns int as '
      plruby_test'# add_value(args[0], 1)
      plruby_test'# ' language 'plruby';
      CREATE FUNCTION
      plruby_test=#
      plruby_test=# select add_one(11);
       add_one
      ---------
            12
      (1 row)

      plruby_test=#