split transform nodes away from fetch
[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);
875c1073 45# local $jit_tree->{children};
bb66f8a1 46 pp($jit_tree);
47}
b2fc39a5 48 $self->render_json($jit_tree);
49};
50
875c1073 51sub _merge_child_into_node {
52 my ($node, $child) = @_;
53 my $fake_data => {
54 "\$area" => 23230,
55 "child_count" => 2,
56 "child_seqns" => "1414,1496",
57 "depth" => 17,
58 "id" => 1413,
59 "kids_node_count" => 83,
60 "kids_size" => 23078,
61 "name" => "SV(PVGV)",
62 "parent_seqn" => 1412,
63 "self_size" => 152,
64 };
65
66}
67
68sub _fetch_node_tree {
69 my ($id, $depth) = @_;
70 my $node = MemView->selectrow_hashref("select * from node where id = ?", undef, $id)
71 or die "Node '$id' not found";
b2fc39a5 72 if ($depth && $node->{child_seqns}) {
73 my @child_seqns = split /,/, $node->{child_seqns};
875c1073 74 my $children;
75 if (@child_seqns == -1) {
76 my $child = _fetch_node_tree($child_seqns[0], $depth); # same depth
77 _merge_child_into_node($node, $child);
78 }
79 else {
80 $children = [ map { _fetch_node_tree($_, $depth-1) } @child_seqns ];
81 }
82 $node->{children} = $children;
83 $node->{child_count} = @$children;
b2fc39a5 84 }
b2fc39a5 85 return $node;
86}
87
875c1073 88sub _transform_node_tree { # 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
b2fc39a5 96
97app->start;
98__DATA__
99@@ index.html.ep
100% layout 'default';
101% title 'Welcome';
102Welcome 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" />
bb66f8a1 108<title>Perl Memory Treemap</title>
b2fc39a5 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 -->
bb66f8a1 121<script language="javascript" type="text/javascript" src="sprintf.js"></script>
b2fc39a5 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
b2fc39a5 130<div class="text">
131<h4>
bb66f8a1 132Perl Memory TreeMap
b2fc39a5 133</h4>
bb66f8a1 134 Clicking on a node will show a new TreeMap with the contents of that node.<br /><br />
b2fc39a5 135</div>
136
137<a id="back" href="#" class="theme button white">Go to Parent</a>
b2fc39a5 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>