Example #1
0
 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();
 }