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. |