| rev | 
   line source | 
| 
jbe@302
 | 
     1 local function format_time(db_time)
 | 
| 
jbe@302
 | 
     2   return string.format("%.1f ms", real_time * 1000)
 | 
| 
jbe@302
 | 
     3 end
 | 
| 
jbe@302
 | 
     4 
 | 
| 
jbe@302
 | 
     5 local function format_triple(real_time, proc_time, db_time)
 | 
| 
jbe@302
 | 
     6   if proc_time and db_time then
 | 
| 
jbe@302
 | 
     7     return string.format(
 | 
| 
jbe@302
 | 
     8       "u=%.1f d=%.1f t=%.1f",
 | 
| 
jbe@302
 | 
     9       1000 * db_time,
 | 
| 
jbe@302
 | 
    10       1000 * proc_time,
 | 
| 
jbe@302
 | 
    11       1000 * real_time
 | 
| 
jbe@302
 | 
    12     )
 | 
| 
jbe@299
 | 
    13   else
 | 
| 
jbe@299
 | 
    14   end
 | 
| 
jbe@295
 | 
    15 end
 | 
| 
jbe@295
 | 
    16 
 | 
| 
jbe/bsw@0
 | 
    17 local function open(class)
 | 
| 
jbe/bsw@0
 | 
    18   slot.put('<li class="trace_' .. class .. '">')
 | 
| 
jbe/bsw@0
 | 
    19 end
 | 
| 
bsw@115
 | 
    20 local function open_head(node)
 | 
| 
jbe/bsw@0
 | 
    21   slot.put('<div class="trace_head">')
 | 
| 
jbe@299
 | 
    22   if node.start_real_time and node.stop_real_time then
 | 
| 
jbe@299
 | 
    23     local total_real_time = node.stop_real_time - node.start_real_time
 | 
| 
jbe@299
 | 
    24     local total_proc_time = node.stop_proc_time - node.start_proc_time
 | 
| 
jbe@302
 | 
    25     local total_db_time   = node.db_time
 | 
| 
jbe@299
 | 
    26     local child_real_time = 0
 | 
| 
jbe@299
 | 
    27     local child_proc_time = 0
 | 
| 
jbe@302
 | 
    28     local child_db_time   = 0
 | 
| 
bsw@115
 | 
    29     for i, child in ipairs(node) do
 | 
| 
jbe@299
 | 
    30       if child.start_real_time then
 | 
| 
jbe@299
 | 
    31         child_real_time = child_real_time + child.stop_real_time - child.start_real_time
 | 
| 
jbe@299
 | 
    32         child_proc_time = child_proc_time + child.stop_proc_time - child.start_proc_time
 | 
| 
jbe@302
 | 
    33         child_db_time   = child_db_time   + child.db_time
 | 
| 
bsw@115
 | 
    34       end
 | 
| 
bsw@115
 | 
    35     end
 | 
| 
jbe@299
 | 
    36     local real_time = total_real_time - child_real_time
 | 
| 
jbe@299
 | 
    37     local proc_time = total_proc_time - child_proc_time
 | 
| 
jbe@302
 | 
    38     local db_time   = total_db_time   - child_db_time
 | 
| 
jbe@299
 | 
    39     slot.put(
 | 
| 
jbe@299
 | 
    40       '<div class="time">',
 | 
| 
jbe@299
 | 
    41       '<span class="duration_label">this:</span>',
 | 
| 
jbe@299
 | 
    42       ' ',
 | 
| 
jbe@302
 | 
    43       '<span class="duration">', format_triple(real_time, proc_time, db_time), '</span>',
 | 
| 
jbe@299
 | 
    44       ' | ',
 | 
| 
jbe@299
 | 
    45       '<span class="child_duration_label">children:</span>',
 | 
| 
jbe@299
 | 
    46       ' ',
 | 
| 
jbe@302
 | 
    47       '<span class="child_duration">', format_triple(child_real_time, child_proc_time, db_time), '</span>',
 | 
| 
jbe@299
 | 
    48       ' | ',
 | 
| 
jbe@299
 | 
    49       '<span class="total_duration_label">total:</span>',
 | 
| 
jbe@299
 | 
    50       ' ',
 | 
| 
jbe@302
 | 
    51       '<span class="total_duration">', format_triple(total_real_time, total_proc_time, db_time), '</span>',
 | 
| 
jbe@299
 | 
    52       '</div>'
 | 
| 
jbe@299
 | 
    53     )
 | 
