# ------------------------------------------------------------------------------------- # TripleStore::Driver::MySQL # ------------------------------------------------------------------------------------- # # Author : Jean-Michel Hiver (jhiver@mkdoc.com). # Version : $Id: MySQL.pm,v 1.1.1.1 2003/01/13 18:20:39 jhiver Exp $ # # Description: # # MySQL driver # # ------------------------------------------------------------------------------------- package TripleStore::Driver::MySQL; use strict; use warnings; use Carp; use DBI; use base qw /TripleStore::Driver::SQL/; ## TRANSACTION STUFF sub tx_start { # TODO } sub tx_stop { # TODO } sub tx_abort { # TODO } ## INSERT sub _prepared_sql_insert { my $self = shift; return 'INSERT INTO TRIPLE_STORE SET S_T=?, S_N=?, P_T=?, P_N=?, O_T=?, O_N=?'; } ## UPDATE sub _prepared_sql_update { my $self = shift; my $set_sql = shift; my $where_sql = shift; return "UPDATE TRIPLE_STORE SET $set_sql WHERE $where_sql"; } sub _prepared_sql_update_set { my $self = shift; my $update = shift; my @res = (); if ($update->exists_subject()) { push @res, "S_T = ?, S_N = ?" }; if ($update->exists_predicate()) { push @res, "P_T = ?, P_N = ?" }; if ($update->exists_object()) { push @res, "O_T = ?, O_N = ?" }; return join ', ', @res; } sub _prepared_sql_update_where { my $self = shift; return $self->_prepared_sql_clause (@_); } ## DELETE sub _prepared_sql_delete { my $self = shift; my $where_sql = shift; return "DELETE FROM TRIPLE_STORE WHERE $where_sql"; } sub _prepared_sql_delete_where { my $self = shift; return $self->_prepared_sql_clause (@_); } ## DEPLOY sub _prepared_sql_deploy { my $self = shift; return join "\n", ( 'CREATE TABLE IF NOT EXISTS TRIPLE_STORE (', ' S_T TEXT,', ' S_N DOUBLE,', ' P_T TEXT,', ' P_N DOUBLE,', ' O_T TEXT,', ' O_N DOUBLE', ')' ); } ## HELPER METHODS sub _sql_symbol_triple_store { 'TRIPLE_STORE' } sub _sql_symbol_subject_text { 'S_T' } sub _sql_symbol_subject_num { 'S_N' } sub _sql_symbol_predicate_text { 'P_T' } sub _sql_symbol_predicate_num { 'P_N' } sub _sql_symbol_object_text { 'O_T' } sub _sql_symbol_object_num { 'O_N' } sub select { my $self = shift; $self->{Alias} = 'A'; return $self->SUPER::select (@_); } sub _next_alias { my $self = shift; return $self->{Alias}++; } sub _prepared_sql_clause { my $class = shift->class; my $clause = shift; my @cols = (); my $criterion_class = 'TripleStore::Query::Criterion'; if ($clause->subject()->isa ($criterion_class)) { my $criterion = $clause->subject(); my $operator = $class->_sql_operator ($criterion->operator()); if (defined $criterion->value()) { push @cols, $criterion->is_numeric_operator() ? "S_N $operator ?" : "S_T $operator ?"; } else { if ($criterion->operator() eq 'eq') { push @cols, "S_T IS NULL" } elsif ($criterion->operator() eq '==') { push @cols, "S_N IS NULL" } elsif ($criterion->operator() eq 'ne') { push @cols, "S_T IS NOT NULL" } elsif ($criterion->operator() eq '!=') { push @cols, "S_N IS NOT NULL" } else { push @cols, $criterion->is_numeric_operator() ? "S_N $operator ?" : "S_T $operator ?" } } } if ($clause->predicate()->isa ($criterion_class)) { my $criterion = $clause->predicate(); my $operator = $class->_sql_operator ($criterion->operator()); if (defined $criterion->value()) { push @cols, $criterion->is_numeric_operator() ? "P_N $operator ?" : "P_T $operator ?"; } else { if ($criterion->operator() eq 'eq') { push @cols, "P_T IS NULL" } elsif ($criterion->operator() eq '==') { push @cols, "P_N IS NULL" } elsif ($criterion->operator() eq 'ne') { push @cols, "P_T IS NOT NULL" } elsif ($criterion->operator() eq '!=') { push @cols, "P_N IS NOT NULL" } else { push @cols, $criterion->is_numeric_operator() ? "P_N $operator ?" : "P_T $operator ?" } } } if ($clause->object()->isa ($criterion_class)) { my $criterion = $clause->[2]; my $operator = $class->_sql_operator ($criterion->operator()); if (defined $criterion->value()) { push @cols, $criterion->is_numeric_operator() ? "O_N $operator ?" : "O_T $operator ?"; } else { if ($criterion->operator() eq 'eq') { push @cols, "O_T IS NULL" } elsif ($criterion->operator() eq '==') { push @cols, "O_N IS NULL" } elsif ($criterion->operator() eq 'ne') { push @cols, "O_T IS NOT NULL" } elsif ($criterion->operator() eq '!=') { push @cols, "O_N IS NOT NULL" } else { push @cols, $criterion->is_numeric_operator() ? "O_N $operator ?" : "O_T $operator ?" } } } return join ' AND ', @cols; } 1; __END__