| rev | line source | 
| jbe@303 | 1 local function format_time(seconds) | 
| jbe@303 | 2   return string.format("%.1f ms", seconds * 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( | 
| bsw@307 | 8       "u=%.1f, d=%.1f, t=%.1f", | 
| jbe@305 | 9       1000 * proc_time, | 
| jbe@302 | 10       1000 * db_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@305 | 47       '<span class="child_duration">', format_triple(child_real_time, child_proc_time, child_db_time), '</span>', | 
| jbe@299 | 48       ' | ', | 
| jbe@299 | 49       '<span class="total_duration_label">total:</span>', | 
| jbe@299 | 50       ' ', | 
| bsw@307 | 51       '<span class="total_duration">', format_triple(total_real_time, total_proc_time, total_db_time), ' ms</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 | 
| bsw@307 | 212     slot.put(" ") | 
| bsw@307 | 213     slot.put('<span class="trace_sql_time">', format_time(node.execution_time), "</span>") | 
| jbe/bsw@0 | 214     close(); | 
| jbe/bsw@0 | 215   elseif node_type == "error" then | 
| jbe/bsw@0 | 216     open("error") | 
| bsw@115 | 217     open_head(node) | 
| jbe/bsw@0 | 218     slot.put("UNEXPECTED ERROR") | 
| jbe/bsw@0 | 219     close_head() | 
| jbe/bsw@0 | 220     close() | 
| jbe/bsw@0 | 221   end | 
| jbe/bsw@0 | 222 end |