summaryrefslogtreecommitdiff
path: root/sql/pgq/old/pgq.insert_event_raw.sql
blob: 3de134b8a1aba8197f34ccb20e6fd08a9accc65f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
create or replace function pgq.insert_event_raw(
        queue_name text, ev_id bigint, ev_time timestamptz,
        ev_owner integer, ev_retry integer, ev_type text, ev_data text,
        ev_extra1 text, ev_extra2 text, ev_extra3 text, ev_extra4 text)
returns bigint as $$
# -- ----------------------------------------------------------------------
# -- Function: pgq.insert_event_raw(11)
# --
# --    Deprecated function, replaced by C code in pgq_lowlevel.so.
# --    
# --    Actual event insertion.  Used also by retry queue maintenance.
# --
# -- Parameters:
# --      queue_name      - Name of the queue
# --      ev_id           - Event ID.  If NULL, will be taken from seq.
# --      ev_time         - Event creation time.
# --      ev_owner        - Subscription ID when retry event. If NULL, the event is for everybody.
# --      ev_retry        - Retry count. NULL for first-time events.
# --      ev_type         - user data
# --      ev_data         - user data
# --      ev_extra1       - user data
# --      ev_extra2       - user data
# --      ev_extra3       - user data
# --      ev_extra4       - user data
# --
# -- Returns:
# --      Event ID.
# -- ----------------------------------------------------------------------

    # load args
    queue_name = args[0]
    ev_id = args[1]
    ev_time = args[2]
    ev_owner = args[3]
    ev_retry = args[4]
    ev_type = args[5]
    ev_data = args[6]
    ev_extra1 = args[7]
    ev_extra2 = args[8]
    ev_extra3 = args[9]
    ev_extra4 = args[10]

    if not "cf_plan" in SD:
        # get current event table
        q = "select queue_data_pfx, queue_cur_table, queue_event_seq "\
            " from pgq.queue where queue_name = $1"
        SD["cf_plan"] = plpy.prepare(q, ["text"])

        # get next id
        q = "select nextval($1) as id"
        SD["seq_plan"] = plpy.prepare(q, ["text"])

    # get queue config
    res = plpy.execute(SD["cf_plan"], [queue_name])
    if len(res) != 1:
        plpy.error("Unknown event queue: %s" % (queue_name))
    tbl_prefix = res[0]["queue_data_pfx"]
    cur_nr = res[0]["queue_cur_table"]
    id_seq = res[0]["queue_event_seq"]

    # get id - bump seq even if id is given
    res = plpy.execute(SD['seq_plan'], [id_seq])
    if ev_id is None:
        ev_id = res[0]["id"]

    # create plan for insertion
    ins_plan = None
    ins_key = "ins.%s" % (queue_name)
    if ins_key in SD:
        nr, ins_plan = SD[ins_key]
        if nr != cur_nr:
            ins_plan = None
    if ins_plan == None:
        q = "insert into %s_%s (ev_id, ev_time, ev_owner, ev_retry,"\
            " ev_type, ev_data, ev_extra1, ev_extra2, ev_extra3, ev_extra4)"\
            " values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)" % (
            tbl_prefix, cur_nr)
        types = ["int8", "timestamptz", "int4", "int4", "text",
                 "text", "text", "text", "text", "text"]
        ins_plan = plpy.prepare(q, types)
        SD[ins_key] = (cur_nr, ins_plan)

    # insert the event
    plpy.execute(ins_plan, [ev_id, ev_time, ev_owner, ev_retry, ev_type, ev_data,
                            ev_extra1, ev_extra2, ev_extra3, ev_extra4])

    # done
    return ev_id

$$ language plpythonu;  -- event inserting needs no special perms