DB-Object
view release on metacpan or search on metacpan
lib/DB/Object/SQLite/Tables.pm view on Meta::CPAN
}
if( @errors )
{
warn( "The options '", join( ', ', @errors ), "' were either not recognized or malformed and thus were ignored.\n" );
}
# Check statement
my $select = '';
if( $sth && ref( $sth ) && ( $sth->isa( 'DB::Object::Statement' ) || $sth->can( 'as_string' ) ) )
{
$select = $sth->as_string();
if( $select !~ /^\s*(?:IGNORE|REPLACE)*\s*\bSELECT\s+/ )
{
return( $self->error( "SELECT statement to use to create table is invalid:\n$select" ) );
}
}
if( $self->exists() == 0 )
{
my $query = 'CREATE ' . ( $temp ? 'TEMPORARY ' : '' ) . "TABLE $table ";
# Structure of table if any -
# structure may very well be provided using a select statement, such as:
# CREATE TEMPORARY TABLE ploppy TYPE=HEAP COMMENT='this is kewl' MAX_ROWS=10 SELECT * FROM some_table LIMIT 0,0
my $def = "(\n" . CORE::join( ",\n", @$data ) . "\n)" if( $data && ref( $data ) && @$data );
my $tdef = CORE::join( ' ', map{ "\U$_\E = $opt->{ $_ }" } @options );
if( !$def && !$select )
{
return( $self->error( "Lacking table '$table' structure information to create it." ) );
}
$query .= join( ' ', $def, $tdef, $select );
my $new = $self->prepare( $query ) ||
return( $self->error( "Error while preparing query to create table '$table':\n$query", $self->errstr() ) );
# Trick so other method may follow, such as as_string(), fetchrow(), rows()
if( !defined( wantarray() ) )
{
$new->execute ||
return( $self->error( "Error while executing query to create table '$table':\n$query", $new->errstr() ) );
}
$self->reset_structure;
return( $new );
}
else
{
return( $self->error( "Table '$table' already exists." ) );
}
}
sub create_info
{
my $self = shift( @_ );
my $table = $self->{table};
$self->structure || return( $self->pass_error );
my $struct = $self->{structure};
my $fields = $self->{fields};
my $default = $self->{default};
my $primary = $self->{primary};
my @output = ();
foreach my $field ( sort{ $fields->{ $a } <=> $fields->{ $b } } keys( %$fields ) )
{
push( @output, "$field $struct->{ $field }" );
}
push( @output, "PRIMARY KEY(" . CORE::join( ',', @$primary ) . ")" ) if( $primary && @$primary );
my $info = $self->stat( $table );
my @opt = ();
push( @opt, "TYPE = $info->{type}" ) if( $info->{type} );
my $addons = $info->{create_options};
if( $addons )
{
$addons =~ s/(\A|\s+)([\w\_]+)\s*=\s*/$1\U$2\E=/g;
push( @opt, $addons );
}
push( @opt, "COMMENT='" . quotemeta( $info->{comment} ) . "'" ) if( $info->{comment} );
my $str = "CREATE TABLE $table (\n\t" . CORE::join( ",\n\t", @output ) . "\n)";
$str .= ' ' . CORE::join( ' ', @opt ) if( @opt );
$str .= ';';
return( @output ? $str : undef() );
}
# NOTE: sub default is inherited from DB::Object::Tables
# sub default
# NOTE: sub drop is inherited from DB::Object::Tables
# sub drop
sub exists { return( shift->table_exists( shift( @_ ) ) ); }
sub lock { return( shift->error( "There is no table locking in SQLite." ) ); }
# NOTE: sub name is inherited from DB::Object::Tables
# sub name
# NOTE: sub null is inherited from DB::Object::Tables
# sub null
# NOTE: sub primary is inherited from DB::Object::Tables
# sub primary
sub on_conflict
{
my $self = shift( @_ );
my $q = $self->_reset_query;
return( $q->on_conflict( @_ ) ) if( !defined( wantarray() ) );
if( wantarray() )
{
my( @val ) = $q->on_conflict( @_ ) || return( $self->pass_error( $q->error ) );
return( @val );
}
else
{
my $val = $q->on_conflict( @_ ) || return( $self->pass_error( $q->error ) );
return( $val );
}
}
sub rename
{
my $self = shift( @_ );
my $table = $self->{table} ||
return( $self->error( 'No table was provided to rename' ) );
my $new = shift( @_ ) ||
return( $self->error( "No new table name was provided to rename table '$table'." ) );
if( $new !~ /^[a-zA-Z][\w\_]+$/ )
{
( run in 0.756 second using v1.01-cache-2.11-cpan-39bf76dae61 )