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