You've already forked explain.depesz.com
							
							
				mirror of
				https://gitlab.com/depesz/explain.depesz.com.git
				synced 2025-10-31 00:07:57 +02:00 
			
		
		
		
	Merge branch 'master' of github.com:depesz/explain.depesz.com
This commit is contained in:
		| @@ -35,6 +35,9 @@ sub startup { | ||||
|     # startup mail sender | ||||
|     $self->plugin( 'mail_sender', $config->{ mail_sender } || {} ); | ||||
|  | ||||
|     # load number_format plugin | ||||
|     $self->plugin( 'number_format' ); | ||||
|  | ||||
|     # routes | ||||
|     my $routes = $self->routes; | ||||
|  | ||||
| @@ -71,6 +74,9 @@ sub startup { | ||||
|     # route: 'help' | ||||
|     $routes->route( '/help' )->to( 'controller#help' )->name( 'help' ); | ||||
|  | ||||
|     # route: 'info' | ||||
|     $routes->route( '/info' )->to( 'controller#info' )->name( 'info' ); | ||||
|  | ||||
|     return; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -7,10 +7,12 @@ use English -no_match_vars; | ||||
| use Pg::Explain; | ||||
| use Encode; | ||||
| use Email::Valid; | ||||
| use Config; | ||||
|  | ||||
| sub logout { | ||||
|     my $self = shift; | ||||
|     delete $self->session->{ 'user' }; | ||||
|     delete $self->session->{ 'admin' }; | ||||
|     $self->redirect_to( 'new-explain' ); | ||||
| } | ||||
|  | ||||
| @@ -149,9 +151,10 @@ sub login { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if ( $self->database->user_login( $username, $password ) ) { | ||||
|     if ( my $user = $self->database->user_login( $username, $password ) ) { | ||||
|         $self->flash( 'message' => 'User logged in.' ); | ||||
|         $self->session( 'user' => $username ); | ||||
|         $self->session( 'admin' => $user->{ 'admin' } ); | ||||
|         $self->redirect_to( 'new-explain' ); | ||||
|     } | ||||
|     $self->stash->{ 'message' } = 'Bad username or password.'; | ||||
| @@ -357,6 +360,30 @@ sub contact { | ||||
|     $self->redirect_to( 'contact' ); | ||||
| } | ||||
|  | ||||
| sub info { | ||||
|     my $self = shift; | ||||
|     $self->redirect_to( 'new-explain' ) unless $self->session->{ 'user' }; | ||||
|     $self->redirect_to( 'new-explain' ) unless $self->session->{ 'admin' }; | ||||
|  | ||||
|     my @versions = (); | ||||
|     for my $module ( sort keys %INC ) { | ||||
|         next if $module =~ m{^\.?/}; | ||||
|         $module =~ s/\.pm$//; | ||||
|         $module =~ s#/#::#g; | ||||
|         push @versions, { | ||||
|             'module' => $module, | ||||
|             'version' => $module->VERSION, | ||||
|         }; | ||||
|     } | ||||
|     $self->stash( 'modules' => \@versions ); | ||||
|     $self->stash( 'perl' => { | ||||
|             'version' => $PERL_VERSION, | ||||
|             'binary'  => $Config{'perlpath'} . $Config{'_exe'}, | ||||
|         } | ||||
|     ); | ||||
|  | ||||
| } | ||||
|  | ||||
| sub help { | ||||
|  | ||||
|     # direct to template | ||||
|   | ||||
| @@ -75,7 +75,7 @@ sub user_login { | ||||
|     my ( $username, $password ) = @_; | ||||
|  | ||||
|     my @row = $self->dbh->selectrow_array( | ||||
|         'SELECT password FROM users where username = ?', | ||||
|         'SELECT password, is_admin FROM users where username = ?', | ||||
|         undef, | ||||
|         $username, | ||||
|     ); | ||||
| @@ -83,7 +83,7 @@ sub user_login { | ||||
|     my $crypted = crypt( $password, $row[ 0 ] ); | ||||
|  | ||||
|     return if $crypted ne $row[ 0 ]; | ||||
|     return 1; | ||||
|     return { 'admin' => $row[1] }; | ||||
| } | ||||
|  | ||||
| sub user_change_password { | ||||
|   | ||||
							
								
								
									
										24
									
								
								lib/Explain/Plugin/NumberFormat.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								lib/Explain/Plugin/NumberFormat.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| package Explain::Plugin::NumberFormat; | ||||
|  | ||||
| use Mojo::Base 'Mojolicious::Plugin'; | ||||
|  | ||||
| use Mail::Sender; | ||||
|  | ||||
| sub register { | ||||
|     my ( $self, $app ) = @_; | ||||
|  | ||||
|     # register helper | ||||
|     $app->helper( | ||||
|         commify_numbers => sub { | ||||
|             my $self = shift; | ||||
|  | ||||
|             # Code taken from perlfaq5 | ||||
|             local $_ = shift; | ||||
|             return $_ unless defined $_; | ||||
|             1 while s/^([-+]?\d+)(\d{3})/$1,$2/; | ||||
|             return $_; | ||||
|         } | ||||
|     ); | ||||
| } | ||||
|  | ||||
| 1; | ||||
							
								
								
									
										1
									
								
								sql/patch-003.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								sql/patch-003.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| ALTER TABLE users ADD COLUMN is_admin BOOL DEFAULT false; | ||||
							
								
								
									
										23
									
								
								templates/controller/info.html.ep
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										23
									
								
								templates/controller/info.html.ep
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| % layout 'default'; | ||||
|  | ||||
| % my $title = 'System information'; | ||||
| % title $title; | ||||
|  | ||||
| <h1><%= $title =%></h1> | ||||
|  | ||||
| <ul> | ||||
|     <li>Perl version: <%= $perl->{'version'} %></li> | ||||
|     <li>Perl binary: <%= $perl->{'binary'} %></li> | ||||
|     <li>App home: <%= app()->home() %> | ||||
|     <li>Loaded modules: | ||||
|     <ul> | ||||
| % for my $item ( @{ $modules } ) { | ||||
|         <li><%= $item->{'module'} %> | ||||
| % if ( $item->{'version'} ) { | ||||
|         version <%= $item->{'version'} %> | ||||
| % } | ||||
|         </li> | ||||
| % } | ||||
|     </ul> | ||||
|     </li> | ||||
| </ul> | ||||
| @@ -125,19 +125,19 @@ | ||||
|     <tr id="l<%= $global_node_id =%>" class="n <%= $row_class %>" data-node_id="<%= $node_id =%>" data-node_parent="<%= $parent =%>" data-level="<%= $level =%>" data-e="<%= $exclusive_point =%>" data-i="<%= $inclusive_point =%>" data-x="<%= $rows_x_point =%>"> | ||||
|         <td class="u <%= $cfg->{ vu } ? '' : ' tight' %>"><a href="#l<%= $global_node_id =%>"><%= $global_node_id =%>.</a></td> | ||||
|         <td class="e c-<%= $exclusive_point =%><%= $cfg->{ ve } ? '' : ' tight' %>"> | ||||
|             <span><%= sprintf '%.3f', defined $node->total_exclusive_time ? $node->total_exclusive_time : 0 =%></span> | ||||
|             <span><%= commify_numbers( sprintf '%.3f', defined $node->total_exclusive_time ? $node->total_exclusive_time : 0 ) =%></span> | ||||
|         </td> | ||||
|         <td class="i c-<%= $inclusive_point =%><%= $cfg->{ vi } ? '' : ' tight' %>"> | ||||
|             <span><%= sprintf '%.3f', defined $node->total_inclusive_time ? $node->total_inclusive_time : 0 =%></span> | ||||
|             <span><%= commify_numbers( sprintf '%.3f', defined $node->total_inclusive_time ? $node->total_inclusive_time : 0 ) =%></span> | ||||
|         </td> | ||||
|         <td class="x c-<%= $rows_x_point =%><%= $cfg->{ vx } ? '' : ' tight' %>"> | ||||
|             <span> | ||||
|                 <%== $rows_x_mark eq 'up' ? '↑' : '↓' %> | ||||
|                 <%= sprintf '%.1f', $rows_x %> | ||||
|                 <%= commify_numbers( sprintf '%.1f', $rows_x ) %> | ||||
|             </span> | ||||
|         </td> | ||||
|         <td class="r<%= $cfg->{ vr } ? '' : ' tight' %>"><span><%= $node->actual_rows  =%></span></td> | ||||
|         <td class="l<%= $cfg->{ vl } ? '' : ' tight' %>"><span><%= $node->actual_loops =%></span></td> | ||||
|         <td class="r<%= $cfg->{ vr } ? '' : ' tight' %>"><span><%= commify_numbers( $node->actual_rows ) =%></span></td> | ||||
|         <td class="l<%= $cfg->{ vl } ? '' : ' tight' %>"><span><%= commify_numbers( $node->actual_loops ) =%></span></td> | ||||
|         <td class="n"> | ||||
|             <div class="n" style="margin-left:<%= $margin =%>px"> | ||||
|  | ||||
| @@ -191,16 +191,16 @@ | ||||
|                     </span> | ||||
|  | ||||
|                     <span class="est"> | ||||
|                         (cost=<%= $node->estimated_startup_cost =%>..<%= $node->estimated_total_cost %> | ||||
|                         rows=<%= $node->estimated_rows %> | ||||
|                         width=<%= $node->estimated_row_width =%>) | ||||
|                         (cost=<%= commify_numbers( $node->estimated_startup_cost ) =%>..<%= commify_numbers( $node->estimated_total_cost ) %> | ||||
|                         rows=<%= commify_numbers( $node->estimated_rows ) %> | ||||
|                         width=<%= commify_numbers( $node->estimated_row_width ) =%>) | ||||
|                     </span> | ||||
|  | ||||
|                     <span class="act"> | ||||
|                         (actual | ||||
|                         time=<%= $node->actual_time_first =%>..<%= $node->actual_time_last %> | ||||
|                         rows=<%= $node->actual_rows %> | ||||
|                         loops=<%= $node->actual_loops =%>) | ||||
|                         time=<%= commify_numbers( $node->actual_time_first ) =%>..<%= commify_numbers( $node->actual_time_last ) %> | ||||
|                         rows=<%= commify_numbers( $node->actual_rows ) %> | ||||
|                         loops=<%= commify_numbers( $node->actual_loops ) =%>) | ||||
|                     </span> | ||||
|                 </p> | ||||
|  | ||||
| @@ -459,7 +459,7 @@ | ||||
|                 <tr class="table-detail"> | ||||
|                 <td class="node-type"><%= $node_type %></td> | ||||
|                 <td class="count"><%= $stats->{'nodes'}->{$node_type}->{'count'} %></td> | ||||
|                 <td class="time"><%= sprintf '%.03f ms', $stats->{'nodes'}->{$node_type}->{'time'} || 0 %></td> | ||||
|                 <td class="time"><%= commify_numbers( sprintf '%.03f ms', $stats->{'nodes'}->{$node_type}->{'time'} || 0 ) %></td> | ||||
|                 <td class="percent"> | ||||
|                     <% my $total = $explain->top_node->total_inclusive_time || 0; %> | ||||
|                     <% my $current = $stats->{'nodes'}->{$node_type}->{'time'} || 0; %> | ||||
| @@ -481,7 +481,7 @@ | ||||
|                 <tr class="table-summary"> | ||||
|                 <td class="table-name"><%= $table_name %></td> | ||||
|                 <td class="count"><%= $stats->{'tables'}->{$table_name}->{':total'}->{'count'} %></td> | ||||
|                 <td class="time"><%= sprintf '%.03f ms', $stats->{'tables'}->{$table_name}->{':total'}->{'time'} || 0 %></td> | ||||
|                 <td class="time"><%= commify_numbers( sprintf '%.03f ms', $stats->{'tables'}->{$table_name}->{':total'}->{'time'} || 0 ) %></td> | ||||
|                 <td class="percent"> | ||||
|                     <% my $total = $explain->top_node->total_inclusive_time || 0; %> | ||||
|                     <% my $current = $stats->{'tables'}->{$table_name}->{':total'}->{'time'} || 0; %> | ||||
| @@ -493,7 +493,7 @@ | ||||
|                 <tr class="table-detail"> | ||||
|                 <td class="scan-type"><%= $scan_type %></td> | ||||
|                 <td class="count"><%= $stats->{'tables'}->{$table_name}->{$scan_type}->{'count'} %></td> | ||||
|                 <td class="time"><%= sprintf '%.03f ms', $stats->{'tables'}->{$table_name}->{$scan_type}->{'time'} || 0 %></td> | ||||
|                 <td class="time"><%= commify_numbers( sprintf '%.03f ms', $stats->{'tables'}->{$table_name}->{$scan_type}->{'time'} || 0 ) %></td> | ||||
|                 <td class="percent"> | ||||
|                     <% my $total = $stats->{'tables'}->{$table_name}->{':total'}->{'time'} || 0; %> | ||||
|                     <% my $current = $stats->{'tables'}->{$table_name}->{$scan_type}->{'time'} || 0; %> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user