Hi,
Thank you for feedback again.
Yes, the BCMath module is not in default configuration if you will
compile PHP. In case compilation from sources need to add
"--enable-bcmath" to configuration parameters.
On some GNU/Linux distributions the BCMath is as default in PHP
(Debian, Slackware) and on some distributions the BCMath need to
install as a module from package apart from the PHP package (for
example Fedora).
Regards.
gani
W dniu 13 marca 2011 21:07 użytkownik Dan Langille <dan AT langille DOT org>
napisał:
> On 3/12/2011 9:33 PM, ganiuszka wrote:
>>
>> W dniu 13 marca 2011 01:01 użytkownik Dan Langille<dan AT langille DOT org>
>> napisał:
>>>
>>> On 3/12/2011 9:29 AM, ganiuszka wrote:
>>>>
>>>> W dniu 11 marca 2011 21:45 użytkownik ganiuszka<ganiuszka AT gmail DOT com>
>>>> napisał:
>>>>>
>>>>> Hi,
>>>>> In my example jobid is putting in:
>>>>> ... File.JobId=8...
>>>>> but this "eight":
>>>>>
>>>>> base64_decode_lstat(8,File.LStat)
>>>>>
>>>>> is exactly eight field (encoded filesize field). I seem that you used
>>>>> standard base64 decoder to decode eighth field. Am I right?
>>>>>
>>>>> Bacula lstat is encoded by using non-standard base64 algorithm. Your
>>>>> decoded lstat shows like this:
>>>>>
>>>>> [dev] => 89
>>>>> [inodes] => 1366434
>>>>> [mode] => 33200
>>>>> [links] => 1
>>>>> [uid] => 80
>>>>> [gid] => 91
>>>>> [rdev] => 5481898
>>>>> [size] => 315
>>>>> [blksize] => 16384
>>>>> [blocks] => 4
>>>>> [atime] => 1299770037
>>>>> [mtime] => 1299770037
>>>>> [ctime] => 1299770066
>>>>> [LinkFl] => 0
>>>>> [flags] => 0
>>>>> [data] => 2
>>>>>
>>>>> I do not understand every field, but most fields is clear. Now, I
>>>>> wrote implementation of Bacula base64_decoder in PHP. I need finish it
>>>>> and make WebGUI for this and I will share this decoder here. For this
>>>>> I am using source code of base64 implementation in Bacula and this:
>>>>>
>>>>> http://old.nabble.com/The-File.LStat-field-td940366.html
>>>>>
>>>>> Regards.
>>>>> gani
>>>>>
>>>>> 2011/3/11 Dan Langille<dan AT langille DOT org>:
>>>>>>
>>>>>> On 3/9/2011 5:36 PM, ganiuszka wrote:
>>>>>>
>>>>>>> 2011/3/9 Mike Eggleston<mikeegg1 AT mac DOT com>:
>>>>>>>>
>>>>>>>> Afternoon,
>>>>>>>>
>>>>>>>> I just noticed one of my clients had a huge incremental (level 2)
>>>>>>>> backup. I want to see what file caused the huge increase. I tried
>>>>>>>> 'list
>>>>>>>> files jobid=20097' and though I'm shown the files, I'm not shown the
>>>>>>>> size of each file. Is there a command or query that shows me the
>>>>>>>> size
>>>>>>>> of the file?
>>>>>>>>
>>>>>>>> Mike
>>>>>>
>>>>>>> Hi,
>>>>>>> Here you have SQL function for PostgreSQL (I took it from bweb):
>>>>>>>
>>>>>>> CREATE PROCEDURAL LANGUAGE plpgsql;
>>>>>>> BEGIN;
>>>>>>>
>>>>>>> CREATE OR REPLACE FUNCTION base64_decode_lstat(int4, varchar) RETURNS
>>>>>>> int8
>>>>>>> AS $$
>>>>>>> DECLARE
>>>>>>> val int8;
>>>>>>> b64 varchar(64);
>>>>>>> size varchar(64);
>>>>>>> i int;
>>>>>>> BEGIN
>>>>>>> size := split_part($2, ' ', $1);
>>>>>>> b64 :=
>>>>>>> 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
>>>>>>> val := 0;
>>>>>>> FOR i IN 1..length(size) LOOP
>>>>>>> val := val + (strpos(b64, substr(size, i, 1))-1) *
>>>>>>> (64^(length(size)-i));
>>>>>>> END LOOP;
>>>>>>> RETURN val;
>>>>>>> END;
>>>>>>> $$ language 'plpgsql';
>>>>>>>
>>>>>>> COMMIT;
>>>>>>>
>>>>>>> and this is a query which lists file path, filename and size in Bytes
>>>>>>> (in this example for jobid=8):
>>>>>>>
>>>>>>> SELECT Path.Path, Filename.Name, base64_decode_lstat(8,File.LStat) AS
>>>>>>> size FROM Filename, File, Path WHERE File.JobId=8 AND
>>>>>>> File.PathId=Path.PathId AND Filename.FilenameId=File.FilenameId ORDER
>>>>>>> BY size ASC;
>>>>>>>
>>>>>>> I tested it. It works.
>>>>>>
>>>>>> For the record:
>>>>>>
>>>>>> In this query, I see base64_decode_lstat(8,File.LStat)
>>>>>>
>>>>>> What is 8? It is not jobid. It is a field id. This lstat value:
>>>>>>
>>>>>> BZ FNmi IGw B BQ Bb U6Wq E7 EAA E BNeOq1 BNeOq1 BNeOrS A A C
>>>>>>
>>>>>> The eight field, as defined by ' ', is E7.
>>>>>>
>>>>>> --
>>>>>> Dan Langille - http://langille.org/
>>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>> Hi,
>>>>
>>>> I wrote the Bacula LStat decoder implementation in PHP. I made WebGUI
>>>> for this also. Now online LStat decoder (beta version) is available on
>>>> my page Bacula.pl:
>>>>
>>>> http://www.bacula.pl/bacula-lstat-decoder/
>>>>
>>>> In the near future I need to make description of fields.
>>>>
>>>> Here is Bacula LStat decoder function in PHP:
>>>>
>>>> function decode_bacula_lstat($lstat) {
>>>> $base64 =
>>>> 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
>>>> $lstat = trim($lstat);
>>>> $lstat_fields = explode(' ', $lstat);
>>>>
>>>> if(count($lstat_fields) !== 16) {
>>>> die('Error! Number of lstat fields is invalid. Please
>>>> make
>>>> sure that
>>>> it is valid lstat string.');
>>>> }
>>>>
>>>> list($dev, $inode, $mode, $links, $uid, $gid, $rdev, $size,
>>>> $blksize,
>>>> $blocks, $atime, $mtime, $ctime, $linkfi, $flags, $data) =
>>>> $lstat_fields;
>>>> $encoded_values = array('dev' => $dev, 'inode' => $inode,
>>>> 'mode' =>
>>>> $mode, 'links' => $links, 'uid' => $uid, 'gid' => $gid, 'rdev' =>
>>>> $rdev, 'size' => $size, 'blksize' => $blksize, 'blocks' => $blocks,
>>>> 'atime' => $atime, 'mtime' => $mtime, 'ctime' => $ctime, 'linkfi' =>
>>>> $linkfi, 'flags' => $flags, 'data' => $data);
>>>>
>>>> $ret = array();
>>>> foreach($encoded_values as $key => $val) {
>>>> $result = 0;
>>>> $is_minus = false;
>>>> $start = 0;
>>>>
>>>> if(substr($val, 0, 1) === '-') {
>>>> $is_minus = true;
>>>> $start++;
>>>> }
>>>>
>>>> for($i = $start; $i< strlen($val); $i++) {
>>>> $result<<= 6;
>>>> $result += strpos($base64, substr($val, $i ,
>>>> 1));
>>>> }
>>>> $ret[$key] = ($is_minus === true) ? -$result : $result;
>>>> }
>>>> return $ret;
>>>> }
>>>>
>>>> and here is usage for this:
>>>>
>>>> $lstat = 'gB DL+b IGg B A y A D5dZR BAA fN4 BNeR+z BNeR+7 BNeR+7 A A C';
>>>> $decoded_lstat = decode_bacula_lstat($lstat);
>>>> print_r($decoded_lstat);
>>>>
>>>> Any suggestions and modifications are welcome.
>>>> Regards
>>>> gani
>>>>
>>>
>>> I tried this function. I got an interesting value for:
>>>
>>> Bn bIgF IGk B Pp Pp BsZ/o Cp7/ZH EAA VQLA BNachF BNacW5 BNachH A A C
>>>
>>> The PHP function returns: -1443891641
>>>
>>> The pgsql function returns:
>>>
>>> bacula=# select base64_decode_lstat(8,'Bn bIgF IGk B Pp Pp BsZ/o Cp7/ZH
>>> EAA
>>> VQLA BNachF BNacW5 BNachH A A C')
>>> bacula-# ;
>>> base64_decode_lstat
>>> ---------------------
>>> 2851075655
>>> (1 row)
>>>
>>> bacula=#
>>>
>>> Which is a more likely value.... FYI.
>
>> Hi,
>>
>> First, many thanks for your feedback.
>>
>> I researched that behaviour with filesize of your lstat field (
>> -1443891641). Yes, I made mistake with using shift bitwise operator.
>> From PHP documentation:
>>
>> "Warning!
>> Don't right shift for more than 32 bits on 32 bits systems. Don't left
>> shift in case it results to number longer than 32 bits."
>> (source: http://php.net/manual/en/language.operators.bitwise.php)
>>
>> Repairing this bug is replacing the line:
>>
>> $result <<= 6;
>>
>> to this line:
>>
>> $result = bcmul($result, bcpow(2,6));
>>
>> It should work properly.
>
> bcmul isn't in PHP by default:
>
> PHP Fatal error: Call to undefined function bcmul()
>
> I'm running PHP php5-5.3.5
>
> The man page: http://us2.php.net/bcmul
>
> I recompiled PHP with BCMATH - bc style precision math functions
>
> That's much better. Thanks.
>
> What I'd like to do, but not today, is compare all values output by the PHP
> function with the values output by the stored procedure.
>
>
> --
> Dan Langille - http://langille.org/
>
--
"Większej miłości nikt nie ma nad tę, jak gdy kto życie swoje kładzie
za przyjaciół swoich." Jezus Chrystus
------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Bacula-users mailing list
Bacula-users AT lists.sourceforge DOT net
https://lists.sourceforge.net/lists/listinfo/bacula-users
|