| 
bsw@115
 | 
    54   end
 | 
| 
jbe/bsw@0
 | 
    55 end
 | 
| 
jbe/bsw@0
 | 
    56 local function close_head()
 | 
| 
jbe/bsw@0
 | 
    57   slot.put('</div>')
 | 
| 
jbe/bsw@0
 | 
    58 end
 | 
| 
jbe/bsw@0
 | 
    59 local function close()
 | 
| 
jbe/bsw@0
 | 
    60   slot.put('</li>')
 | 
| 
jbe/bsw@0
 | 
    61 end
 | 
| 
jbe/bsw@0
 | 
    62 function trace._render_sub_tree(node)
 | 
| 
jbe/bsw@0
 | 
    63   local function render_children(tail)
 | 
| 
jbe/bsw@0
 | 
    64     if #node > 0 then
 | 
| 
jbe/bsw@0
 | 
    65       slot.put('<ul class="trace_list">')
 | 
| 
jbe/bsw@0
 | 
    66       for idx, child in ipairs(node) do
 | 
| 
jbe/bsw@0
 | 
    67         trace._render_sub_tree(child)
 | 
| 
jbe/bsw@0
 | 
    68       end
 | 
| 
jbe/bsw@0
 | 
    69       if tail then
 | 
| 
jbe/bsw@0
 | 
    70         slot.put(tail)
 | 
| 
jbe/bsw@0
 | 
    71       end
 | 
| 
jbe/bsw@0
 | 
    72       slot.put("</ul>")
 | 
| 
jbe/bsw@0
 | 
    73     end
 | 
| 
jbe/bsw@0
 | 
    74   end
 | 
| 
jbe/bsw@0
 | 
    75   local function close_with_children()
 | 
| 
jbe/bsw@0
 | 
    76     close_head()
 | 
| 
jbe/bsw@0
 | 
    77     render_children()
 | 
| 
jbe/bsw@0
 | 
    78     close()
 | 
| 
jbe/bsw@0
 | 
    79   end
 | 
| 
jbe/bsw@0
 | 
    80   local node_type = node.type
 | 
| 
jbe/bsw@0
 | 
    81   if node_type == "root" then
 | 
| 
jbe/bsw@0
 | 
    82     render_children()
 | 
| 
jbe/bsw@0
 | 
    83   elseif node_type == "debug" then
 | 
| 
jbe/bsw@0
 | 
    84     open("debug")
 | 
| 
jbe/bsw@0
 | 
    85     slot.put(encode.html(node.message))
 | 
| 
jbe/bsw@0
 | 
    86     close()
 | 
| 
poelzi@31
 | 
    87   elseif node_type == "debug_table" then
 | 
| 
poelzi@31
 | 
    88     open("debug")
 | 
| 
poelzi@31
 | 
    89     slot.put("<table>")
 | 
| 
poelzi@31
 | 
    90     if type(node.message) == "table" then
 | 
| 
poelzi@31
 | 
    91       for k, v in pairs(node.message) do
 | 
| 
jbe@45
 | 
    92         slot.put("<tr><td>", encode.html(tostring(k)), "</td><td>", encode.html(tostring(v)), "</td></tr>")
 | 
| 
poelzi@31
 | 
    93       end
 | 
| 
poelzi@31
 | 
    94       slot.put("</table>")
 | 
| 
poelzi@31
 | 
    95     else
 | 
| 
poelzi@31
 | 
    96       slot.put("debug_table: not of table type")
 | 
| 
poelzi@31
 | 
    97     end
 | 
| 
poelzi@31
 | 
    98     close()
 | 
| 
poelzi@29
 | 
    99   elseif node_type == "traceback" then
 | 
| 
poelzi@29
 | 
   100     open("debug")
 | 
| 
poelzi@29
 | 
   101     slot.put('<pre>')
 | 
| 
poelzi@29
 | 
   102     slot.put(encode.html(node.message))
 | 
| 
poelzi@29
 | 
   103     slot.put('</pre>')
 | 
| 
poelzi@29
 | 
   104     close()
 | 
| 
jbe/bsw@0
 | 
   105   elseif node_type == "request" then
 | 
| 
jbe/bsw@0
 | 
   106     open("request")
 | 
| 
bsw@115
 | 
   107     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   108     slot.put("REQUESTED")
 | 
| 
jbe/bsw@0
 | 
   109     if node.view then
 | 
