function _install($info, $replace) { $database = static::getRegistry($this->_path); if (!$replace) { $info = $info->toRaw(); // this avoids potential exception on setting date/time // which can happen if $info is a registry package that // has been uninstalled $info->date = date('Y-m-d'); $info->time = date('H:i:s'); } $licloc = $info->license; $licuri = $info->license['uri']; $licpath = $info->license['path']; $sql = ' INSERT INTO packages (lcname, name, channel, version, apiversion, summary, packagetype, description, stability, apistability, releasedate, releasetime, license, licenseuri, licensepath, releasenotes, lastinstalledversion, installedwithpear, installtimeconfig) VALUES(:lcname, :name, :channel, :versionrelease, :versionapi, :summary, :packagetype, :description, :stabilityrelease, :stabilityapi, :date, :time, :license, :licenseuri, :licensepath, :notes, :lastinstalledv, :lastinstalledp, :lastinstalltime )'; $stmt = $database->prepare($sql); $n = $info->name; $c = $info->channel; $stmt->bindValue(':lcname', strtolower($n)); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':versionrelease', $info->version['release']); $stmt->bindValue(':versionapi', $info->version['api']); $stmt->bindValue(':summary', $info->summary); $stmt->bindValue(':description', $info->description); $stmt->bindValue(':packagetype', $info->type); $stmt->bindValue(':stabilityrelease', $info->stability['release']); $stmt->bindValue(':stabilityapi', $info->stability['api']); $stmt->bindValue(':date', $info->date); $stmt->bindValue(':time', $info->time); $stmt->bindValue(':license', $info->license['name']); $stmt->bindValue(':licenseuri', $licuri, $licuri === null ? SQLITE3_NULL : SQLITE3_TEXT); $stmt->bindValue(':licensepath', $licpath, $licpath === null ? SQLITE3_NULL : SQLITE3_TEXT); $stmt->bindValue(':notes', $info->notes); $stmt->bindValue(':lastinstalledv', null, SQLITE3_NULL); if ('@PACKAGE_VERSION@' == '@' . 'PACKAGE_VERSION@') { $v = '2.0.0a1'; } else { $v = '@PACKAGE_VERSION@'; } $stmt->bindValue(':lastinstalledp', $v); $stmt->bindValue(':lastinstalltime', Config::configSnapshot()); $stmt->execute(); $stmt->close(); $n = strtolower($n); $sql = ' INSERT INTO maintainers (packages_name, packages_channel, role, name, user, email, active) VALUES (:name, :channel, :role, :m_name, :m_user, :m_email, :m_active)'; $stmt = $database->prepare($sql); foreach ($info->allmaintainers as $role => $maintainers) { foreach ($maintainers as $maintainer) { $stmt->clear(); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':role', $role); $stmt->bindValue(':m_name', $maintainer->name); $stmt->bindValue(':m_user', $maintainer->user); $stmt->bindValue(':m_email', $maintainer->email); $stmt->bindValue(':m_active', $maintainer->active); @$stmt->execute(); } } $stmt->close(); $curconfig = Config::current(); $roles = array(); $sql = ' INSERT INTO configureoptions (packages_name, packages_channel, name, prompt, defaultValue) VALUES(:name, :channel, :oname, :prompt, :default)'; \Pyrus\Logger::log(4, 'Preparing SQL: ' . $sql); $stmt = $database->prepare($sql); $stmt->bindValue(':name', $n); \Pyrus\Logger::log(4, 'Binding SQL parameter :name: ' . var_export($n, true)); $stmt->bindValue(':channel', $c); \Pyrus\Logger::log(4, 'Binding SQL parameter :channel: ' . var_export($c, true)); foreach ($info->installrelease->configureoption as $option) { $stmt->bindValue(':oname', $option->name); \Pyrus\Logger::log(4, 'Binding SQL parameter :oname: ' . var_export($option->name, true)); $stmt->bindValue(':prompt', $option->prompt); \Pyrus\Logger::log(4, 'Binding SQL parameter :prompt: ' . var_export($option->prompt, true)); if ($option->default === null) { $stmt->bindValue(':default', null, SQLITE3_NULL); \Pyrus\Logger::log(4, 'Binding SQL parameter :default: NULL'); } else { $stmt->bindValue(':default', $option->default); \Pyrus\Logger::log(4, 'Binding SQL parameter :default: ' . var_export($option->default, true)); } $stmt->execute(); } $sql = ' INSERT INTO files (packages_name, packages_channel, packagepath, configpath, role, relativepath, origpath, baseinstalldir, tasks, md5sum) VALUES(:name, :channel, :path, :configpath, :role, :relativepath, :origpath, :baseinstall, :tasks, :md5)'; $stmt = $database->prepare($sql); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); foreach (Role::getValidRoles($info->getPackageType()) as $role) { // set up a list of file role => configuration variable // for storing in the registry $roles[$role] = Role::factory($info->getPackageType(), $role); } foreach ($info->installcontents as $file) { $relativepath = $roles[$file->role]->getRelativeLocation($info, $file); if (!$relativepath) { continue; } $p = $curconfig->{$roles[$file->role]->getLocationConfig()}; $stmt->bindValue(':relativepath', $relativepath); $stmt->bindValue(':configpath', $p); $stmt->bindValue(':path', $p . DIRECTORY_SEPARATOR . $relativepath); $stmt->bindValue(':origpath', $file->packagedname); $stmt->bindValue(':role', $file->role); $stmt->bindValue(':baseinstall', $file->baseinstalldir); $stmt->bindValue(':tasks', serialize($file->tasks)); if ($file->md5sum) { $stmt->bindValue(':md5', $file->md5sum); } else { // clearly the person installing doesn't care about this, so // use a dummy value $stmt->bindValue(':md5', md5('')); } $stmt->execute(); } $stmt->close(); $sql = ' INSERT INTO baseinstalldirs (packages_name, packages_channel, dirname, baseinstall) VALUES(:name, :channel, :dirname, :baseinstall)'; $stmt = $database->prepare($sql); foreach ($info->getBaseInstallDirs() as $dir => $base) { $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':dirname', $dir); $stmt->bindValue(':baseinstall', $base); $stmt->execute(); } $stmt->close(); if (count($info->compatible)) { $sql = ' INSERT INTO compatible_releases (packages_name, packages_channel, compat_package, compat_channel, min, max) VALUES (:name, :channel, :cname, :cchannel, :min, :max)'; $stmt = $database->prepare($sql); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $sql2 = ' INSERT INTO compatible_releases_exclude (packages_name, packages_channel, compat_package, compat_channel, exclude) VALUES (:name, :channel, :cname, :cchannel, :exclude)'; $stmt2 = $database->prepare($sql2); $stmt2->bindValue(':name', $n); $stmt2->bindValue(':channel', $c); foreach ($info->compatible as $compatible) { $stmt->bindValue(':cname', $compatible->name); $stmt->bindValue(':cchannel', $compatible->channel); $stmt->bindValue(':min', $compatible->min); $stmt->bindValue(':max', $compatible->max); $stmt->execute(); if (isset($compatible->exclude)) { $stmt2->bindValue(':cname', $compatible->name); $stmt2->bindValue(':cchannel', $compatible->channel); foreach ($compatible->exclude as $exclude) { $stmt2->bindValue(':exclude', $exclude); $stmt2->execute(); } } } } $sql = ' INSERT INTO extension_dependencies (required, packages_name, packages_channel, extension, conflicts, min, max, recommended) VALUES (:required, :name, :channel, :extension, :conflicts, :min, :max, :recommended)'; $stmt = $database->prepare($sql); foreach (array('required', 'optional') as $required) { foreach ($info->dependencies[$required]->extension as $d) { // $d is a \Pyrus\PackageFile\v2\Dependencies\Package object $req = $required == 'required' ? 1 : 0; $stmt->bindValue(':required', $req, SQLITE3_INTEGER); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':extension', $d->name); $stmt->bindValue(':conflicts', $d->conflicts, SQLITE3_INTEGER); $stmt->bindValue(':min', $d->min); $stmt->bindValue(':max', $d->max); $stmt->bindValue(':recommended', $d->recommended); $stmt->execute(); if (isset($d->exclude)) { $sql = ' INSERT INTO extension_dependencies_exclude (required, packages_name, packages_channel, extension, exclude, conflicts) VALUES(:required, :name, :channel, :extension, :exclude, :conflicts)'; $stmt1 = $database->prepare($sql); foreach ($d->exclude as $exclude) { $stmt1->clear(); $req = $required == 'required' ? 1 : 0; $stmt1->bindValue(':required', $req, SQLITE3_INTEGER); $stmt1->bindValue(':name', $n); $stmt1->bindValue(':channel', $c); $stmt1->bindValue(':extension', $d->name); $stmt1->bindValue(':exclude', $exclude); $stmt1->bindValue(':conflicts', $d->conflicts, SQLITE3_INTEGER); $stmt1->execute(); } $stmt1->close(); } } } $stmt->close(); $sql = ' INSERT INTO package_dependencies (required, packages_name, packages_channel, deppackage, depchannel, conflicts, min, max, recommended, is_subpackage, providesextension) VALUES (:required, :name, :channel, :dep_package, :dep_channel, :conflicts, :min, :max, :recommended, :sub, :ext)'; $stmt = $database->prepare($sql); $first = true; foreach (array('required', 'optional') as $required) { foreach (array('package', 'subpackage') as $package) { foreach ($info->dependencies[$required]->{$package} as $d) { // $d is a \Pyrus\PackageFile\v2\Dependencies\Package object $sub = $package == 'subpackage'; if (!$first) { $stmt->clear(); $first = false; } $req = $required == 'required' ? 1 : 0; $stmt->bindValue(':required', $req, SQLITE3_INTEGER); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':dep_package', $d->name); $stmt->bindValue(':dep_channel', $d->channel); $con = $d->conflicts; $stmt->bindValue(':conflicts', $con, SQLITE3_INTEGER); $stmt->bindValue(':min', $d->min); $stmt->bindValue(':max', $d->max); $stmt->bindValue(':recommended', $d->recommended); $stmt->bindValue(':sub', $sub); if ($d->providesextension) { $stmt->bindValue(':ext', $d->providesextension); } else { $stmt->bindValue(':ext', null, SQLITE3_NULL); } $stmt->execute(); if (isset($d->exclude)) { $sql = ' INSERT INTO package_dependencies_exclude (required, packages_name, packages_channel, deppackage, depchannel, exclude, conflicts, is_subpackage) VALUES(:required, :name, :channel, :dep_package, :dep_channel, :exclude, :conflicts, :sub)'; $stmt1 = $database->prepare($sql); foreach ($d->exclude as $exclude) { $stmt1->clear(); $req = $required == 'required' ? 1 : 0; $stmt1->bindValue(':required', $req, SQLITE3_INTEGER); $stmt1->bindValue(':name', $n); $stmt1->bindValue(':channel', $c); $stmt1->bindValue(':dep_package', $d->name); $stmt1->bindValue(':dep_channel', $d->channel); $stmt1->bindValue(':exclude', $exclude); $stmt1->bindValue(':sub', $sub); $con = $d->conflicts; $stmt1->bindValue(':conflicts', $d->conflicts, SQLITE3_INTEGER); $stmt1->execute(); } $stmt1->close(); } } } } $stmt->close(); $sql = ' INSERT INTO php_dependencies (packages_name, packages_channel, min, max) VALUES (:name, :channel, :min, :max)'; $max = $info->dependencies['required']->php->max; $stmt = $database->prepare($sql); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':min', $info->dependencies['required']->php->min); if ($max === null) { $stmt->bindValue(':max', $max, SQLITE3_NULL); } else { $stmt->bindValue(':max', $max); } $stmt->execute(); $stmt->close(); $sql = ' INSERT INTO php_dependencies_exclude (packages_name, packages_channel, exclude) VALUES (:name, :channel, :exclude)'; $stmt = $database->prepare($sql); if ($info->dependencies['required']->php->exclude) { foreach ($info->dependencies['required']->php->exclude as $exclude) { $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':exclude', $exclude); $stmt->execute(); } } $stmt->close(); $sql = ' INSERT INTO pearinstaller_dependencies (packages_name, packages_channel, min, max) VALUES (:name, :channel, :min, :max)'; $max = $info->dependencies['required']->pearinstaller->max; $stmt = $database->prepare($sql); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':min', $info->dependencies['required']->pearinstaller->min); if ($max === null) { $stmt->bindValue(':max', $max, SQLITE3_NULL); } else { $stmt->bindValue(':max', $max); } $stmt->execute(); $stmt->close(); $sql = ' INSERT INTO pearinstaller_dependencies_exclude (packages_name, packages_channel, exclude) VALUES (:name, :channel, :exclude)'; $stmt = $database->prepare($sql); if ($info->dependencies['required']->pearinstaller->exclude) { foreach ($info->dependencies['required']->pearinstaller->exclude as $exclude) { $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':exclude', $exclude); $stmt->execute(); } } $stmt->close(); if (isset($info->dependencies['required']->os)) { $sql = ' INSERT INTO os_dependencies (packages_name, packages_channel, osname, conflicts) VALUES (:name, :channel, :os, :conflicts)'; $stmt = $database->prepare($sql); foreach ($info->dependencies['required']->os as $dep) { $stmt->clear(); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':os', $dep->name); $stmt->bindValue(':conflicts', $dep->conflicts, SQLITE3_INTEGER); $stmt->execute(); } $stmt->close(); } if (isset($info->dependencies['required']->arch)) { $sql = ' INSERT INTO arch_dependencies (packages_name, packages_channel, pattern, conflicts) VALUES (:name, :channel, :arch, :conflicts)'; $stmt = $database->prepare($sql); foreach ($info->dependencies['required']->arch as $dep) { $stmt->clear(); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':arch', $dep->pattern); $stmt->bindValue(':conflicts', $dep->conflicts, SQLITE3_INTEGER); $stmt->execute(); } $stmt->close(); } foreach ($info->dependencies['group'] as $group) { $sql = ' INSERT INTO dep_groups (packages_name, packages_channel, groupname, grouphint) VALUES (:name, :channel, :groupname, :grouphint)'; $stmt = $database->prepare($sql); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':groupname', $group->name); $stmt->bindValue(':grouphint', $group->hint); $stmt->execute(); $stmt->close(); $sql = ' INSERT INTO extension_dependencies (required, packages_name, packages_channel, extension, conflicts, min, max, recommended, groupname) VALUES (0, :name, :channel, :extension, :conflicts, :min, :max, :recommended, :groupname)'; $stmt = $database->prepare($sql); foreach ($group->extension as $d) { // $d is a \Pyrus\PackageFile\v2\Dependencies\Package object $stmt->clear(); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':extension', $d->name); $stmt->bindValue(':conflicts', $d->conflicts, SQLITE3_INTEGER); $stmt->bindValue(':min', $d->min); $stmt->bindValue(':max', $d->max); $stmt->bindValue(':recommended', $d->recommended); $stmt->bindValue(':groupname', $group->name); $stmt->execute(); if (isset($d->exclude)) { $sql = ' INSERT INTO extension_dependencies_exclude (required, packages_name, packages_channel, extension, exclude, conflicts, groupname) VALUES(0, :name, :channel, :extension, :exclude, :conflicts, :groupname)'; $stmt1 = $database->prepare($sql); foreach ($d->exclude as $exclude) { $stmt1->clear(); $stmt1->bindValue(':name', $n); $stmt1->bindValue(':channel', $c); $stmt1->bindValue(':extension', $d->name); $stmt1->bindValue(':exclude', $exclude); $stmt1->bindValue(':conflicts', $d->conflicts, SQLITE3_INTEGER); $stmt1->bindValue(':groupname', $group->name); $stmt1->execute(); } $stmt1->close(); } } $stmt->close(); $sql = ' INSERT INTO package_dependencies (required, packages_name, packages_channel, deppackage, depchannel, conflicts, min, max, recommended, is_subpackage, groupname, providesextension) VALUES (0, :name, :channel, :dep_package, :dep_channel, :conflicts, :min, :max, :recommended, :sub, :group, :ext)'; $stmt = $database->prepare($sql); foreach (array('package', 'subpackage') as $package) { foreach ($group->{$package} as $d) { // $d is a \Pyrus\PackageFile\v2\Dependencies\Package object $sub = $package == 'subpackage'; $ext = $d->providesextension; $stmt->clear(); $stmt->bindValue(':name', $n); $stmt->bindValue(':channel', $c); $stmt->bindValue(':dep_package', $d->name); $stmt->bindValue(':dep_channel', $d->channel); $stmt->bindValue(':conflicts', $d->conflicts, SQLITE3_INTEGER); $stmt->bindValue(':min', $d->min); $stmt->bindValue(':max', $d->max); $stmt->bindValue(':recommended', $d->recommended); $stmt->bindValue(':sub', $sub); $stmt->bindValue(':group', $group->name); if ($ext) { $stmt->bindValue(':ext', $ext); } else { $stmt->bindValue(':ext', $ext, SQLITE3_NULL); } $stmt->execute(); if (isset($d->exclude)) { $sql = ' INSERT INTO package_dependencies_exclude (required, packages_name, packages_channel, deppackage, depchannel, exclude, conflicts, is_subpackage, groupname) VALUES(0, :name, :channel, :dep_package, :dep_channel, :exclude, :conflicts, :sub, :group)'; $stmt1 = $database->prepare($sql); foreach ($d->exclude as $exclude) { $stmt1->clear(); $req = 0; $stmt1->bindValue(':required', $req, SQLITE3_INTEGER); $stmt1->bindValue(':name', $n); $stmt1->bindValue(':channel', $c); $stmt1->bindValue(':dep_package', $d->name); $stmt1->bindValue(':dep_channel', $d->channel); $stmt1->bindValue(':exclude', $exclude); $stmt1->bindValue(':sub', $sub); $stmt1->bindValue(':group', $group->name); $stmt1->bindValue(':conflicts', $d->conflicts, SQLITE3_INTEGER); $stmt1->execute(); } $stmt1->close(); } } } } $stmt->close(); }