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 <d...@langille.org> napisał:
> On 3/12/2011 9:33 PM, ganiuszka wrote:
>>
>> W dniu 13 marca 2011 01:01 użytkownik Dan Langille<d...@langille.org>
>>  napisał:
>>>
>>> On 3/12/2011 9:29 AM, ganiuszka wrote:
>>>>
>>>> W dniu 11 marca 2011 21:45 użytkownik ganiuszka<ganius...@gmail.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<d...@langille.org>:
>>>>>>
>>>>>> On 3/9/2011 5:36 PM, ganiuszka wrote:
>>>>>>
>>>>>>> 2011/3/9 Mike Eggleston<mikee...@mac.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@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-users

Reply via email to