#!/usr/bin/env ruby

# Test our dbi-based database management facilities
# Dan Brickley <danbri@w3.org>
# $Id: tc_dbiutil.rb,v 1.4 2003/04/20 10:35:13 danbri Exp $

$LOAD_PATH.unshift '../lib/'
$LOAD_PATH.unshift '../../lib/'

require 'basicrdf'
require 'squish'
require 'dbi'

require 'test/unit'

class TC_DBIUtil < Test::Unit::TestCase
INITDB=<<EOT;
DROP TABLE triples;
DROP TABLE resources;
DROP VIEW simple;
CREATE TABLE "triples" (
	"subject" integer,
	"predicate" integer,
	"object" integer,
	"assertid" character varying,
	"personid" character varying,
	"isresource" boolean
);
-- todo: create utility views
-- ...inverses etc too?
CREATE TABLE "resources" (
	"keyhash" integer,
	"value" character varying );
CREATE INDEX sub_index ON triples USING btree (subject);
CREATE INDEX pred_index ON triples USING btree (predicate);
CREATE INDEX obj_index ON triples USING btree (object);
CREATE UNIQUE INDEX resources_key_key ON resources USING btree ("keyhash");
CREATE INDEX res_key_index ON resources USING btree ("keyhash");
CREATE INDEX res_val_index ON resources USING btree (value);
CREATE VIEW simple AS SELECT r1.value AS p, r2.value AS s, r3.value AS o, r1.keyhash AS pcode, r2.keyhash AS scode, r3.keyhash AS ocode  from resources r1, resources r2, resources r3, triples t WHERE r1.keyhash=t.predicate AND r2.keyhash=t.subject AND r3.keyhash=t.object; 
EOT

def setup
  #puts "Should snoop to see which backends exist."
end

def test_creation
  created_ok=false
  dbname='rdf_123'
  dbi_driver = 'DBI:Pg:'+dbname
  failed_on_bogus=false
  bogus_error=nil
  begin 
    DBI.connect(  dbi_driver, 'danbri' ,  '' ) do | dbh |
      STDERR.puts("SQL: "+INITDB)
      dbh.do(INITDB)
      dbh.disconnect
    end
  rescue Exception
      #we expect this. raise "Caught a problem resetting database. #{$!}"
      failed_on_bogus=true
      bogus_error=$!
  end
  assert(failed_on_bogus==true,"Should never succeed at initialising a non-existence database.")
end



def test_reset
  dbname='rubyrdf1' #pick a name for our tests (create externally)
  dbi_driver = 'DBI:Pg:'+dbname
  reset_ok=false
  error_msg=''
  s=''

  sqlbits=INITDB.gsub(/^--(.*)$/,"").split(/;\s*\n/)
  sqlbits.each do |s|
    s=s.gsub(/\n/,"").chomp+(";")
    begin 
      DBI.connect(  dbi_driver, 'danbri' ,  '' ) do | dbh |
          dbh.execute s
          puts "Executing SQL [#{dbi_driver}]: #{s}"
      end
      reset_ok=true
    rescue Exception
      reset_ok=false
      error_msg= "Error resetting database '#{dbname}' SQL: #{s} #{$!}"
      e1='table \"triples\" does not exist'  # tolerable errors
      e2='table \"resources\" does not exist'
      e3="Relation 'simple' already exists" #
         #Relation 'simple' already exists" #
      reset_ok=true if $error_msg =~ /#{e1}/
      reset_ok=true if $error_msg =~ /#{e2}/
      reset_ok=true if $error_msg =~ /#{e3}/
    end
  end
  assert(reset_ok==true,"We should be able to reset our rdfdb. error: #{error_msg}") end
 
end

