Code Coverage for /home/user/workspace/all/Pyrus/src/Pyrus/Registry/Sqlite3/Creator.php in Config/loadConfigFile/gooduserfile.phpt

Coverage: 43%

Aggregate Code Coverage for all tests

       1           : <?php
       2           : /**
       3           :  * PEAR2_Pyrus_Registry_Sqlite3_Creator
       4           :  *
       5           :  * PHP version 5
       6           :  *
       7           :  * @category  PEAR2
       8           :  * @package   PEAR2_Pyrus
       9           :  * @author    Greg Beaver <cellog@php.net>
      10           :  * @copyright 2008 The PEAR Group
      11           :  * @license   http://www.opensource.org/licenses/bsd-license.php New BSD License
      12           :  * @version   SVN: $Id$
      13           :  * @link      http://svn.pear.php.net/wsvn/PEARSVN/Pyrus/
      14           :  */
      15           : 
      16           : /**
      17           :  * Initialize a sqlite3 registry
      18           :  *
      19           :  * @category  PEAR2
      20           :  * @package   PEAR2_Pyrus
      21           :  * @author    Greg Beaver <cellog@php.net>
      22           :  * @copyright 2008 The PEAR Group
      23           :  * @license   http://www.opensource.org/licenses/bsd-license.php New BSD License
      24           :  * @link      http://svn.pear.php.net/wsvn/PEARSVN/Pyrus/
      25           :  */
      26           : class PEAR2_Pyrus_Registry_Sqlite3_Creator
      27         1 : {
      28           :     /**
      29           :      * Initialize the database for the registry
      30           :      *
      31           :      * Registry information that must be stored:
      32           :      *
      33           :      * - A list of installed packages
      34           :      * - the files in each package
      35           :      * - known channels
      36           :      *
      37           :      * The SQLite database has this structure:
      38           :      *
      39           :      * <pre>
      40           :      * CREATE TABLE packages (
      41           :      *  name TEXT(80) NOT NULL,
      42           :      *  channel TEXT(255) NOT NULL,
      43           :      *  version TEXT(20) NOT NULL,
      44           :      *  apiversion TEXT(20) NOT NULL,
      45           :      *  summary TEXT NOT NULL,
      46           :      *  description TEXT NOT NULL,
      47           :      *  stability TEXT(8) NOT NULL,
      48           :      *  apistability TEXT(8) NOT NULL,
      49           :      *  releasedate DATE NOT NULL,
      50           :      *  releasetime TIME,
      51           :      *  license TEXT(50) NOT NULL,
      52           :      *  licenseuri TEXT,
      53           :      *  licensepath TEXT,
      54           :      *  releasenotes TEXT,
      55           :      *  lastinstalledversion TEXT(20),
      56           :      *  installedwithpear TEXT(20),
      57           :      *  installtimeconfig TEXT(50), -- the path to configuration as stored
      58           :      *  PRIMARY KEY (name, channel)
      59           :      * );
      60           :      *
      61           :      * CREATE TABLE maintainers (
      62           :      *  packages_name TEXT(80) NOT NULL,
      63           :      *  packages_channel TEXT(255) NOT NULL,
      64           :      *  role TEXT(11) NOT NULL,
      65           :      *  user TEXT(20) NOT NULL,
      66           :      *  name TEXT(200) NOT NULL,
      67           :      *  email TEXT(100) NOT NULL,
      68           :      *  active CHAR(3) NOT NULL,
      69           :      *  PRIMARY KEY (packages_name, packages_channel, user)
      70           :      * );
      71           :      *
      72           :      * CREATE TABLE files (
      73           :      *  packages_name TEXT(80) NOT NULL,
      74           :      *  packages_channel TEXT(255) NOT NULL,
      75           :      *  packagepath TEXT(255) NOT NULL,
      76           :      *  role TEXT(30) NOT NULL,
      77           :      *  rolepath TEXT(255) NOT NULL,
      78           :      *  PRIMARY KEY (packagepath, role, rolepath),
      79           :      *  UNIQUE (packages_name, packages_channel, packagepath)
      80           :      * );
      81           :      *
      82           :      * CREATE TABLE package_dependencies (
      83           :      *  required BOOL NOT NULL,
      84           :      *  packages_name TEXT(80) NOT NULL,
      85           :      *  packages_channel TEXT(255) NOT NULL,
      86           :      *  deppackage TEXT(80) NOT NULL,
      87           :      *  depchannel TEXT(255) NOT NULL,
      88           :      *  conflicts BOOL NOT NULL,
      89           :      *  min TEXT(20),
      90           :      *  max TEXT(20),
      91           :      *  PRIMARY KEY (required, packages_name, packages_channel, deppackage, depchannel)
      92           :      * );
      93           :      *
      94           :      * CREATE TABLE package_dependencies_exclude (
      95           :      *  required BOOL NOT NULL,
      96           :      *  packages_name TEXT(80) NOT NULL,
      97           :      *  packages_channel TEXT(255) NOT NULL,
      98           :      *  deppackage TEXT(80) NOT NULL,
      99           :      *  depchannel TEXT(255) NOT NULL,
     100           :      *  conflicts BOOL NOT NULL,
     101           :      *  exclude TEXT(20) NOT NULL,
     102           :      *  PRIMARY KEY (required, packages_name, packages_channel, deppackage, depchannel, exclude)
     103           :      * );
     104           :      *
     105           :      * CREATE TABLE channels (
     106           :      *  channel TEXT NOT NULL,
     107           :      *  summary TEXT NOT NULL,
     108           :      *  suggestedalias TEXT(50) NOT NULL,
     109           :      *  alias TEXT(50) NOT NULL,
     110           :      *  validatepackageversion TEXT(20) NOT NULL default "default",
     111           :      *  validatepackage NOT NULL default "PEAR_Validate",
     112           :      *  lastmodified DATETIME,
     113           :      *  PRIMARY KEY (channel),
     114           :      *  UNIQUE(alias)
     115           :      * );
     116           :      *
     117           :      * CREATE TABLE channel_servers (
     118           :      *  channel TEXT NOT NULL,
     119           :      *  server TEXT NOT NULL,
     120           :      *  ssl integer NOT NULL default 0,
     121           :      *  port integer NOT NULL default 80,
     122           :      *  PRIMARY KEY (channel, server)
     123           :      * );
     124           :      *
     125           :      * CREATE TABLE channel_server_rest (
     126           :      *  channel TEXT NOT NULL,
     127           :      *  server TEXT NOT NULL,
     128           :      *  type TEXT NOT NULL,
     129           :      *  baseurl TEXT NOT NULL,
     130           :      *  PRIMARY KEY (channel, server, baseurl, type)
     131           :      * );
     132           :      *
     133           :      * CREATE TABLE pearregistryversion (
     134           :      *  version TEXT(20) NOT NULL default "1.0.0"
     135           :      * );
     136           :      *
     137           :      * INSERT INTO pearregistryversion VALUES("1.0.0");
     138           :      *
     139           :      * CREATE TRIGGER package_delete DELETE ON packages
     140           :      *   FOR EACH ROW BEGIN
     141           :      *     DELETE FROM maintainers
     142           :      *     WHERE
     143           :      *       maintainers.packages_name = old.name AND
     144           :      *       maintainers.packages_channel = old.channel;
     145           :      *     DELETE FROM files
     146           :      *     WHERE
     147           :      *       files.packages_name = old.name AND
     148           :      *       files.packages_channel = old.channel;
     149           :      *     DELETE FROM package_dependencies
     150           :      *     WHERE
     151           :      *       package_dependencies.packages_name = old.name AND
     152           :      *       package_dependencies.packages_channel = old.channel;
     153           :      *     DELETE FROM package_dependencies_exclude
     154           :      *     WHERE
     155           :      *       package_dependencies_exclude.packages_name = old.name AND
     156           :      *       package_dependencies_exclude.packages_channel = old.channel;
     157           :      *   END;
     158           :      *
     159           :      * CREATE TRIGGER channel_delete DELETE ON channels
     160           :      *   FOR EACH ROW BEGIN
     161           :      *     DELETE FROM channel_servers
     162           :      *     WHERE
     163           :      *       channel_servers.channel = old.channel;
     164           :      *     DELETE FROM channel_server_rest
     165           :      *     WHERE
     166           :      *       channel_server_rest.channel = old.channel;
     167           :      *   END;
     168           :      * CREATE VIEW deps AS
     169           :      *   SELECT
     170           :      *       packages_name,
     171           :      *       packages_channel
     172           :      *       deppackage,
     173           :      *       depchannel,
     174           :      *       null as exclude,
     175           :      *       conflicts,
     176           :      *       min,
     177           :      *       max
     178           :      *   FROM package_dependencies
     179           :      *   UNION
     180           :      *   SELECT
     181           :      *       packages_name,
     182           :      *       packages_channel
     183           :      *       deppackage,
     184           :      *       depchannel,
     185           :      *       exclude,
     186           :      *       conflicts,
     187           :      *       null as min,
     188           :      *       null as max
     189           :      *   FROM package_dependencies_exclude
     190           :      *
     191           :      * CREATE VIEW protocols AS
     192           :      *  SELECT
     193           :      *      channel,
     194           :      *      server,
     195           :      *      baseurl as function,
     196           :      *      type as version,
     197           :      *      "rest" as protocol
     198           :      *  FROM channel_server_rest
     199           :      *
     200           :      * </pre>
     201           :      */
     202           :     function create(SQLite3 $database)
     203           :     {
     204         1 :         if (!@$database->exec('BEGIN')) {
     205           :             $error = $database->lastErrorMsg();
     206           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     207           :         }
     208           : 
     209           :         $query = '
     210           :           CREATE TABLE packages (
     211           :            name TEXT(80) NOT NULL,
     212           :            channel TEXT(255) NOT NULL,
     213           :            version TEXT(20) NOT NULL,
     214           :            apiversion TEXT(20) NOT NULL,
     215           :            summary TEXT NOT NULL,
     216           :            description TEXT NOT NULL,
     217           :            stability TEXT(8) NOT NULL,
     218           :            apistability TEXT(8) NOT NULL,
     219           :            releasedate DATE NOT NULL,
     220           :            releasetime TIME,
     221           :            license TEXT(50) NOT NULL,
     222           :            licenseuri TEXT,
     223           :            licensepath TEXT,
     224           :            releasenotes TEXT,
     225           :            lastinstalledversion TEXT(20),
     226           :            installedwithpear TEXT(20),
     227           :            installtimeconfig TEXT(50),
     228           :            PRIMARY KEY (name, channel)
     229         1 :           );';
     230         1 :         $worked = $database->exec($query);
     231         1 :         if (!$worked) {
     232           :             @$database->exec('ROLLBACK');
     233           :             $error = $database->lastErrorMsg();
     234           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     235           :         }
     236           : 
     237           :         $query = '
     238           :           CREATE TABLE maintainers (
     239           :            packages_name TEXT(80) NOT NULL,
     240           :            packages_channel TEXT(255) NOT NULL,
     241           :            role TEXT(11) NOT NULL,
     242           :            name TEXT(200) NOT NULL,
     243           :            user TEXT(20) NOT NULL,
     244           :            email TEXT(100) NOT NULL,
     245           :            active CHAR(3) NOT NULL,
     246           :            PRIMARY KEY (packages_name, packages_channel, user)
     247         1 :           );';
     248         1 :         $worked = @$database->exec($query);
     249         1 :         if (!$worked) {
     250           :             @$database->exec('ROLLBACK');
     251           :             $error = $database->lastErrorMsg();
     252           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     253           :         }
     254           : 
     255           :         $query = '
     256           :           CREATE TABLE files (
     257           :            packages_name TEXT(80) NOT NULL,
     258           :            packages_channel TEXT(255) NOT NULL,
     259           :            packagepath TEXT(255) NOT NULL,
     260           :            role TEXT(30) NOT NULL,
     261           :            rolepath TEXT(255) NOT NULL,
     262           :            PRIMARY KEY (packagepath, role, rolepath),
     263           :            UNIQUE (packages_name, packages_channel, packagepath)
     264         1 :           );';
     265         1 :         $worked = @$database->exec($query);
     266         1 :         if (!$worked) {
     267           :             @$database->exec('ROLLBACK');
     268           :             $error = $database->lastErrorMsg();
     269           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     270           :         }
     271           : 
     272           :         $query = '
     273           :           CREATE TABLE package_dependencies (
     274           :            required BOOL NOT NULL,
     275           :            packages_name TEXT(80) NOT NULL,
     276           :            packages_channel TEXT(255) NOT NULL,
     277           :            deppackage TEXT(80) NOT NULL,
     278           :            depchannel TEXT(255) NOT NULL,
     279           :            conflicts BOOL NOT NULL,
     280           :            min TEXT(20),
     281           :            max TEXT(20),
     282           :            PRIMARY KEY (required, packages_name, packages_channel, deppackage, depchannel)
     283         1 :           );';
     284         1 :         $worked = @$database->exec($query);
     285         1 :         if (!$worked) {
     286           :             @$database->exec('ROLLBACK');
     287           :             $error = $database->lastErrorMsg();
     288           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     289           :         }
     290           : 
     291           :         $query = '
     292           :           CREATE TABLE package_dependencies_exclude (
     293           :            required BOOL NOT NULL,
     294           :            packages_name TEXT(80) NOT NULL,
     295           :            packages_channel TEXT(255) NOT NULL,
     296           :            deppackage TEXT(80) NOT NULL,
     297           :            depchannel TEXT(255) NOT NULL,
     298           :            conflicts BOOL NOT NULL,
     299           :            exclude TEXT(20) NOT NULL,
     300           :            PRIMARY KEY (required, packages_name, packages_channel, deppackage, depchannel, exclude)
     301         1 :           );';
     302         1 :         $worked = @$database->exec($query);
     303         1 :         if (!$worked) {
     304           :             @$database->exec('ROLLBACK');
     305           :             $error = $database->lastErrorMsg();
     306           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     307           :         }
     308           : 
     309           :         $query = '
     310           :           CREATE TABLE channels (
     311           :            channel TEXT NOT NULL,
     312           :            summary TEXT NOT NULL,
     313           :            suggestedalias TEXT(50) NOT NULL,
     314           :            alias TEXT(50) NOT NULL,
     315           :            validatepackageversion TEXT(20) NOT NULL default "default",
     316           :            validatepackage NOT NULL default "PEAR_Validate",
     317           :            lastmodified TEXT,
     318           :            PRIMARY KEY (channel),
     319           :            UNIQUE(alias)
     320         1 :           );';
     321         1 :         $worked = @$database->exec($query);
     322         1 :         if (!$worked) {
     323           :             @$database->exec('ROLLBACK');
     324           :             $error = $database->lastErrorMsg();
     325           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     326           :         }
     327           : 
     328           :         $query = '
     329           :           CREATE TABLE channel_servers (
     330           :            channel TEXT NOT NULL,
     331           :            server TEXT NOT NULL,
     332           :            ssl integer NOT NULL default 0,
     333           :            port integer NOT NULL default 80,
     334           :            PRIMARY KEY (channel, server)
     335         1 :           );';
     336         1 :         $worked = @$database->exec($query);
     337         1 :         if (!$worked) {
     338           :             @$database->exec('ROLLBACK');
     339           :             $error = $database->lastErrorMsg();
     340           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     341           :         }
     342           : 
     343           :         $query = '
     344           :           CREATE TABLE channel_server_rest (
     345           :            channel TEXT NOT NULL,
     346           :            server TEXT NOT NULL,
     347           :            type TEXT NOT NULL,
     348           :            baseurl TEXT NOT NULL,
     349           :            PRIMARY KEY (channel, server, baseurl, type)
     350         1 :           );';
     351         1 :         $worked = @$database->exec($query);
     352         1 :         if (!$worked) {
     353           :             @$database->exec('ROLLBACK');
     354           :             $error = $database->lastErrorMsg();
     355           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     356           :         }
     357           : 
     358           :         $query = '
     359           :           CREATE TABLE pearregistryversion (
     360           :            version TEXT(20) NOT NULL
     361           :           );
     362           : 
     363           :           INSERT INTO pearregistryversion VALUES("1.0.0");
     364         1 :         ';
     365         1 :         $worked = @$database->exec($query);
     366         1 :         if (!$worked) {
     367           :             @$database->exec('ROLLBACK');
     368           :             $error = $database->lastErrorMsg();
     369           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     370           :         }
     371           : 
     372           :         $query = '
     373           :           CREATE TRIGGER package_delete DELETE ON packages
     374           :             FOR EACH ROW BEGIN
     375           :               DELETE FROM maintainers
     376           :               WHERE
     377           :                 maintainers.packages_name = old.name AND
     378           :                 maintainers.packages_channel = old.channel;
     379           :               DELETE FROM files
     380           :               WHERE
     381           :                 files.packages_name = old.name AND
     382           :                 files.packages_channel = old.channel;
     383           :               DELETE FROM package_dependencies
     384           :               WHERE
     385           :                 package_dependencies.packages_name = old.name AND
     386           :                 package_dependencies.packages_channel = old.channel;
     387           :               DELETE FROM package_dependencies_exclude
     388           :               WHERE
     389           :                 package_dependencies_exclude.packages_name = old.name AND
     390           :                 package_dependencies_exclude.packages_channel = old.channel;
     391           :             END;
     392         1 :         ';
     393         1 :         $worked = @$database->exec($query);
     394         1 :         if (!$worked) {
     395           :             @$database->exec('ROLLBACK');
     396           :             $error = $database->lastErrorMsg();
     397           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     398           :         }
     399           : 
     400           :         $query = '
     401           :             CREATE TRIGGER channel_check BEFORE DELETE ON channels
     402           :             BEGIN
     403           :              SELECT RAISE(ROLLBACK, \'Cannot delete channel, installed packages use it\')
     404           :              WHERE old.channel IN (SELECT channel FROM packages);
     405         1 :             END;';
     406         1 :         $worked = @$database->exec($query);
     407         1 :         if (!$worked) {
     408           :             @$database->exec('ROLLBACK');
     409           :             $error = $database->lastErrorMsg();
     410           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     411           :         }
     412           : 
     413           :         $query = '
     414           :           CREATE TRIGGER channel_delete DELETE ON channels
     415           :             FOR EACH ROW BEGIN
     416           :               DELETE FROM channel_servers
     417           :               WHERE
     418           :                 channel_servers.channel = old.channel;
     419           :               DELETE FROM channel_server_rest
     420           :               WHERE
     421           :                 channel_server_rest.channel = old.channel;
     422           :             END;
     423         1 :         ';
     424         1 :         $worked = @$database->exec($query);
     425         1 :         if (!$worked) {
     426           :             @$database->exec('ROLLBACK');
     427           :             $error = $database->lastErrorMsg();
     428           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     429           :         }
     430           : 
     431           :         $query = '
     432           :           CREATE VIEW deps AS
     433           :             SELECT
     434           :                 packages_name,
     435           :                 packages_channel
     436           :                 deppackage,
     437           :                 depchannel,
     438           :                 null as exclude,
     439           :                 conflicts,
     440           :                 min,
     441           :                 max
     442           :             FROM package_dependencies
     443           :             UNION
     444           :             SELECT
     445           :                 packages_name,
     446           :                 packages_channel
     447           :                 deppackage,
     448           :                 depchannel,
     449           :                 exclude,
     450           :                 conflicts,
     451           :                 null as min,
     452           :                 null as max
     453           :             FROM package_dependencies_exclude
     454         1 :         ';
     455         1 :         $worked = @$database->exec($query);
     456         1 :         if (!$worked) {
     457           :             @$database->exec('ROLLBACK');
     458           :             $error = $database->lastErrorMsg();
     459           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     460           :         }
     461           : 
     462           :         $query = '
     463           :           CREATE VIEW protocols AS
     464           :             SELECT
     465           :                 channel,
     466           :                 server,
     467           :                 baseurl as function,
     468           :                 type as version,
     469           :                 "rest" as protocol
     470           :             FROM channel_server_rest
     471         1 :         ';
     472         1 :         $worked = @$database->exec($query);
     473         1 :         if (!$worked) {
     474           :             @$database->exec('ROLLBACK');
     475           :             $error = $database->lastErrorMsg();
     476           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     477           :         }
     478         1 :         $worked = @$database->exec('COMMIT');
     479         1 :         if (!$worked) {
     480           :             @$database->exec('ROLLBACK');
     481           :             $error = $database->lastErrorMsg();
     482           :             throw new PEAR2_Pyrus_Registry_Exception('Cannot initialize SQLite3 registry: ' . $error);
     483           :         }
     484         1 :     }
     485           : }