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 : }