On 2/19/06, ngw [email protected] wrote:
I mean, I can resolve the problem by using a “state” variable inside a
block and turn it to true if it finds the table, but I guess there’s a
more appropriate way to handle this kind of problems.
Using Ruport as it is in the svn trunk (should be released today, i’d
do something like this:
require “ruport”
Ruport::Config.source :default,
:dsn => “dbi:mysql:my_dbname”, :user => “myuser”, :password => “pass”
table = “some_table_i’m_looking for”
show_query = Ruport::Query.new(“show tables”)
creation_query = Ruport::Query.new("create table … ")
exit if show_query.result.any? { |r| r[0].eql? table }
creation_query.execute
To demonstrate this, here it is in irb below.
The same approach can be taken with any enumerable result set (Including
DBI’s)
irb(main):001:0> require “ruport”
=> true
irb(main):002:0> Ruport::Config.source :default,
irb(main):003:0* :dsn => “dbi:mysql:bills_development”, :user => “root”
=> nil
irb(main):004:0> show_tables = Ruport::Query.new “show tables”
=> #<Ruport::Query:0xb778678c @cached_data=nil, @raw_data=nil,
@password=nil, @statements=[“show tables”], @user=“root”,
@dsn=“dbi:mysql:bills_development”, @sql=“show tables”,
@cache_enabled=nil>
irb(main):005:0> puts show_tables.result
fields: ( Tables_in_bills_development )
row0: ( users )
=> nil
irb(main):006:0> table = “apple”
=> “apple”
irb(main):007:0> show_tables.result.any? { |r| r[0].eql? table }
=> false
irb(main):008:0> Ruport::Query.new(“create table #{table}”).execute
=> nil
irb(main):009:0> show_tables.result.any? { |r| r[0].eql? table }
=> false
irb(main):013:0> Ruport::Query.new(“create table #{table} ( x int
);”).execute
=> nil
irb(main):014:0> show_tables.result.any? { |r| r[0].eql? table }
=> true