Browse Source

simplify _CLITOR_IS_ meta record

main
ghost 4 months ago
parent
commit
b5d0fc3ef5
  1. 296
      cli/fix.php
  2. 127
      cli/get.php
  3. 151
      cli/put.php

296
cli/fix.php

@ -1,5 +1,11 @@
<?php <?php
// Init version
define(
'_CLITOR_IS_',
'1.3.0'
);
// Init helper // Init helper
function _exec( function _exec(
string $processor, string $processor,
@ -24,173 +30,163 @@ function _exec(
return false; return false;
} }
// Check file exits // Check processor exits
if (!file_exists($argv[2])) if (empty($argv[1]))
{ {
exit('filename does not exist!' . PHP_EOL); print(
'processor required' . PHP_EOL
);
exit;
} }
// Get file hash sum if (!file_exists($argv[1]))
$md5file = md5_file( {
$argv[2] print(
); 'processor does not exist' . PHP_EOL
);
exit;
}
// Check namespace provided
if (empty($argv[2]))
{
print(
'namespace required' . PHP_EOL
);
exit;
}
// Search namespace by md5file // Check target file does not exist yet
echo 'Get namespaces list...' . PHP_EOL; if (!file_exists($argv[3]))
{
print(
'filename does not exist' . PHP_EOL
);
$namespaces = _exec( exit;
}
// Get namespace meta
$clitoris = _exec(
$argv[1], $argv[1],
'keva_list_namespaces' sprintf(
"keva_get %s _CLITOR_IS_",
$argv[2]
)
); );
// Get _CLITOR_IS_ meta if (empty($clitoris->value))
foreach ((array) $namespaces as $namespace)
{ {
echo sprintf( print(
'Search for _CLITOR_IS_ match file MD5 %s ...' . PHP_EOL, '_CLITOR_IS_ not found for this namespace' . PHP_EOL
$md5file
); );
$meta = _exec( exit;
}
// Validate protocol
if (empty($clitoris->value))
{
print(
'_CLITOR_IS_ not found' . PHP_EOL
);
exit;
}
// Split content to smaller parts (according to the protocol limits)
$pieces = str_split(
base64_encode(
file_get_contents(
$argv[3]
)
),
3072
);
// Count total pieces
$total = count(
$pieces
);
// Begin pieces saving
foreach ($pieces as $key => $value)
{
// Check piece stored in blockchain is valid
$piece = _exec(
$argv[1], $argv[1],
sprintf( sprintf(
"%s '%s' '%s'", "keva_get %s %d",
'keva_get', $argv[2],
$namespace->namespaceId, $key
'_CLITOR_IS_'
) )
); );
if ($value = @json_decode($meta->value)) // Piece value not found
if (empty($piece->value))
{ {
if ( printf(
isset($value->pieces) && 'Piece %s/%s value not found, create new record...' . PHP_EOL,
isset($value->pieces->total) && $key + 1,
isset($value->pieces->size) && $total
);
isset($value->file) && }
isset($value->file->md5) &&
$value->file->md5 === $md5file // Piece value invalid, begin blockchain record
) else if ($piece->value != $value)
{ {
// Meta found printf(
echo sprintf( 'Piece %s/%s value invalid, overwrite record...' . PHP_EOL,
'_CLITOR_IS_ found for this file with namespace %s' . PHP_EOL, $key + 1,
$namespace->namespaceId $total,
); );
// Split content to smaller parts using _CLITOR_IS_ size defined before
$pieces = str_split(
base64_encode(
file_get_contents(
$argv[2]
)
),
$value->pieces->size
);
// Count total pieces
$total = count(
$pieces
);
// Validate pieces count
if ($value->pieces->total !== $total)
{
echo '_CLITOR_IS_ have another pieces quantity' . PHP_EOL;
exit;
}
// Begin pieces saving
foreach ($pieces as $key => $value)
{
// Check piece stored is valid
$piece = _exec(
$argv[1],
sprintf(
"%s '%s' '%s'",
'keva_get',
$namespace->namespaceId,
$key
)
);
// Piece value not found
if (empty($piece->value))
{
echo sprintf(
'Piece %s/%s value not found, creating...' . PHP_EOL,
$key + 1,
$total
);
}
// Piece value invalid, begin blockchain record
else if ($piece->value !== $value)
{
echo sprintf(
'Piece %s/%s value invalid (%s <> %s), rewriting...' . PHP_EOL,
$key + 1,
$total,
md5(
$piece->value
),
md5(
$value
),
);
}
// Piece valid
else
{
echo sprintf(
'Piece %s/%s - OK' . PHP_EOL,
$key + 1,
$total
);
continue;
}
print_r(
_exec(
$argv[1],
sprintf(
"%s '%s' '%s' '%s'",
'keva_put',
$namespace->namespaceId,
$key,
$value
)
)
);
// Apply delays to prevent too-long-mempool-chain reject
$delay = isset($argv[3]) && $argv[3] > 0 ? (int) $argv[3] : 60;
echo sprintf(
'Piece %s/%s sent, waiting %s seconds...' . PHP_EOL,
$key + 1,
$total,
$delay
);
sleep($delay);
}
// Print result
echo sprintf(
'done! run to extract: php %s/get.php %s %s' . PHP_EOL,
__DIR__,
$argv[1],
$namespace->namespaceId
);
break;
}
} }
// Piece valid
else
{
printf(
'Piece %s/%s - OK' . PHP_EOL,
$key + 1,
$total
);
continue; // skip next operations for this piece
}
// Record new piece
print_r(
_exec(
$argv[1],
sprintf(
"keva_put %s %d %s",
$argv[2],
$key,
$value
)
)
);
// Apply delays to prevent too-long-mempool-chain reject
$delay = isset($argv[3]) && $argv[3] > 0 ? (int) $argv[3] : 60;
printf(
'Piece %s/%s sent, waiting %s seconds...' . PHP_EOL,
$key + 1,
$total,
$delay
);
sleep(
$delay
);
} }
echo 'Could not recover this file!' . PHP_EOL; // Done
printf(
'data successfully synced with namespace "%s"' . PHP_EOL,
$argv[2]
);

