|
From: <cw...@us...> - 2007-10-09 15:48:07
|
Revision: 541
http://rdfapi-php.svn.sourceforge.net/rdfapi-php/?rev=541&view=rev
Author: cweiske
Date: 2007-10-09 08:48:01 -0700 (Tue, 09 Oct 2007)
Log Message:
-----------
Setup script for CLI
Make DbStore have a cleaner API
Modified Paths:
--------------
trunk/rdfapi-php/api/model/DbStore.php
Added Paths:
-----------
trunk/rdfapi-php/test/setup.php
Modified: trunk/rdfapi-php/api/model/DbStore.php
===================================================================
--- trunk/rdfapi-php/api/model/DbStore.php 2007-09-20 07:35:41 UTC (rev 540)
+++ trunk/rdfapi-php/api/model/DbStore.php 2007-10-09 15:48:01 UTC (rev 541)
@@ -26,17 +26,35 @@
*/
-class DbStore extends Object{
+class DbStore extends Object
+{
+ /**
+ * Array with all supported database types
+ *
+ * @var array
+ */
+ public static $arSupportedDbTypes = array(
+ "MySQL",
+ "MSSQL",
+ 'MsAccess'
+ );
-/**
- * Database connection object
- *
- * @var object ADOConnection
- * @access private
- */
- var $dbConn;
+ /**
+ * Database connection object
+ *
+ * @var object ADOConnection
+ * @access private
+ */
+ var $dbConn;
/**
+ * Database driver name
+ *
+ * @var string
+ */
+ protected $driver = null;
+
+ /**
* SparqlParser so we can re-use it
* @var Parser
*/
@@ -62,6 +80,7 @@
// create a new connection object
$this->dbConn =& ADONewConnection($dbDriver);
+ $this->driver = $dbDriver;
//activate the ADOdb DEBUG mode
if (ADODB_DEBUG_MODE == '1')
@@ -79,33 +98,7 @@
}
-/**
- * Create tables and indexes for the given database type.
- * Currently supported: MsAccess and MySQL.
- * If you want to use other databases, you will have to create tables by yourself
- * according to the abstract <a href="database_schema.html">database schema</a>
- * described in the API documentation.
- *
- * @param string $databaseType
- * @throws PhpError
- * @access public
- */
- function createTables($databaseType) {
- if (!strcasecmp($databaseType, 'MsAccess'))
- $this->_createTables_MsAccess();
- elseif (!strcasecmp($databaseType, 'MySQL'))
- $this->_createTables_MySql();
- elseif (!strcasecmp($databaseType, 'MSSQL'))
- $this->_createTables_mssql();
- else {
- $errmsg = RDFAPI_ERROR . "(class: DbStore; method: createTables('$databaseType')):
- Currently only MsAcces, MySQL and MSSQL supported.";
- trigger_error($errmsg, E_USER_ERROR);
- }
- }
-
-
/**
* List all DbModels stored in the database.
*
@@ -303,206 +296,282 @@
}
-/**
- * Create tables and indexes for MsAccess database
- *
- * @throws SqlError
- * @access private
- */
- function _createTables_MsAccess() {
- $this->dbConn->startTrans();
+ /**
+ * Sets up tables for RAP.
+ * DOES NOT CHECK IF TABLES ALREADY EXIST
+ *
+ * @param string $databaseType Database driver name (e.g. MySQL)
+ *
+ * @throws Exception If database type is unsupported
+ * @access public
+ **/
+ public function createTables($databaseType = null)
+ {
+ $driver = $this->getDriver($databaseType);
+ $this->assertDriverSupported($driver);
- $this->dbConn->execute('CREATE TABLE models
- (modelID long primary key,
- modelURI varchar not null,
- baseURI varchar)');
+ $createFunc = '_createTables_' . $driver;
+ return $this->$createFunc();
+ }//public function createTables($databaseType="MySQL")
- $this->dbConn->execute('CREATE UNIQUE INDEX m_modURI_idx ON models (modelURI)');
- $this->dbConn->execute('CREATE TABLE statements
- (modelID long,
- subject varchar,
- predicate varchar,
- object Memo,
- l_language varchar,
- l_datatype varchar,
- subject_is varchar(1),
- object_is varchar(1),
- primary key (modelID, subject, predicate, object,
- l_language, l_datatype))');
- $this->dbConn->execute('CREATE INDEX s_mod_idx ON statements (modelID)');
- $this->dbConn->execute('CREATE INDEX s_sub_idx ON statements (subject)');
- $this->dbConn->execute('CREATE INDEX s_pred_idx ON statements (predicate)');
- $this->dbConn->execute('CREATE INDEX s_obj_idx ON statements (object)');
+ /**
+ * Create tables and indexes for MsAccess database
+ *
+ * @return boolean true If all is ok
+ *
+ * @throws Exception
+ */
+ protected function _createTables_MsAccess()
+ {
+ $this->dbConn->startTrans();
- $this->dbConn->execute('CREATE TABLE namespaces
- (modelID long,
- namespace varchar,
- prefix varchar,
- primary key (modelID, namespace, prefix))');
+ $this->dbConn->execute('CREATE TABLE models
+ (modelID long primary key,
+ modelURI varchar not null,
+ baseURI varchar)');
- $this->dbConn->execute('CREATE INDEX n_name_idx ON namespaces (namespace)');
- $this->dbConn->execute('CREATE INDEX n_pref_idx ON namespaces (prefix)');
+ $this->dbConn->execute('CREATE UNIQUE INDEX m_modURI_idx ON models (modelURI)');
- $this->dbConn->execute("CREATE TABLE datasets
- (datasetName varchar,
- defaultModelUri varchar,
- primary key (datasetName))");
+ $this->dbConn->execute('CREATE TABLE statements
+ (modelID long,
+ subject varchar,
+ predicate varchar,
+ object Memo,
+ l_language varchar,
+ l_datatype varchar,
+ subject_is varchar(1),
+ object_is varchar(1),
+ primary key (modelID, subject, predicate, object,
+ l_language, l_datatype))');
- $this->dbConn->execute('CREATE INDEX nGS_idx1 ON datasets (datasetName)');
+ $this->dbConn->execute('CREATE INDEX s_mod_idx ON statements (modelID)');
+ $this->dbConn->execute('CREATE INDEX s_sub_idx ON statements (subject)');
+ $this->dbConn->execute('CREATE INDEX s_pred_idx ON statements (predicate)');
+ $this->dbConn->execute('CREATE INDEX s_obj_idx ON statements (object)');
+ $this->dbConn->execute('CREATE TABLE namespaces
+ (modelID long,
+ namespace varchar,
+ prefix varchar,
+ primary key (modelID, namespace, prefix))');
- $this->dbConn->execute("CREATE TABLE `dataset_model` (
- datasetName varchar,
- modelId long,
- graphURI varchar,
- PRIMARY KEY (modelId,datasetName))");
+ $this->dbConn->execute('CREATE INDEX n_name_idx ON namespaces (namespace)');
+ $this->dbConn->execute('CREATE INDEX n_pref_idx ON namespaces (prefix)');
+ $this->dbConn->execute("CREATE TABLE datasets
+ (datasetName varchar,
+ defaultModelUri varchar,
+ primary key (datasetName))");
- if (!$this->dbConn->completeTrans())
- echo $this->dbConn->errorMsg();
- }
+ $this->dbConn->execute('CREATE INDEX nGS_idx1 ON datasets (datasetName)');
-/**
- * Create tables and indexes for MySQL database
- *
- * @throws SqlError
- * @access private
- */
- function _createTables_MySql() {
+ $this->dbConn->execute("CREATE TABLE `dataset_model` (
+ datasetName varchar,
+ modelId long,
+ graphURI varchar,
+ PRIMARY KEY (modelId,datasetName))");
- $this->dbConn->startTrans();
- $this->dbConn->execute("CREATE TABLE models
- (modelID bigint NOT NULL,
- modelURI varchar(255) NOT NULL,
- baseURI varchar(255) DEFAULT '',
- primary key (modelID))");
+ if (!$this->dbConn->completeTrans()) {
+ throw new Exception($this->dbConn->errorMsg());
+ }
+ return true;
+ }
- $this->dbConn->execute('CREATE UNIQUE INDEX m_modURI_idx ON models (modelURI)');
- $this->dbConn->execute("CREATE TABLE statements
- (modelID bigint NOT NULL,
- subject varchar(255) NOT NULL,
- predicate varchar(255) NOT NULL,
- object text,
- l_language varchar(255) DEFAULT '',
- l_datatype varchar(255) DEFAULT '',
- subject_is varchar(1) NOT NULL,
- object_is varchar(1) NOT NULL)");
- $this->dbConn->execute("CREATE TABLE namespaces
- (modelID bigint NOT NULL,
- namespace varchar(255) NOT NULL,
- prefix varchar(255) NOT NULL,
- primary key (modelID,namespace))");
+ /**
+ * Create tables and indexes for MySQL database
+ *
+ * @return boolean true If all is ok
+ *
+ * @throws Exception
+ */
+ function _createTables_MySQL()
+ {
- $this->dbConn->execute("CREATE TABLE `dataset_model` (
- `datasetName` varchar(255) NOT NULL default '0',
- `modelId` bigint(20) NOT NULL default '0',
- `graphURI` varchar(255) NOT NULL default '',
- PRIMARY KEY (`modelId`,`datasetName`))");
+ $this->dbConn->startTrans();
- $this->dbConn->execute("CREATE TABLE `datasets` (
- `datasetName` varchar(255) NOT NULL default '',
- `defaultModelUri` varchar(255) NOT NULL default '0',
- PRIMARY KEY (`datasetName`),
- KEY `datasetName` (`datasetName`))");
+ $this->dbConn->execute("CREATE TABLE models
+ (modelID bigint NOT NULL,
+ modelURI varchar(255) NOT NULL,
+ baseURI varchar(255) DEFAULT '',
+ primary key (modelID))");
- $this->dbConn->execute('CREATE INDEX s_mod_idx ON statements (modelID)');
- $this->dbConn->execute('CREATE INDEX n_mod_idx ON namespaces (modelID)');
+ $this->dbConn->execute('CREATE UNIQUE INDEX m_modURI_idx ON models (modelURI)');
- $this->dbConn->execute('CREATE INDEX s_sub_pred_idx ON statements
- (subject(200),predicate(200))');
+ $this->dbConn->execute("CREATE TABLE statements
+ (modelID bigint NOT NULL,
+ subject varchar(255) NOT NULL,
+ predicate varchar(255) NOT NULL,
+ object text,
+ l_language varchar(255) DEFAULT '',
+ l_datatype varchar(255) DEFAULT '',
+ subject_is varchar(1) NOT NULL,
+ object_is varchar(1) NOT NULL)");
- $this->dbConn->execute('CREATE INDEX s_sub_idx ON statements (subject(200))');
- $this->dbConn->execute('CREATE INDEX s_pred_idx ON statements (predicate(200))');
- $this->dbConn->execute('CREATE INDEX s_obj_idx ON statements (object(250))');
+ $this->dbConn->execute("CREATE TABLE namespaces
+ (modelID bigint NOT NULL,
+ namespace varchar(255) NOT NULL,
+ prefix varchar(255) NOT NULL,
+ primary key (modelID,namespace))");
- $this->dbConn->execute('CREATE FULLTEXT INDEX s_obj_ftidx ON statements (object)');
+ $this->dbConn->execute("CREATE TABLE `dataset_model` (
+ `datasetName` varchar(255) NOT NULL default '0',
+ `modelId` bigint(20) NOT NULL default '0',
+ `graphURI` varchar(255) NOT NULL default '',
+ PRIMARY KEY (`modelId`,`datasetName`))");
- if (!$this->dbConn->completeTrans())
- echo $this->dbConn->errorMsg();
- }
+ $this->dbConn->execute("CREATE TABLE `datasets` (
+ `datasetName` varchar(255) NOT NULL default '',
+ `defaultModelUri` varchar(255) NOT NULL default '0',
+ PRIMARY KEY (`datasetName`),
+ KEY `datasetName` (`datasetName`))");
- /**
- * Create tables and indexes for MSSQL database
- *
- * @throws SqlError
- * @access private
- */
- function _createTables_mssql(){
+ $this->dbConn->execute('CREATE INDEX s_mod_idx ON statements (modelID)');
+ $this->dbConn->execute('CREATE INDEX n_mod_idx ON namespaces (modelID)');
- $this->dbConn->startTrans();
+ $this->dbConn->execute('CREATE INDEX s_sub_pred_idx ON statements
+ (subject(200),predicate(200))');
- $this->dbConn->execute("CREATE TABLE [dbo].[models] (
- [modelID] [int] NOT NULL ,
- [modelURI] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- [baseURI] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
- ) ON [PRIMARY]");
+ $this->dbConn->execute('CREATE INDEX s_sub_idx ON statements (subject(200))');
+ $this->dbConn->execute('CREATE INDEX s_pred_idx ON statements (predicate(200))');
+ $this->dbConn->execute('CREATE INDEX s_obj_idx ON statements (object(250))');
- $this->dbConn->execute("CREATE TABLE [dbo].[statements] (
- [modelID] [int] NOT NULL ,
- [subject] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- [predicate] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- [object] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- [l_language] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- [l_datatype] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- [subject_is] [nchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- [object_is] [nchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
- ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]");
+ $this->dbConn->execute('CREATE FULLTEXT INDEX s_obj_ftidx ON statements (object)');
+ if (!$this->dbConn->completeTrans()) {
+ throw new Exception($this->dbConn->errorMsg());
+ }
+ return true;
+ }
- $this->dbConn->execute("CREATE TABLE [dbo].[namespaces] (
- [modelID] [int] NOT NULL ,
- [namespace] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
- [prefix] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
- ) ON [PRIMARY]");
- $this->dbConn->execute("ALTER TABLE [dbo].[models] WITH NOCHECK ADD
- CONSTRAINT [PK_models] PRIMARY KEY CLUSTERED
- (
- [modelID]
- ) ON [PRIMARY] ");
- $this->dbConn->execute("ALTER TABLE [dbo].[namespaces] WITH NOCHECK ADD
- CONSTRAINT [PK_namespaces] PRIMARY KEY CLUSTERED
- (
- [modelID],[namespace]
- ) ON [PRIMARY] ");
- $this->dbConn->execute("CREATE INDEX [joint index on subject and predicate] ON [dbo].[statements]([subject], [predicate]) ON [PRIMARY]");
+ /**
+ * Create tables and indexes for MSSQL database
+ *
+ * @return boolean true If all is ok
+ *
+ * @throws Exception
+ */
+ function _createTables_MSSQL()
+ {
+ $this->dbConn->startTrans();
+ $this->dbConn->execute("CREATE TABLE [dbo].[models] (
+ [modelID] [int] NOT NULL ,
+ [modelURI] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
+ [baseURI] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
+ ) ON [PRIMARY]");
- if (!$this->dbConn->completeTrans())
- echo $this->dbConn->errorMsg();
+ $this->dbConn->execute("CREATE TABLE [dbo].[statements] (
+ [modelID] [int] NOT NULL ,
+ [subject] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
+ [predicate] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
+ [object] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
+ [l_language] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
+ [l_datatype] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
+ [subject_is] [nchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
+ [object_is] [nchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
+ ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]");
- }
+ $this->dbConn->execute("CREATE TABLE [dbo].[namespaces] (
+ [modelID] [int] NOT NULL ,
+ [namespace] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
+ [prefix] [nvarchar] (200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
+ ) ON [PRIMARY]");
- /**
- * Checks if tables are setup for RAP
- *
- * @param string $databaseType
- * @throws SqlError
- * @access public
- **/
- function isSetup($databaseType="MySQL") {
- if ($databaseType=="MySQL")
- return $this->_isSetup_MySql();
- if ($databaseType=="MSSQL")
- return $this->_isSetup_MSSQL();
- else {
- if ($databaseType=='MsAccess'){
- return $this->_isSetup_MsAccess();
- }else{
- $errmsg=RDFAPI_ERROR."(class: DbStore; method isSetup('$databaseType')):\nCurrently only MySQL, MsAccess and MSSQL are supported!";
- trigger_error($errmsg, E_USER_ERROR);}
- }
- }
+ $this->dbConn->execute("ALTER TABLE [dbo].[models] WITH NOCHECK ADD
+ CONSTRAINT [PK_models] PRIMARY KEY CLUSTERED
+ (
+ [modelID]
+ ) ON [PRIMARY] ");
+ $this->dbConn->execute("ALTER TABLE [dbo].[namespaces] WITH NOCHECK ADD
+ CONSTRAINT [PK_namespaces] PRIMARY KEY CLUSTERED
+ (
+ [modelID],[namespace]
+ ) ON [PRIMARY] ");
+ $this->dbConn->execute("CREATE INDEX [joint index on subject and predicate] ON [dbo].[statements]([subject], [predicate]) ON [PRIMARY]");
+
+
+ if (!$this->dbConn->completeTrans()) {
+ throw new Exception($this->dbConn->errorMsg());
+ }
+ return true;
+ }
+
+
+
+ /**
+ * Checks if tables are setup for RAP
+ *
+ * @param string $databaseType
+ * @throws Exception If database type is unsupported
+ * @access public
+ **/
+ public function isSetup($databaseType = null)
+ {
+ $driver = $this->getDriver($databaseType);
+ $this->assertDriverSupported($driver);
+
+ $issetupFunc = '_isSetup_' . $driver;
+ return $this->$issetupFunc();
+ }//public function isSetup($databaseType="MySQL")
+
+
+
+ /**
+ * Returns the driver for the database type.
+ * You can pass NULL or omit the parameter to
+ * use the parameter from the dbstore constructor
+ *
+ * @return string Database driver string
+ */
+ protected function getDriver($databaseType = null)
+ {
+ if ($databaseType === null) {
+ if ($this->driver === null) {
+ //backward compatibility
+ $databaseType = 'MySQL';
+ } else {
+ $databaseType = $this->driver;
+ }
+ }
+ return $databaseType;
+ }//protected function getDriver($databaseType = null)
+
+
+
+ /**
+ * Checks if the given driver is supported and throws an
+ * Exception if not.
+ *
+ * @param string $databaseType Database driver name (e.g. MySQL)
+ *
+ * @return true If it does not fail
+ *
+ * @throws Exception If the driver is not supported
+ */
+ protected function assertDriverSupported($databaseType)
+ {
+ if (!in_array($databaseType, self::$arSupportedDbTypes)) {
+ throw new Exception(
+ 'Unsupported database type, only supported: '
+ . implode(', ', self::$arSupportedDbTypes)
+ );
+ }
+ return true;
+ }//protected function assertDriverSupported($databaseType)
+
+
+
/**
* Checks if tables are setup for RAP (MySql)
*
Added: trunk/rdfapi-php/test/setup.php
===================================================================
--- trunk/rdfapi-php/test/setup.php (rev 0)
+++ trunk/rdfapi-php/test/setup.php 2007-10-09 15:48:01 UTC (rev 541)
@@ -0,0 +1,54 @@
+<?php
+/**
+* Prepares your system for RAP.
+* Creates database tables if they don't exist yet
+*/
+
+$strConfFile = dirname(__FILE__) . '/config.php';
+if (!file_exists($strConfFile)) {
+ die('Please copy "test/config.php.dist" to "test/config.php" and adjust it');
+}
+require_once $strConfFile;
+require_once RDFAPI_INCLUDE_DIR . '/model/ModelFactory.php';
+
+
+
+try {
+ $database = ModelFactory::getDbStore(
+ $GLOBALS['dbConf']['type'], $GLOBALS['dbConf']['host'],
+ $GLOBALS['dbConf']['database'], $GLOBALS['dbConf']['user'],
+ $GLOBALS['dbConf']['password']
+ );
+} catch (Exception $e) {
+ echo "Error: " . $e->getMessage() . "\n";
+ echo "Maybe the database '" . $GLOBALS['dbConf']['database'] . "' does not exist?\n";
+ exit(3);
+}
+
+if ($database->isSetup()) {
+ echo "Database is already setup.\n";
+ exit(0);
+}
+
+try {
+ $database->createTables();
+} catch (Exception $e) {
+ //mysql doesn't complete the transaction but is ok
+ if ($e->getMessage() != '') {
+ echo "Error: " . $e->getMessage() . "\n";
+ echo "Something failed when creating the tables\n";
+ exit(2);
+ }
+}
+
+
+if ($database->isSetup()) {
+ echo "Database has been setup.\n";
+ exit(0);
+} else {
+ echo "Database tables have been created, but somehow it still\n"
+ . " setup is incomplete. File a bug\n";
+ exit(1);
+}
+
+?>
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|