| 
jbe/bsw@0
 | 
   110       slot.put(" VIEW")
 | 
| 
jbe/bsw@0
 | 
   111     elseif node.action then
 | 
| 
jbe/bsw@0
 | 
   112       slot.put(" ACTION")
 | 
| 
jbe/bsw@0
 | 
   113     end
 | 
| 
jbe/bsw@0
 | 
   114     slot.put(
 | 
| 
jbe/bsw@0
 | 
   115       ": ",
 | 
| 
jbe/bsw@0
 | 
   116       encode.html(node.module),
 | 
| 
jbe/bsw@0
 | 
   117       "/",
 | 
| 
jbe/bsw@0
 | 
   118       encode.html(node.view or node.action)
 | 
| 
jbe/bsw@0
 | 
   119     )
 | 
| 
jbe/bsw@0
 | 
   120     close_with_children()
 | 
| 
jbe/bsw@0
 | 
   121   elseif node_type == "config" then
 | 
| 
jbe/bsw@0
 | 
   122     open("config")
 | 
| 
bsw@115
 | 
   123     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   124     slot.put('Configuration "', encode.html(node.name), '"')
 | 
| 
jbe/bsw@0
 | 
   125     close_with_children()
 | 
| 
jbe/bsw@0
 | 
   126   elseif node_type == "filter" then
 | 
| 
jbe/bsw@0
 | 
   127     open("filter")
 | 
| 
bsw@115
 | 
   128     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   129     slot.put(encode.html(node.path))
 | 
| 
jbe/bsw@0
 | 
   130     close_with_children()
 | 
| 
jbe/bsw@0
 | 
   131   elseif node_type == "view" then
 | 
| 
jbe/bsw@0
 | 
   132     open("view")
 | 
| 
bsw@115
 | 
   133     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   134     slot.put(
 | 
| 
jbe/bsw@0
 | 
   135       "EXECUTE VIEW: ",
 | 
| 
jbe/bsw@0
 | 
   136       encode.html(node.module),
 | 
| 
jbe/bsw@0
 | 
   137       "/",
 | 
| 
jbe/bsw@0
 | 
   138       encode.html(node.view)
 | 
| 
jbe/bsw@0
 | 
   139     )
 | 
| 
jbe/bsw@0
 | 
   140     close_with_children()
 | 
| 
jbe/bsw@0
 | 
   141   elseif node_type == "action" then
 | 
| 
jbe/bsw@0
 | 
   142     if
 | 
| 
jbe/bsw@0
 | 
   143       node.status and (
 | 
| 
jbe/bsw@0
 | 
   144         node.status == "ok" or
 | 
| 
jbe/bsw@0
 | 
   145         string.find(node.status, "^ok_")
 | 
| 
jbe/bsw@0
 | 
   146       )
 | 
| 
jbe/bsw@0
 | 
   147     then
 | 
| 
jbe/bsw@0
 | 
   148       open("action_success")
 | 
| 
jbe/bsw@0
 | 
   149     elseif
 | 
| 
jbe/bsw@0
 | 
   150       node.status and (
 | 
| 
jbe/bsw@0
 | 
   151         node.status == "error" or
 | 
| 
jbe/bsw@0
 | 
   152         string.find(node.status, "^error_")
 | 
| 
jbe/bsw@0
 | 
   153       )
 | 
| 
jbe/bsw@0
 | 
   154     then
 | 
| 
jbe/bsw@0
 | 
   155       open("action_softfail")
 | 
| 
jbe/bsw@0
 | 
   156     else
 | 
| 
jbe/bsw@0
 | 
   157       open("action_neutral")
 | 
| 
jbe/bsw@0
 | 
   158     end
 | 
| 
bsw@115
 | 
   159     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   160     slot.put(
 | 
| 
jbe/bsw@0
 | 
   161       "EXECUTE ACTION: ",
 | 
| 
jbe/bsw@0
 | 
   162       encode.html(node.module),
 | 
| 
jbe/bsw@0
 | 
   163       "/",
 | 
| 
jbe/bsw@0
 | 
   164       encode.html(node.action)
 | 
| 
jbe/bsw@0
 | 
   165     )
 | 
| 
jbe/bsw@0
 | 
   166     close_head()
 | 
| 
jbe/bsw@0
 | 
   167     if node.status == "softfail" then
 | 
