A little polish
[p5sagit/Devel-Size.git] / static / MemView.pl
CommitLineData
b2fc39a5 1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5
6use Mojolicious::Lite;
7
8use ORLite {
9 file => '../x.db',
10 package => "MemView",
11 #user_version => 1,
12 readonly => 1,
13 #unicode => 1,
14};
15
16# Documentation browser under "/perldoc"
17plugin 'PODRenderer';
18
19get '/' => sub {
20 my $self = shift;
21 $self->render('index');
22};
23
24get '/jit_tree/:id/:depth' => sub {
25 my $self = shift;
26 my $id = $self->stash('id');
27 my $depth = $self->stash('depth');
28 warn "jit_tree $id $depth";
875c1073 29 my $node_tree = _fetch_node_tree($id, $depth);
30 my $jit_tree = _transform_node_tree($node_tree, sub {
31 my ($node) = @_;
32 my $children = delete $node->{children}; # XXX edits the src tree
bb66f8a1 33 $node->{'$area'} = $node->{self_size}+$node->{kids_size};
bb66f8a1 34 my $jit_node = {
35 id => $node->{id},
36 name => $node->{name},
37 data => $node,
38 };
39 $jit_node->{children} = $children if $children;
40 return $jit_node;
b2fc39a5 41 });
bb66f8a1 42if(1){
43 use Devel::Dwarn;
44 use Data::Dump qw(pp);
f9d8678b 45 local $jit_tree->{children};
bb66f8a1 46 pp($jit_tree);
47}
b2fc39a5 48 $self->render_json($jit_tree);
49};
50
875c1073 51sub _fetch_node_tree {
52 my ($id, $depth) = @_;
53 my $node = MemView->selectrow_hashref("select * from node where id = ?", undef, $id)
54 or die "Node '$id' not found";
5a78486c 55 if ($node->{child_ids}) {
56 my @child_ids = split /,/, $node->{child_ids};
875c1073 57 my $children;
5a78486c 58 if (@child_ids == 1) {
59 my $child = _fetch_node_tree($child_ids[0], $depth); # same depth
f9d8678b 60 # merge node into child
5a78486c 61 # XXX id, depth, parent_id
f9d8678b 62 warn "Merged $node->{name} #$node->{id} with only child $child->{name} #$child->{id}\n";
63 $child->{name} = "$node->{name} + $child->{name}";
64 $child->{$_} += $node->{$_} for (qw(self_size));
5a78486c 65 $child->{$_} = $node->{$_} for (qw(parent_id));
66
67 $child->{_ids_merged} .= ",$node->{id}";
68 my @child_ids = split /,/, $node->{child_ids};
69 $child->{child_count} = @child_ids;
70
f9d8678b 71 $node = $child;
875c1073 72 }
f9d8678b 73 elsif ($depth) {
5a78486c 74 $children = [ map { _fetch_node_tree($_, $depth-1) } @child_ids ];
f9d8678b 75 $node->{children} = $children;
76 $node->{child_count} = @$children;
875c1073 77 }
b2fc39a5 78 }
b2fc39a5 79 return $node;
80}
81
f9d8678b 82sub _transform_node_tree { # recurse depth first
875c1073 83 my ($node, $transform) = @_;
84 if (my $children = $node->{children}) {
85 $_ = _transform_node_tree($_, $transform) for @$children;
86 }
87 return $transform->($node);
88}
89
b2fc39a5 90
91app->start;
92__DATA__
93@@ index.html.ep
94% layout 'default';
95% title 'Welcome';
96Welcome to the Mojolicious real-time web framework!
97
98@@ layouts/default.html.ep
99<!DOCTYPE html>
100<head>
101<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
bb66f8a1 102<title>Perl Memory Treemap</title>
b2fc39a5 103
104<!-- CSS Files -->
105<link type="text/css" href="css/base.css" rel="stylesheet" />
106<link type="text/css" href="css/Treemap.css" rel="stylesheet" />
107
108<!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
109
110<!-- JIT Library File -->
111<script language="javascript" type="text/javascript" src="jit.js"></script>
112<script language="javascript" type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
113
114<!-- Example File -->
bb66f8a1 115<script language="javascript" type="text/javascript" src="sprintf.js"></script>
b2fc39a5 116<script language="javascript" type="text/javascript" src="tm.js"></script>
117</head>
118
119<body onload="init();">
120<div id="container">
121
122<div id="left-container">
123
b2fc39a5 124<div class="text">
125<h4>
bb66f8a1 126Perl Memory TreeMap
b2fc39a5 127</h4>
bb66f8a1 128 Clicking on a node will show a new TreeMap with the contents of that node.<br /><br />
b2fc39a5 129</div>
130
131<a id="back" href="#" class="theme button white">Go to Parent</a>
b2fc39a5 132</div>
133
134<div id="center-container">
135 <div id="infovis"></div>
136</div>
137
138<div id="right-container">
139
140<div id="inner-details"></div>
141
142</div>
143
144<div id="log"></div>
145</div>
146</body>
147</html>