Re: [HACKERS] I propose killing PL/Tcl's "modules" infrastructure - Mailing list pgsql-hackers
From | Andrew Dunstan |
---|---|
Subject | Re: [HACKERS] I propose killing PL/Tcl's "modules" infrastructure |
Date | |
Msg-id | 33fe0208-74df-1a03-08af-9a4f0d1ed14d@2ndQuadrant.com Whole thread Raw |
In response to | Re: [HACKERS] I propose killing PL/Tcl's "modules" infrastructure (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: [HACKERS] I propose killing PL/Tcl's "modules" infrastructure
|
List | pgsql-hackers |
On 02/25/2017 01:44 PM, Tom Lane wrote: > Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes: >> On 02/25/2017 01:14 PM, Tom Lane wrote: >>> Now, we could try to fix this bug, and add the regression test coverage >>> that the code clearly lacks, and upgrade the documentation about it from >>> its currently very sad state. But I think the right answer is just to >>> remove the feature altogether. It's evidently not being used, and it's >>> kind of insecure by design, and it would not be that hard for someone >>> to provide equivalent functionality entirely in userland if they really >>> wanted it. >> In PLv8 we added a parameter plv8.start_proc that names a parameterless >> function that's executed when plv8 is first called in each session. It >> can be used quite easily to implement something like a modules >> infrastructure - in fact I have used it to good effect for exactly that. >> Maybe something similar for pltcl would be a good thing. > Yeah, the only part that's even a bit hard to replicate in userland is > initializing the autoloading mechanism in each session. It would be > cleaner to provide a feature similar to what you describe that could > be used for that purpose as well as others. However, where does the > "parameterless function" come from? Is it a regular PLv8 (or for this > purpose PL/Tcl) function expected to be present in pg_proc? > > Yes, it's a regular PLv8 function.Here's an example. It presupposes that there is a table called plv8_modules (modname text, code text, load_on_start boolean). CREATE OR REPLACE FUNCTION public.plv8_startup() RETURNS void LANGUAGE plv8 AS $function$ if (typeof plv8_loaded_modules== 'undefined') plv8_loaded_modules = {}; load_module = function(modname) { if (plv8_loaded_modules[modname]) return; var rows = plv8.execute("SELECT code from plv8_modules " + " where modname = $1", [modname]); for (var r = 0; r < rows.length; r++) { varcode = rows[r].code; eval("(function() { " + code + "})")(); // plv8.elog(NOTICE,"loaded module "+ modname); plv8_loaded_modules[modname] = 1; } }; reload_module = function(modname) { var rows = plv8.execute("SELECT code from plv8_modules " + " where modname = $1",[modname]); for (var r = 0; r < rows.length; r++) { var code = rows[r].code; eval("(function(){ " + code + "})")(); // plv8.elog(NOTICE,"loaded module " + modname); plv8_loaded_modules[modname]= 1; } }; var rows = plv8.execute("SELECT modname, code from plv8_modules where load_on_start"); for (var r = 0; r < rows.length;r++) { var modname = rows[r].modname; if (plv8_loaded_modules[modname]) continue; var code = rows[r].code; eval("(function() { " + code + "})")(); plv8_loaded_modules[modname] = 1; // plv8.elog(NOTICE,"loaded module " + modname); }; $function$; cheers andrew -- Andrew Dunstan https://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
pgsql-hackers by date: