Commit: cb5a1222926758f5c2a70bf280bd77934116a4d3
Author: Anatol Belski <[email protected]> Tue, 12 May 2015 13:42:24 +0200
Parents: 4a8b33dbc3b054bc8572ad71b7230fbc71af39c6
Branches: master pecl_legacy
Link:
http://git.php.net/?p=web/rmtools.git;a=commitdiff;h=cb5a1222926758f5c2a70bf280bd77934116a4d3
Log:
properly fetch providers and packages json, save and compare locally
extension updates to go
Changed paths:
M client/include/PickleDb.php
M client/include/PickleWeb.php
M client/script/pickle_ctl.php
diff --git a/client/include/PickleDb.php b/client/include/PickleDb.php
index ea0c1f2..621e387 100644
--- a/client/include/PickleDb.php
+++ b/client/include/PickleDb.php
@@ -4,112 +4,84 @@ namespace rmtools;
class PickleDb extends \SQLite3
{
- public function __construct($db_path, $autoinit = true)
+ protected $db_path;
+
+ public function __construct($db_path)
{
- $flags = SQLITE3_OPEN_READWRITE;
- $existent = file_exists($db_path);
+ $this->db_path = $this->createDir($db_path);
+ }
+
+ protected function isSlash($c)
+ {
+ return '\\' == $c || '/' == $c;
+ }
- if (!$existent) {
- $flags |= SQLITE3_OPEN_CREATE;
- }
-
- $this->open($db_path, $flags);
- if (!$existent && $autoinit) {
- $this->initDb();
+ protected function buildUriLocalPath($uri)
+ {
+ if (!$this->isSlash($uri[0])) {
+ $uri = DIRECTORY_SEPARATOR . $uri;
}
+ $uri = str_replace('/', DIRECTORY_SEPARATOR, $uri);
+
+ return $this->db_path . $uri;
}
- public function initDb()
+ public function uriExists($uri)
{
- /* no primary keys here, reling on the hashes delivered by
pickleweb. */
- $sql = "CREATE TABLE package_release (package_hash STRING,
package_name STRING, ts_placed INTEGER, ts_finished INTEGER);";
- $this->exec($sql);
+ return file_exists($this->buildUriLocalPath($uri));
}
- public function add($name, $hash, $force = false)
+ public function getUri($uri)
{
- if ($force) {
- $this->remove($name, $hash);
- }
+ $fname = $this->buildUriLocalPath($uri);
- if ($this->exists($name, $hash)) {
+ if (!file_exists($fname)) {
return false;
}
- $name = $this->escapeString($name);
- $hash = $this->escapeString($hash);
- $sql = "INSERT INTO package_release (package_name,
package_hash, ts_placed, ts_finished) VALUES ('$name', '$hash', " . time() . ",
0);";
- $this->exec($sql);
-
- return true;
+ return file_get_contents($fname);
}
- public function remove($name, $hash)
+ public function saveUriJson($uri, $data)
{
- $name = $this->escapeString($name);
- $hash = $this->escapeString($hash);
- $sql = "DELETE FROM package_release WHERE package_name =
'$name' AND package_hash = '$hash';";
- $this->exec($sql);
+ $json = json_encode($data);
+
+ return $this->saveUri($uri, $json);
}
- public function exists($name, $hash, $where = '')
+ public function saveUri($uri, $data)
{
- /* cant check such thing, so trust :) */
- if ($where) {
- $where = "AND $where";
- }
+ $fname = $this->buildUriLocalPath($uri);
- $name = $this->escapeString($name);
- $hash = $this->escapeString($hash);
- $sql = "SELECT ts_finished FROM package_release WHERE
package_name = '$name' AND package_hash = '$hash' $where;";
-
- $res = $this->query($sql);
-
- $ret = false !== $res->fetchArray(SQLITE3_NUM);
- //return $res->numColumns() > 0;
-
- $res->finalize();
+ $dir = dirname($fname);
+ if (!is_dir($dir)) {
+ $this->createDir($dir);
+ }
- return $ret;
+ return strlen($data) == file_put_contents($fname, $data);
}
- public function done($name, $hash)
+ public function getUriJson($uri)
{
- /* XXX That's an assumption as the latest timestamp should be
about 30 mit old.
- Need to extend pecl.php to set the real statuses when in't
really done */
- return $this->exists($name, $hash, "ts_finished - " . time() .
" > 1800");
+ return json_decode($this->getUri($uri), true);
}
- public function dump($where = '')
+ public function delUri($uri)
{
- /* cant check such thing, so trust :) */
- if ($where) {
- $where = "WHERE $where";
- }
+ $fname = $this->buildUriLocalPath($uri);
- $res = $this->query("SELECT * FROM package_release $where ORDER
BY package_name, package_hash ASC");
- echo "DUMP package_release " . PHP_EOL . PHP_EOL;
- while(false !== ($row = $res->fetchArray(SQLITE3_ASSOC))) {
- foreach ($row as $col => $val) {
- echo "$col=$val" . PHP_EOL;
- }
- echo PHP_EOL;
- }
- $res->finalize();
+ return unlink($fname);
}
- public function dumpQueue()
+ protected function createDir($path, $rec = true)
{
- $this->dump("ts_finished <= 0");
- }
+ if (!is_dir($path)) {
+ if (!mkdir($path, 0777, $rec)) {
+ throw new \Exception("failed to create
'$path'");
+ }
+ }
- public function finished($name, $hash)
- {
- $name = $this->escapeString($name);
- $hash = $this->escapeString($hash);
- $sql = "UPDATE package_release SET ts_finished=" . time() . "
WHERE lower(package_name) = lower('$name') AND lower(package_hash) =
lower('$hash');";
- $this->exec($sql);
+ return realpath($path);
}
}
-
diff --git a/client/include/PickleWeb.php b/client/include/PickleWeb.php
index 88c474d..8a3c5f9 100644
--- a/client/include/PickleWeb.php
+++ b/client/include/PickleWeb.php
@@ -4,60 +4,75 @@ namespace rmtools;
class PickleWeb
{
- protected $db_path;
+ protected $db;
protected $host;
protected $info;
protected $updatesAvailableFlag = false;
- public function __construct($host, $db_path)
+ public function __construct($host, PickleDB $db)
{
$this->host = $host;
-
- if (!is_dir($db_path)) {
- if (!mkdir($db_path)) {
- throw new \Exception("failed to create
'$db_path'");
- }
- }
-
- $this->db_path = $db_path;
+ $this->db = $db;
$this->init();
}
- public function init()
+ protected function fetchUri($uri, $allow_empty = false)
{
- $uri = "{$this->host}/packages.json";
- $__tmp = file_get_contents($uri);
- if (!$__tmp) {
+
+ $url = "{$this->host}$uri";
+
+ $__tmp = file_get_contents($url);
+
+
+ if (false === $__tmp) {
+ throw new \Exception("Error encountered while receiving
'$url'");
+ }
+
+ if (!$allow_empty && !$__tmp) {
throw new \Exception("Empty content received from
'$url'");
}
- $this->info = json_decode($__tmp, true);
- if (!$this->info) {
- throw new \Exception("Couldn't decode JSON from
'$url'");
+ return $__tmp;
+ }
+
+ protected function fetchUriJson($uri, $allow_empty = false)
+ {
+ $__tmp = $this->fetchUri($uri, $allow_empty);
+
+ $ret = json_decode($__tmp, true);
+ if (!$ret) {
+ throw new \Exception("Couldn't decode JSON from '$uri'
on '{$this->host}'");
}
+ return $ret;
+ }
+
+ public function init()
+ {
+ $uri = "/packages.json";
+ $this->info = $this->fetchUriJson($uri);
+
if (!isset($this->info["provider-includes"])) {
throw new \Exception("No provider includes found");
}
- $packages_json = $this->db_path . DIRECTORY_SEPARATOR .
"packages.json";
- if (!file_exists($packages_json)) {
+ if (!$this->db->uriExists($uri)) {
$this->updatesAvailableFlag = true;
} else {
- $packages_info =
json_decode(file_get_contents($packages_json), true);
- foreach ($this->info["provider-includes"] as $uri =>
$hash) {
- if
(!isset($packages_info["provider-includes"][$uri]) ||
-
$packages_info["provider-includes"][$uri] != $hash) {
+ $packages_info = $this->db->getUriJson($uri);
+ foreach ($this->info["provider-includes"] as
$provider_uri => $hash) {
+ if
(!isset($packages_info["provider-includes"][$provider_uri]) ||
+
$packages_info["provider-includes"][$provider_uri] != $hash) {
$this->updatesAvailableFlag = true;
break;
}
}
}
- if ($this->updatesAvailableFlag && strlen($__tmp) !=
file_put_contents($packages_json, $__tmp)) {
- throw new \Exception("Couldn't save '$packages_json'");
+ if ($this->updatesAvailableFlag &&
!$this->db->saveUriJson($uri, $this->info)) {
+ throw new \Exception("Couldn't save '$uri'");
}
}
@@ -66,45 +81,67 @@ class PickleWeb
return $this->updatesAvailableFlag;
}
- public function fetchProviders()
+
+ protected function saveUriLocal($uri)
+ {
+
+ }
+
+ protected function getUriLocal($uri)
+ {
+
+ }
+
+
+ protected function diffProviders($remote, $local)
{
$ret = array();
- /* XXX What meaning does the $hash have? */
- foreach ($this->info["provider-includes"] as $uri => $hash) {
- $url = "{$this->host}$uri";
- $__tmp = file_get_contents($url);
+ foreach ($remote as $vendor => $sha) {
+ if (isset($local[$vendor]) && $local[$vendor] != $sha) {
+ $ret[$vendor] = $sha;
+ }
+ }
- if (!$__tmp) {
- //echo "Empty content received from '$url'";
+ return $ret;
+ }
+ public function fetchProviderUpdates()
+ {
+ $ret = array();
+
+ foreach ($this->info["provider-includes"] as $uri => $hash) {
+ $pkgs_new = $this->fetchUriJson($uri);
+ if (!is_array($pkgs_new) ||
!isset($pkgs_new["providers"]) || !is_array($pkgs_new["providers"]) ||
empty($pkgs_new["providers"])) {
continue;
}
- $pkgs = json_decode($__tmp, true);
+ $pkgs = $this->db->getUriJson($uri);
if (!is_array($pkgs) || !isset($pkgs["providers"]) ||
!is_array($pkgs["providers"]) || empty($pkgs["providers"])) {
- //echo "No packages provided from '$url'";
+ $this->db->saveUriJson($uri, $pkgs_new);
+ $ret = array_merge($ret,
$pkgs_new["providers"]);
continue;
}
- $pkgs = $pkgs["providers"];
-
- foreach ($pkgs as $pkg => $phash) {
- }
+ $this->db->saveUriJson($uri, $pkgs_new);
- $ret = array_merge($ret, $pkgs);
+ $ret = array_merge($ret,
$this->diffProviders($pkgs_new["providers"], $pkgs["providers"]));
}
return $ret;
}
- public function pingBack($data)
+ public function getNewTags()
{
- // TODO send the build data to pickle web
+ $provs = $this->fetchProviderUpdates();
+
+
+ return $provs;
}
- public function updateDb()
+ public function pingBack($data)
{
-
+ // TODO send the build data to pickle web
}
+
}
diff --git a/client/script/pickle_ctl.php b/client/script/pickle_ctl.php
index b9ff884..1a27a8c 100644
--- a/client/script/pickle_ctl.php
+++ b/client/script/pickle_ctl.php
@@ -2,6 +2,7 @@
include __DIR__ . '/../data/config.php';
include __DIR__ . '/../include/PickleWeb.php';
+include __DIR__ . '/../include/PickleDb.php';
include __DIR__ . '/../include/PickleJob.php';
use rmtools as rm;
@@ -39,20 +40,20 @@ if ($sync_cmd) {
try {
- $pw = new rm\PickleWeb($sync_host, $db_dir);
+ $pw = new rm\PickleWeb($sync_host, new rm\PickleDb($db_dir));
if (!$pw->updatesAvailable()) {
echo "No updates available";
exit(0);
}
- $news = (array)$pw->fetchProviders();
+ $news = (array)$pw->getNewTags();
} catch (Exception $e) {
echo $e->getMessage() . "\n";
exit(3);
}
-
+ var_dump($news);
}--
PHP Webmaster List Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php