127
cli/get.php

@ -1,5 +1,11 @@
<?php <?php
// Init version
define(
'_CLITOR_IS_',
'1.3.0'
);
// Init helper // Init helper
function _exec( function _exec(
string $processor, string $processor,
@ -24,71 +30,80 @@ function _exec(
return false; return false;
} }
// Get clitoris // Validate arguments
$clitoris = _exec( if (empty($argv[1]))
$argv[1], {
sprintf( print(
'%s %s "_CLITOR_IS_"', 'processor required' . PHP_EOL
'keva_get', );
$argv[2]
)
);
print_r( exit;
$clitoris }
);
if (empty($clitoris->value)) if (!file_exists($argv[1]))
{ {
exit( print(
sprintf( 'processor does not exist' . PHP_EOL
'%s does not contain _CLITOR_IS_' . PHP_EOL, );
$argv[2]
) exit;
}
if (empty($argv[2]))
{
print(
'namespace required' . PHP_EOL
); );
exit;
} }
if (!$clitoris = @json_decode( if (empty($argv[3]))
$clitoris->value
))
{ {
exit( print(
sprintf( 'destination file required' . PHP_EOL
'could not decode _CLITOR_IS_ of %s' . PHP_EOL, );
$argv[2]
) exit;
);
} }
if ($clitoris->version !== '1.0.0') if (file_exists($argv[3]))
{ {
exit( print(
sprintf( 'destination file already exists' . PHP_EOL
'_CLITOR_IS_ of %s not compatible!' . PHP_EOL,
$argv[2]
)
); );
exit;
} }
if (empty($clitoris->file->name)) // Get clitoris
$clitoris = _exec(
$argv[1],
sprintf(
'keva_get %s "_CLITOR_IS_"',
$argv[2]
)
);
// Validate protocol
if (empty($clitoris->value))
{ {
exit( print(
sprintf( '_CLITOR_IS_ not found' . PHP_EOL
'_CLITOR_IS_ format issue for %s!' . PHP_EOL,
$argv[2]
)
); );
exit;
} }
// Merge content data // Merge content data
$chain = []; $chain = [];
foreach ( foreach (
(array) (array)
_exec( _exec(
$argv[1], $argv[1],
sprintf( sprintf(
'%s %s "\d+"', 'keva_filter %s "\d+"',
'keva_filter',
$argv[2] $argv[2]
) )
) as $piece) ) as $piece)
@ -99,9 +114,11 @@ foreach (
!isset($piece->height) !isset($piece->height)
) )
{ {
exit( print(
'please wait for all pieces sending complete!' 'please wait for all pieces sending complete!' . PHP_EOL
); );
exit;
} }
// Keep all key versions in memory // Keep all key versions in memory
@ -121,12 +138,16 @@ $pieces = [];
foreach ($chain as $key => $height) foreach ($chain as $key => $height)
{ {
ksort( ksort(
$height $height
); );
$pieces[$key] = $height[array_key_last($height)]; $pieces[$key] = $height
[
array_key_last(
$height
)
];
} }
ksort( ksort(
@ -134,21 +155,15 @@ ksort(
); );
// Save file to destination // Save file to destination
$filename = isset($argv[3]) ? $argv[3] : sprintf(
'%s/../data/import/[kevacoin][%s]%s',
__DIR__,
$argv[2],
$clitoris->file->name
);
file_put_contents( file_put_contents(
$filename, $argv[3],
base64_decode( base64_decode(
implode('', $pieces) implode('', $pieces)
) )
); );
echo sprintf( printf(
'saved to %s' . PHP_EOL, 'namespace "%s" saved to "%s"' . PHP_EOL,
$filename $argv[2],
$argv[3]
); );

151
cli/put.php

@ -1,5 +1,11 @@
<?php <?php
// Init version
define(
'_CLITOR_IS_',
'1.3.0'
);
// Init helper // Init helper
function _exec( function _exec(
string $processor, string $processor,
@ -24,38 +30,71 @@ function _exec(
return false; return false;
} }
// Check processor exits
if (empty($argv[1]))
{
print(
'processor required' . PHP_EOL
);
exit;
}
if (!file_exists($argv[1]))
{
print(
'processor does not exist' . PHP_EOL
);
exit;
}
// Check file exits // Check file exits
if (!file_exists($argv[2])) if (empty($argv[2]))
{ {
exit('filename does not exist!' . PHP_EOL); print(
'filename required' . PHP_EOL
);
exit;
} }
// Get file hash sum if (!file_exists($argv[2]))
$md5file = md5_file( {
$argv[2] print(
); 'filename does not exist' . PHP_EOL
);
exit;
}
// Get file name // Get file name
$name = basename( $basename = basename(
$argv[2] $argv[2]
); );
// Check filename not longer of protocol // Check filename not longer of protocol
if (mb_strlen($name) > 255) if (mb_strlen($basename) > 255)
{ {
$name = $md5file; // Get file hash sum
} $basename = md5_file(
$argv[2]
);
// Split content to smaller parts, according to the protocol limits // Dump event
$size = isset($argv[3]) && $argv[3] <= 3072 ? (int) $argv[3] : 3072; print(
'Filename to long, used md5_file as key...' . PHP_EOL
);
}
// Split content to smaller parts (according to the protocol limits)
$pieces = str_split( $pieces = str_split(
base64_encode( base64_encode(
file_get_contents( file_get_contents(
$argv[2] $argv[2]
) )
), ),
$size 3072
); );
// Count total pieces // Count total pieces
@ -63,67 +102,35 @@ $total = count(
$pieces $pieces
); );
// Get software protocol details
$software = _exec(
$argv[1],
'-getinfo'
);
print_r($software);
// Create namespace to collect there data pieces // Create namespace to collect there data pieces
$ns = _exec( $ns = _exec(
$argv[1], $argv[1],
sprintf( sprintf(
"%s '%s'", "keva_namespace '%s'",
'keva_namespace', str_replace(
$name "'",
"\'",
$basename
)
) )
); );
print_r($ns); // Validate namespace created
if (empty($ns->namespaceId))
{
print(
'could not create namespace record' . PHP_EOL
);
exit;
}
// Create meta description for the future generations // Create meta record
print_r( print_r(
_exec( _exec(
$argv[1], $argv[1],
sprintf( sprintf(
"%s %s '%s' '%s'", 'keva_put %s %s %s', $ns->namespaceId, '_CLITOR_IS_', _CLITOR_IS_
'keva_put',
$ns->namespaceId,
'_CLITOR_IS_',
json_encode(
[
'version' => '1.0.0',
'model' =>
[
'name' => 'kevacoin',
'software' =>
[
'version' => $software->version,
'protocol' => $software->protocolversion
]
],
'pieces' =>
[
'total' => $total,
'size' => $size,
],
'file' =>
[
'name' => basename(
$argv[2]
),
'mime' => mime_content_type(
$argv[2]
),
'size' => filesize(
$argv[2]
),
'md5' => $md5file
]
]
)
) )
) )
); );
@ -147,20 +154,28 @@ foreach ($pieces as $key => $value)
// Apply delays to prevent too-long-mempool-chain reject // Apply delays to prevent too-long-mempool-chain reject
$delay = isset($argv[4]) && $argv[4] > 0 ? (int) $argv[4] : 60; $delay = isset($argv[4]) && $argv[4] > 0 ? (int) $argv[4] : 60;
echo sprintf( printf(
'%s/%s sent, waiting %s seconds...' . PHP_EOL, '%s/%s sent, waiting %s seconds...' . PHP_EOL,
$key + 1, $key + 1,
$total, $total,
$delay $delay
); );
sleep($delay); sleep(
$delay
);
} }
// Print result // Done
echo sprintf( printf(
'done! run to extract: php %s/get.php %s %s' . PHP_EOL, 'data successfully sent to namespace "%s"' . PHP_EOL,
$ns->namespaceId
);
printf(
"run to extract: /usr/bin/php '%s/get.php' '%s' '%s' '/path/to/%s'" . PHP_EOL,
__DIR__, __DIR__,
$argv[1], $argv[1],
$ns->namespaceId $ns->namespaceId,
$basename
); );
Loading…
Cancel
Save