101 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace XFramework;
 | 
						|
 | 
						|
/**
 | 
						|
 * Roundcube Plus Framework plugin.
 | 
						|
 *
 | 
						|
 * This class provides functions that contain SQLite-specific queries.
 | 
						|
 *
 | 
						|
 * Copyright 2016, Tecorama LLC.
 | 
						|
 *
 | 
						|
 * @license Commercial. See the LICENSE file for details.
 | 
						|
 */
 | 
						|
 | 
						|
require_once("DatabaseGeneric.php");
 | 
						|
require_once("DatabaseInterface.php");
 | 
						|
 | 
						|
class DatabaseSqlite extends DatabaseGeneric implements DatabaseInterface
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Returns the columns in the database table.
 | 
						|
     * We're not using $this->rcmail->db->list_cols($table) because in some cases it doesn't return reliable results.
 | 
						|
     *
 | 
						|
     * @param string $table
 | 
						|
     * @param bool $prependPrefix
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getColumns(string $table, bool $addPrefix = true): array
 | 
						|
    {
 | 
						|
        if ($addPrefix) {
 | 
						|
            $table = "{" . $table . "}";
 | 
						|
        }
 | 
						|
 | 
						|
        $all = $this->all("pragma table_info($table)");
 | 
						|
        $columns = [];
 | 
						|
 | 
						|
        if (is_array($all)) {
 | 
						|
            foreach ($all as $item) {
 | 
						|
                $columns[] = $item["name"];
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $columns;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the names of all the tables in the database.
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getTables(): array
 | 
						|
    {
 | 
						|
        $result = [];
 | 
						|
        $tables = $this->all("SELECT name FROM sqlite_master WHERE type='table'");
 | 
						|
 | 
						|
        if (is_array($tables)) {
 | 
						|
            foreach ($tables as $table) {
 | 
						|
                if (($values = array_values($table)) && $values[0] != "sqlite_sequence") {
 | 
						|
                    $result[] = $values[0];
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $result;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Checks if a table exists in the database.
 | 
						|
     *
 | 
						|
     * @param string $table
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function hasTable(string $table): bool
 | 
						|
    {
 | 
						|
        $table = $this->getTableName($table, false);
 | 
						|
        return in_array($table, $this->getTables());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Removes records that are older than the specified amount of seconds.
 | 
						|
     *
 | 
						|
     * @param string $table
 | 
						|
     * @param string $dateField
 | 
						|
     * @param int $seconds
 | 
						|
     * @param bool $addPrefix
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function removeOld(string $table, string $dateField = "created_at", int $seconds = 3600, bool $addPrefix = true): bool
 | 
						|
    {
 | 
						|
        if ($addPrefix) {
 | 
						|
            $table = "{" . $table . "}";
 | 
						|
        }
 | 
						|
 | 
						|
        if (!$this->query("DELETE FROM $table WHERE $dateField < date('now', '-$seconds second')")) {
 | 
						|
            $this->logLastError();
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
} |