| 
jbe/bsw@0
 | 
   168       render_children(
 | 
| 
jbe/bsw@0
 | 
   169         '<li class="trace_action_status">Status code: "' ..
 | 
| 
jbe/bsw@0
 | 
   170         encode.html(node.failure_code) ..
 | 
| 
jbe/bsw@0
 | 
   171         '"</li>'
 | 
| 
jbe/bsw@0
 | 
   172       )
 | 
| 
jbe/bsw@0
 | 
   173     else
 | 
| 
jbe/bsw@0
 | 
   174       render_children()
 | 
| 
jbe/bsw@0
 | 
   175     end
 | 
| 
jbe/bsw@0
 | 
   176     close()
 | 
| 
jbe/bsw@0
 | 
   177   elseif node_type == "redirect" then
 | 
| 
jbe/bsw@0
 | 
   178     open("redirect")
 | 
| 
bsw@115
 | 
   179     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   180     slot.put("303 REDIRECT TO VIEW: ", encode.html(node.module), "/", encode.html(node.view))
 | 
| 
jbe/bsw@0
 | 
   181     close_with_children()
 | 
| 
jbe/bsw@0
 | 
   182   elseif node_type == "forward" then
 | 
| 
jbe/bsw@0
 | 
   183     open("forward")
 | 
| 
bsw@115
 | 
   184     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   185     slot.put("INTERNAL FORWARD TO VIEW: ", encode.html(node.module), "/", encode.html(node.view))
 | 
| 
jbe/bsw@0
 | 
   186     close_with_children()
 | 
| 
jbe@223
 | 
   187   --[[
 | 
| 
jbe/bsw@0
 | 
   188   elseif node_type == "exectime" then
 | 
| 
jbe/bsw@0
 | 
   189     open("exectime")
 | 
| 
bsw@115
 | 
   190     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   191     slot.put(
 | 
| 
jbe/bsw@0
 | 
   192       "Finished after " ..
 | 
| 
jbe@65
 | 
   193       string.format("%.1f", extos.monotonic_hires_time() * 1000) ..
 | 
| 
jbe/bsw@0
 | 
   194       ' ms (' ..
 | 
| 
jbe/bsw@0
 | 
   195       string.format("%.1f", os.clock() * 1000) ..
 | 
| 
jbe/bsw@0
 | 
   196       ' ms CPU)'
 | 
| 
jbe/bsw@0
 | 
   197     )
 | 
| 
jbe/bsw@0
 | 
   198     close_with_children()
 | 
| 
jbe@223
 | 
   199   --]]
 | 
| 
jbe/bsw@0
 | 
   200   elseif node_type == "sql" then
 | 
| 
jbe/bsw@0
 | 
   201     open("sql")
 | 
| 
jbe/bsw@0
 | 
   202     if node.error_position then
 | 
| 
jbe/bsw@0
 | 
   203       -- error position starts counting with 1
 | 
| 
jbe/bsw@0
 | 
   204       local part1 = string.sub(node.command, 1, node.error_position - 1)
 | 
| 
jbe/bsw@0
 | 
   205       local part2 = string.sub(node.command, node.error_position)
 | 
| 
jbe/bsw@0
 | 
   206       slot.put(encode.html(part1))
 | 
| 
jbe/bsw@0
 | 
   207       slot.put('<span class="trace_error_position">⇒</span>')
 | 
| 
jbe/bsw@0
 | 
   208       slot.put(encode.html(part2))
 | 
| 
jbe/bsw@0
 | 
   209     else
 | 
| 
jbe/bsw@0
 | 
   210       slot.put(encode.html(node.command))
 | 
| 
jbe/bsw@0
 | 
   211     end
 | 
| 
jbe@296
 | 
   212     slot.put(" (execution time: ", format_time(node.execution_time), ")")
 | 
| 
jbe/bsw@0
 | 
   213     close();
 | 
| 
jbe/bsw@0
 | 
   214   elseif node_type == "error" then
 | 
| 
jbe/bsw@0
 | 
   215     open("error")
 | 
| 
bsw@115
 | 
   216     open_head(node)
 | 
| 
jbe/bsw@0
 | 
   217     slot.put("UNEXPECTED ERROR")
 | 
| 
jbe/bsw@0
 | 
   218     close_head()
 | 
| 
jbe/bsw@0
 | 
   219     close()
 | 
| 
jbe/bsw@0
 | 
   220   end
 | 
| 
jbe/bsw@0
 | 
   221 end
 |