schemas/_regproc_bss.postgres.sql
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 22 Jan 2010 08:49:16 +0100
changeset 4322 f65743cc53e4
child 4328 b8112afb213c
permissions -rw-r--r--
first draft for a simple hooks based custom attribute storage, with a BytesFileSystemStorage POC implementation. Basically: * a dictionary contains maps from which attribute of which entity types are mapped to which custom storage * hooks check for one of these entity type being added/modified/deleted * read is based on the sql generator callback mecanism (used in vcsfile for instance) * all storages have the same basic interface (read, add, update, delete), and should be pluggable in a transparent way (except at migration time when one want to change from a storage to another) * the sample BytesFileSystemStorage: * may store Bytes attributes content of any entity type as file on the file system * is based on one FSPATH rql/sql function and another _fsopen only available in sql * has a dumb file name allocation algorithm

/* -*- sql -*-

   postgres specific registered procedures for the Bytes File System storage,
   require the plpythonu language installed

*/


CREATE OR REPLACE FUNCTION _fsopen(bytea) RETURNS bytea AS $$
    fpath = args[0]
    if fpath:
        try:
	    data = file(fpath, 'rb').read()
	    #/* XXX due to plpython bug we have to replace some characters... */
            return data.replace("\\", r"\134").replace("\000", r"\000").replace("'", r"\047") #'
        except Exception, ex:
	    plpy.warning('failed to get content for %s: %s', fpath, ex)
     return None
$$ LANGUAGE plpythonu
/* WITH(ISCACHABLE) XXX does postgres handle caching of large data nicely */
;;

/* fspath(eid, entity type, attribute) */
CREATE OR REPLACE FUNCTION fspath(bigint, text, text) RETURNS bytea AS $$
    pkey = 'plan%s%s' % (args[1], args[2])
    try:
        plan = SD[pkey]
    except KeyError:
        #/* then prepare and cache plan to get versioned file information from a
        # version content eid */
        plan = plpy.prepare(
            'SELECT X.cw_%s FROM cw_%s as X WHERE X.cw_eid=$1' % (args[2], args[1]),
            ['bigint'])
        SD[pkey] = plan
    return plpy.execute(plan, [args[0]])[0]
$$ LANGUAGE plpythonu
/* WITH(ISCACHABLE) XXX does postgres handle caching of large data nicely */
;;