Skip to content

Latest commit

 

History

143 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Commands

Build status on GitHub XP Framework Module BSD Licence Requires PHP 8.0+ Latest Stable Version

Also known as "xpcli": Command line argument parsing via annotations.

Example

use util\cmd\{Command, Arg};
use rdbms\DriverManager;
use io\streams\Streams;

/** Performs an SQL query */
class Query extends Command {
  private $connection, $query;
  private $verbose= false;

  /** Connection DSN, e.g. `mysql://user:pass@host[:port][/database]` */
  #[Arg(position: 0)]
  public function useConnection(string $dsn) {
    $this->connection= DriverManager::getConnection($dsn);
    $this->connection->connect();
  }

  /** SQL query. Use `-` to read from standard input */
  #[Arg(position: 1)]
  public function useQuery(string $query) {
    if ('-' === $query) {
      $this->query= Streams::readAll($this->in->stream());
    } else {
      $this->query= $query;
    }
  }

  /** Verbose output */
  #[Arg]
  public function useVerbose() {
    $this->verbose= true;
  }

  /** @return int */
  public function run() {
    $this->verbose && $this->out->writeLine('@ ', $this->connection);
    $this->verbose && $this->out->writeLine('>>> ', $this->query);

    $result= $this->connection->open($this->query);
    if ($result->isSuccess()) {
      $this->verbose && $this->out->writeLine('<<< ', $result->affected());
      return $result->affected() ? 0 : 1;
    } else {
      $this->verbose && $this->out->writeLine('<<< Results');
      foreach ($result as $found => $record) {
        $this->out->writeLine($record);
      }
      return isset($found) ? 0 : 2;
    }
  }
}

To execute the class, use the cmd command:

$ xp -m /path/to/rdbms cmd Query 'mysql://localhost/test' 'select * from account' -v
@ rdbms.mysqlx.MySqlxConnection(->rdbms.DSN@(mysql://localhost/test), rdbms.mysqlx.MySqlxProtocol(...)
>>> select * from account
<<< Results
[
  account_id => 1
  username => "kiesel"
  email => "alex.dandrea@example.com"
]
[
  account_id => 2
  username => "thekid"
  email => "timm.friebe@example.com"
]

To show the command's usage, supply -? or --help:

query-class-usage

See also

  • RFC #0133 - Add support for filenames as argument for XPCLI
  • RFC #0102 - XP Class Runners (original RFC)

About

Commands, a.k.a. xpcli

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages