Esempio n. 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)';

        $stmt = $database->prepare($sql);

        $stmt->bindValue(':name',     $n);
        $stmt->bindValue(':channel',  $c);

        foreach ($info->installrelease->configureoption as $option) {
            $stmt->bindValue(':oname', $option->name);
            $stmt->bindValue(':prompt', $option->prompt);
            if ($option->default === null) {
                $stmt->bindValue(':default', null, SQLITE3_NULL);
            } else {
                $stmt->bindValue(':default', $option->default);
            }
            $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 \PEAR2\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 \PEAR2\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 \PEAR2\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 \PEAR2\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();
    }