/*
 * PostgreSQL include file for sql_in files.
 */

/*
 * During build time, macro definitions will be inserted here.
 */
@M4_DEFINES_CODE@

/*
 * There is no way in m4 to escape the quote characters, so we change it
 * temporarily to something different than the default.
 */
m4_changequote(<!,!>)

/*
 * PythonFunction
 *
 * @param $1 directory
 * @param $2 python file (without suffix)
 * @param $3 function
 *
 * Example:
 * CREATE FUNCTION MADLIB_SCHEMA.logregr_coef(
 *     "source" VARCHAR,
 *     "depColumn" VARCHAR,
 *     "indepColumn" VARCHAR)
 * RETURNS DOUBLE PRECISION[]
 * AS $$PythonFunction(regress, logistic, compute_logregr_coef)$$
 * LANGUAGE plpythonu VOLATILE;
 */
m4_define(<!PythonFunction!>, <!
    import sys
    from inspect import getframeinfo, currentframe
    sys.path.insert(1, "EXT_PYTHON_LIBDIR")
    sys.path.insert(1, "PLPYTHON_LIBDIR")
    from $1 import $2

    # Retrieve the schema name of the current function
    # Make it available as variable: schema_madlib
    fname = getframeinfo(currentframe()).function
    foid  = fname.rsplit('_',1)[1]

    # plpython names its functions "__plpython_procedure_<function name>_<oid>",
    # of which we want the oid
    rv = plpy.execute('SELECT nspname, proname FROM pg_proc p ' \
         'JOIN pg_namespace n ON (p.pronamespace = n.oid) ' \
         'WHERE p.oid = %s' % foid, 1)

    global schema_madlib
    schema_madlib = rv[0]['nspname']

    from utilities.control import AOControl
    with AOControl(False):
        return $2.$3(**globals())
!>)

/*
 * PythonFunctionBodyOnly
 *
 * @param $1 directory
 * @param $2 python file (without suffix)
 *
 */
m4_define(<!PythonFunctionBodyOnly!>, <!
    import sys
    from inspect import getframeinfo, currentframe
    sys.path.insert(1, "EXT_PYTHON_LIBDIR")
    sys.path.insert(1, "PLPYTHON_LIBDIR")
    from $1 import $2

    # Retrieve the schema name of the current function
    # Make it available as variable: schema_madlib
    fname = getframeinfo(currentframe()).function
    foid  = fname.rsplit('_',1)[1]

    # plpython names its functions "__plpython_procedure_<function name>_<oid>",
    # of which we want the oid
    rv = plpy.execute('SELECT nspname, proname FROM pg_proc p ' \
         'JOIN pg_namespace n ON (p.pronamespace = n.oid) ' \
         'WHERE p.oid = %s' % foid, 1)

    global schema_madlib
    schema_madlib = rv[0]['nspname']
    from utilities.control import AOControl
!>)

/*
 * PythonFunctionBodyOnlyNoSchema
 *
 * @param $1 directory
 * @param $2 python file (without suffix)
 *
 */
m4_define(<!PythonFunctionBodyOnlyNoSchema!>, <!
    import sys
    sys.path.insert(1, "EXT_PYTHON_LIBDIR")
    sys.path.insert(1, "PLPYTHON_LIBDIR")
    from $1 import $2
!>)

/*
 * Change the quote character back to their defaults.
 */
m4_changequote(<!`!>,<!'!>)
