<?php

namespace SilverStripe\SQLite;

use SilverStripe\ORM\Connect\Query;
use SQLite3Result;
use Traversable;

/**
 * A result-set from a SQLite3 database.
 */
class SQLite3Query extends Query
{

    /**
     * The SQLite3Connector object that created this result set.
     *
     * @var SQLite3Connector
     */
    protected $database;

    /**
     * The internal sqlite3 handle that points to the result set.
     *
     * @var SQLite3Result
     */
    protected $handle;

    /**
     * Hook the result-set given into a Query class, suitable for use by framework.
     * @param SQLite3Connector $database The database object that created this query.
     * @param SQLite3Result $handle the internal sqlite3 handle that is points to the resultset.
     */
    public function __construct(SQLite3Connector $database, SQLite3Result $handle)
    {
        $this->database = $database;
        $this->handle = $handle;
    }

    public function __destruct()
    {
        if ($this->handle) {
            $this->handle->finalize();
        }
    }

    /**
     * @todo This looks terrible but there is no SQLite3::get_num_rows() implementation
     */
    public function numRecords()
    {
        // Some queries are not iterable using fetchArray like CREATE statement
        if (!$this->handle->numColumns()) {
            return 0;
        }

        $this->handle->reset();
        $c=0;
        while ($this->handle->fetchArray()) {
            $c++;
        }
        $this->handle->reset();
        return $c;
    }

    public function getIterator(): Traversable
    {
        while ($data = $this->handle->fetchArray(SQLITE3_ASSOC)) {
            yield $data;
        }
    }
}