The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package MyMySQL::Infobrightize;

use MooseX::MethodAttributes::Role;

use Data::Dumper;
use SQL::Translator;
use DBI;

sub infobrightize : Regexp('qr{(INFOBRIGHTIZE\(('|"|)(.*)('|")\))}io') { #'
   my ($self, $query, @placeholders) = @_;

   unless (defined $self->local_dbh) {
      $self->send_error('Local dbh not defined !');
      return;
   }

   my $table_name = $placeholders[2];
   my $db_name;
      
   ($db_name, $table_name) = split (/\./, $table_name) if $table_name =~ /(.*)\.(.*)/;

   unless ($db_name) {
     $db_name = $self->database;
   }
   
   print 'infobrightize '.$db_name.".".$table_name."\n";
   
	my $sth = $self->local_dbh->prepare("show create table ${db_name}.${table_name}");
	$sth->execute();
	
   if ($DBI::err) {
		$self->send_error($DBI::errstr);
		return;
   }
	
   my @array = $sth->fetchrow_array();

   my $create_table = $array[1].";";
   $create_table =~  s/`//g;
   
   my $t = SQL::Translator->new(        
      show_warnings     => 1,
      no_comments       => 1,      
      quote_table_names => 0,
      quote_field_names => 0,
      parser            => 'MySQL',
      producer          => 'MySQL',
   );
   
   $t->filters( \&filter) or die $t->error;

   my @creates = $t->translate( \$create_table );
   $create_table = $creates[1];
      
   if ($db_name) {
      $self->local_dbh->do("use $db_name");
   }
   
   $self->local_dbh->do("drop table if exists ${db_name}.${table_name}_ib");
   if ($DBI::err) {
		$self->send_error($DBI::errstr);
		return;
   }
   
#   print $create_table."\n";
   
   $self->local_dbh->do($create_table);
   if ($DBI::err) {
		$self->send_error($DBI::errstr);
		return;
   }
   
   my $filename = time.$$;
   
   $self->local_dbh->do('
      select *
      into outfile \'/tmp/'.${filename}.'.dat\'
      fields terminated by \'~\' enclosed by \'\'
      lines terminated by \'\n\'
      from '.$db_name.'.'.$table_name.';
   ');
   if ($DBI::err) {
		$self->send_error($DBI::errstr);
		return;
   }
   
   $self->local_dbh->do("
      load data infile '/tmp/${filename}.dat'
      into table ".$db_name.'.'.$table_name."_ib
      fields terminated by '~' 
      enclosed by 'NULL';
   ");
   if ($DBI::err) {
		$self->send_error($DBI::errstr);
		return;
   }
		
	my $fortune = `fortune -n=60`;
	chomp($fortune);
	
	$fortune =~ s/\n//g;
	$fortune =~ s/\r//g;
	
   $self->send_results(
      ['fortune'],
      [[$fortune]]
   );
   
   unlink ('/tmp/'.$filename.'.dat');
   
   print "OK \n";
}

sub filter {        
   my $schema = shift;

   for my $table ( $schema->get_tables ) {
            
      foreach my $name ($table->get_constraints) {
         $table->drop_constraint($name);
      }
      
      foreach my $name ($table->get_indices) {
         $table->drop_index($name);
      }
      
      $table->name($table->name.'_ib');      
      
      $table->{'options'} = undef;
      
      $table->options((
         { 'ENGINE'        => 'brighthouse' },
      ));

   }

}

1;