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