NAME
File::KDBX::Util - Utility functions for working with KDBX files
VERSION
version 0.800
FUNCTIONS
load_xs
$bool = load_xs();
$bool = load_xs($version);
Attempt to load File::KDBX::XS. Return truthy if XS
is loaded. If $version
is given, it will check that at least the given version is loaded.
assert
assert { ... };
Write an executable comment. Only executed if DEBUG
is set in the environment.
assert_64bit
assert_64bit();
Throw if perl doesn't support 64-bit IVs.
can_fork
$bool = can_fork;
Determine if perl can fork, with logic lifted from "CAN_FORK" in Test2::Util.
clone
$clone = clone($thing);
Clone deeply. This is an unadorned alias to Storable dclone
.
clone_nomagic
$clone = clone_nomagic($thing);
Clone deeply without keeping [most of] the magic.
WARNING: At the moment the implementation is naïve and won't respond well to nontrivial data or recursive structures.
DEBUG
Constant number indicating the level of debuggingness.
dumper
$str = dumper $thing;
dumper $thing; # in void context, prints to STDERR
Like Data::Dumper but slightly terser in some cases relevent to File::KDBX.
empty
nonempty
$bool = empty $thing;
$bool = nonempty $thing;
Test whether a thing is empty (or nonempty). An empty thing is one of these:
nonexistent
undef
zero-length string
zero-length array
hash with zero keys
reference to an empty thing (recursive)
Note in particular that zero 0
is not considered empty because it is an actual value.
erase
erase($string, ...);
erase(\$string, ...);
Overwrite the memory used by one or more string.
erase_scoped
$scope_guard = erase_scoped($string, ...);
$scope_guard = erase_scoped(\$string, ...);
undef $scope_guard; # erase happens here
Get a scope guard that will cause scalars to be erased later (i.e. when the scope ends). This is useful if you want to make sure a string gets erased after you're done with it, even if the scope ends abnormally.
See "erase".
extends
extends $class;
Set up the current module to inheret from another module.
has
has $name => %options;
Create an attribute getter/setter. Possible options:
is
- Either "rw" (default) or "ro"default
- Default valuecoerce
- Coercive function
format_uuid
$string_uuid = format_uuid($raw_uuid);
$string_uuid = format_uuid($raw_uuid, $delimiter);
Format a 128-bit UUID (given as a string of 16 octets) into a hexidecimal string, optionally with a delimiter to break up the UUID visually into five parts. Examples:
my $uuid = uuid('01234567-89AB-CDEF-0123-456789ABCDEF');
say format_uuid($uuid); # -> 0123456789ABCDEF0123456789ABCDEF
say format_uuid($uuid, '-'); # -> 01234567-89AB-CDEF-0123-456789ABCDEF
This is the inverse of "uuid".
generate_uuid
$uuid = generate_uuid;
$uuid = generate_uuid(\%set);
$uuid = generate_uuid(\&test_uuid);
Generate a new random UUID. It's pretty unlikely that this will generate a repeat, but if you're worried about that you can provide either a set of existing UUIDs (as a hashref where the keys are the elements of a set) or a function to check for existing UUIDs, and this will be sure to not return a UUID already in provided set. Perhaps an example will make it clear:
my %uuid_set = (
uuid('12345678-9ABC-DEFG-1234-56789ABCDEFG') => 'whatever',
);
$uuid = generate_uuid(\%uuid_set);
# OR
$uuid = generate_uuid(sub { !$uuid_set{$_} });
Here, $uuid
can't be "12345678-9ABC-DEFG-1234-56789ABCDEFG". This example uses "uuid" to easily pack a 16-byte UUID from a literal, but it otherwise is not a consequential part of the example.
gunzip
$unzipped = gunzip($string);
Decompress an octet stream.
gzip
$zipped = gzip($string);
Compress an octet stream.
is_readable
is_writable
$bool = is_readable($mode);
$bool = is_writable($mode);
Determine of an fopen
-style mode is readable, writable or both.
is_uuid
$bool = is_uuid($thing);
Check if a thing is a UUID (i.e. scalar string of length 16).
list_attributes
@attributes = list_attributes($package);
Get a list of attributes for a class.
load_optional
$package = load_optional($package);
Load a module that isn't required but can provide extra functionality. Throw if the module is not available.
memoize
\&memoized_code = memoize(\&code, ...);
Memoize a function. Extra arguments are passed through to &code
when it is called.
pad_pkcs7
$padded_string = pad_pkcs7($string, $block_size),
Pad a block using the PKCS#7 method.
query
$query = query(@where);
$query->(\%data);
Generate a function that will run a series of tests on a passed hashref and return true or false depending on if the data record in the hash matched the specified logic.
The logic can be specified in a manner similar to "WHERE CLAUSES" in SQL::Abstract which was the inspiration for this function, but this code is distinct, supporting an overlapping but not identical feature set and having its own bugs.
See "QUERY" in File::KDBX for examples.
query_any
Get either a "query" or "simple_expression_query", depending on the arguments.
read_all
$size = read_all($fh, my $buffer, $size);
$size = read_all($fh, my $buffer, $size, $offset);
Like "read" in functions but returns undef
if not all $size
bytes are read. This is considered an error, distinguishable from other errors by $!
not being set.
recurse_limit
\&limited_code = recurse_limit(\&code);
\&limited_code = recurse_limit(\&code, $max_depth);
\&limited_code = recurse_limit(\&code, $max_depth, \&error_handler);
Wrap a function with a guard to prevent deep recursion.
search
# Generate a query on-the-fly:
\@matches = search(\@records, @where);
# Use a pre-compiled query:
$query = query(@where);
\@matches = search(\@records, $query);
# Use a simple expression:
\@matches = search(\@records, \'query terms', @fields);
\@matches = search(\@records, \'query terms', $operator, @fields);
# Use your own subroutine:
\@matches = search(\@records, \&query);
\@matches = search(\@records, sub { $record = shift; ... });
Execute a linear search over an array of records using a "query". A "record" is usually a hash.
simple_expression_query
$query = simple_expression_query($expression, @fields);
$query = simple_expression_query($expression, $operator, @fields);
Generate a query, like "query", to be used with "search" but built from a "simple expression" as described here.
An expression is a string with one or more space-separated terms. Terms with spaces can be enclosed in double quotes. Terms are negated if they are prefixed with a minus sign. A record must match every term on at least one of the given fields.
snakify
$string = snakify($string);
Turn a CamelCase string into snake_case.
split_url
($scheme, $auth, $host, $port, $path, $query, $hash, $usename, $password) = split_url($url);
Split a URL into its parts.
For example, http://user:pass@localhost:4000/path?query#hash
gets split like:
http
user:pass
host
4000
/path
?query
#hash
user
pass
to_bool
to_number
to_string
to_time
to_tristate
to_uuid
Various typecasting / coercive functions.
trim
$string = trim($string);
The ubiquitous trim
function. Removes all whitespace from both ends of a string.
try_load_optional
$package = try_load_optional($package);
Try to load a module that isn't required but can provide extra functionality, and return true if successful.
uri_escape_utf8
$string = uri_escape_utf8($string);
Percent-encode arbitrary text strings, like for a URI.
uri_unescape_utf8
$string = uri_unescape_utf8($string);
Inverse of "uri_escape_utf8".
uuid
$raw_uuid = uuid($string_uuid);
Pack a 128-bit UUID (given as a hexidecimal string with optional -
's, like 12345678-9ABC-DEFG-1234-56789ABCDEFG
) into a string of exactly 16 octets.
This is the inverse of "format_uuid".
UUID_NULL
Get the null UUID (i.e. string of 16 null bytes).
BUGS
Please report any bugs or feature requests on the bugtracker website https://github.com/chazmcgarvey/File-KDBX/issues
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
AUTHOR
Charles McGarvey <ccm@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2022 by Charles McGarvey.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.