<?php namespace DgoraWcas\Analytics; use DgoraWcas\Helpers; // Exit if accessed directly if ( ! defined( 'ABSPATH' ) ) { exit; } class Database { const DB_NAME = 'dgwt_wcas_stats'; const DB_VERSION = 2; const DB_VERSION_OPTION = 'dgwt_wcas_stats_db_version'; /** * Add table names to the $wpdb object * * @return void */ public static function registerTables() { global $wpdb; $wpdb->dgwt_wcas_stats = $wpdb->prefix . self::DB_NAME; $wpdb->tables[] = self::DB_NAME; } /** * Install DB if necessary * * @return void */ public static function maybeInstall() { if ( ! self::exist() ) { self::install(); } else { $dbVersion = get_option( self::DB_VERSION_OPTION ); if ( absint( $dbVersion ) !== self::DB_VERSION ) { self::install(); } } } /** * Install DB table * * @return void */ private static function install() { global $wpdb; $wpdb->hide_errors(); $freshInstall = ! self::exist(); $upFile = ABSPATH . 'wp-admin/includes/upgrade.php'; if ( file_exists( $upFile ) ) { require_once( $upFile ); $collate = Helpers::getCollate( 'stats/main' ); $table = "CREATE TABLE $wpdb->dgwt_wcas_stats ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, phrase VARCHAR(255) NOT NULL, hits INT NOT NULL, created_at DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00', autocomplete TINYINT(1) NULL DEFAULT 1, solved TINYINT(1) NULL DEFAULT 0, lang VARCHAR(10) NULL, PRIMARY KEY (id) ) ENGINE=InnoDB $collate;"; dbDelta( $table ); if ( $freshInstall ) { //@TODO mount index for columns if necessary } update_option( self::DB_VERSION_OPTION, self::DB_VERSION ); } } /** * Check if the table exists * * @return bool */ public static function exist() { global $wpdb; return Helpers::isTableExists( $wpdb->dgwt_wcas_stats ); } /** * Remove DB table * * @return void */ public static function remove() { global $wpdb; $wpdb->hide_errors(); $wpdb->query( "DROP TABLE IF EXISTS $wpdb->dgwt_wcas_stats" ); delete_option( self::DB_VERSION_OPTION ); } /** * Wipe old analytics records * * @param int $daysAgo Minimum age of records to be deleted. * * @return void */ public static function wipeOldRecords( $daysAgo = 0 ) { global $wpdb; if ( ! self::exist() ) { return; } if ( intval( $daysAgo ) <= 0 ) { $daysAgo = Maintenance::ANALYTICS_EXPIRATION_IN_DAYS; } $wpdb->hide_errors(); // Delete expired records. $daysAgo = date( 'Y-m-d H:i:s', strtotime( "today - $daysAgo days" ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->dgwt_wcas_stats WHERE DATE(created_at) <= %s", $daysAgo ) ); // Delete non-critical records. if ( defined( 'DGWT_WCAS_ANALYTICS_ONLY_CRITICAL' ) && DGWT_WCAS_ANALYTICS_ONLY_CRITICAL ) { $wpdb->query( "DELETE FROM $wpdb->dgwt_wcas_stats WHERE hits > 0" ); } } /** * Wipe all analytics records * * @return void */ public static function wipeAllRecords() { global $wpdb; if ( ! self::exist() ) { return; } $wpdb->hide_errors(); $wpdb->query( "DELETE FROM $wpdb->dgwt_wcas_stats" ); } /** * Get the number of records * * @return int */ public static function getRecordsCount() { global $wpdb; if ( ! self::exist() ) { return 0; } $wpdb->hide_errors(); return intval( $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->dgwt_wcas_stats" ) ); } /** * @return string */ public static function getTableName() { global $wpdb; return $wpdb->prefix . Database::DB_NAME; } }