arnapou/pfdb

Library - Flat file storage with query features.

v6.3 2024-04-14 15:48 UTC

This package is auto-updated.

Last update: 2024-11-08 15:17:12 UTC


README

pipeline coverage

This library allow you to query flat file "databases".

Installation

composer require arnapou/pfdb

packagist 👉️ arnapou/pfdb

Introduction

What it is :

  • Pure POO
  • Lightweight
  • Extendable (interfaces, ...)

What it is not :

  • SQL database
  • Relational database
  • ORM
  • DBDAL

When to use :

  • You absolutely want flat files
  • More read than write (even if you can use a lock strategy)
  • Lightweight data
  • Simple files like configs or small data (less than a few thousands items)

Implemented files formats :

  • YAML
  • PHP

Note that it is really easy to make your own implementation

There is not a lot of documentation because I did this project for me and I guess a few examples and reading the code should be enough for developers. Examples are the best documentation you will find.

Conditioning

$storage = new \Arnapou\PFDB\Storage\PhpFileStorage($somePath);
$database = new \Arnapou\PFDB\Database($storage);

$table = $database->getTable('vehicle');

$expr = $table->expr()->and(
     $table->expr()->gt('price', 10000),
     $table->expr()->match('model', '^C[0-9]+')
);
    
$iterator = $table->find($expr)
                  ->sort('constructor' , ['model' , 'DESC'])
                  ->limit(0, 50);
                  
foreach($iterator as $key => $row) {
    // do whatever you want
}

Extending Expressions

Class :

class IsUppercaseExpr implements \Arnapou\PFDB\Query\Helper\Expr\ExprInterface {

    private $field;
    
    public function __construct(string $field) 
    {
        $this->field = $field;
    }

    public function __invoke(array $row, $key = null): bool
    {
        if(!isset($row[$this->field]) {
            return false;
        }
        $testedValue = (string)$row[$this->field];
        return $testedValue === strtoupper($testedValue);
    }

}

Use :

$storage = new \Arnapou\PFDB\Storage\PhpFileStorage($somePath);
$database = new \Arnapou\PFDB\Database($storage);

$table = $database->getTable('vehicle');

$expr = new IsUppercaseExpr('model');

foreach($table->find($expr) as $key => $row) {
    // do whatever you want
}

Use PFDB Iterator out of storage context

if you just want to select, filter, sort, limit, group, order any iterator

$data = [
    ['name' => 'John', 'age' => 20],
    ['name' => 'Edith', 'age' => 25],
    ['name' => 'Steve', 'age' => 30],
    ['name' => 'Matthew', 'age' => 22],
);

$query = (new \Arnapou\PFDB\Query\Query())
    ->from(new \ArrayIterator($data))
    ->where($query->expr()->gt('age', 24));

foreach($query as $key => $row) {
    // do whatever you want
}

Build your own storage

You want to use CSV file instead of php dumped array ?

Easy : extends or implements your own storage and use it to load/store/delete data.

Look at the existing storages and write your own.

Php versions

DateRef8.38.28.18.07.25.4
26/11/20236.x, main×
11/12/20225.x×
30/01/20224.x×
15/05/20213.x×
27/02/20192.x×
07/11/20131.x×