. /** * Database column information. * * @package core_dml * @copyright 2008 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * Detailed database field information. * * It is based on the adodb library's ADOFieldObject object. * 'column' does mean 'the field' here. * * @package core_dml * @copyright 2008 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * * @property-read string $name Name of column - lowercase. * @property-read string $type Driver dependent native data type. Not standardised, it's used to find meta_type. * * Max length: * character type - number of characters * blob - number of bytes * integer - number of digits * float - digits left from floating point * boolean - 1 * @property-read int $max_length size of the database field, eg how much data can you put in there. * * @property-read int $scale Scale of field, decimal points (float), null otherwise. * @property-read bool $not_null true if the field is set to NOT NULL. * @property-read bool $primary_key true if the field is the primary key. (usually 'id'). * @property-read bool $auto_increment True if field is autoincrementing or sequence. * @property-read bool $binary True if the field is binary. * @property-read bool $has_default True if the default value is defined. * @property-read string $default_value The default value (if defined). * @property-read bool $unique True if the field values are unique, false if not. * * Standardised one character column type, uppercased and enumerated as follows: * R - counter (integer primary key) * I - integers * N - numbers (floats) * C - characters and strings * X - texts * B - binary blobs * L - boolean (1 bit) * T - timestamp - unsupported * D - date - unsupported * @property-read string $meta_type Standardised one character column type, uppercased and enumerated: R,I,N,C,X,B,L,T,D */ class database_column_info { /** * @var array The internal storage of column data. */ protected $data; /** * Magic set function. This is a read only object and you aren't allowed to write to any variables. * * @param string $name ignored. * @param mixed $value ignored. * @throws coding_exception You are not allowed to set data on database_column_info */ public function __set($name, $value) { throw new coding_exception('database_column_info is a ready only object to allow for faster caching.'); } /** * Magic get function. * * @param string $variablename variable name to return the value of. * @return mixed The variable contents. * * @throws coding_exception You cannot request a variable that is not allowed. */ public function __get($variablename) { if (isset($this->data[$variablename]) || array_key_exists($variablename, $this->data)) { return $this->data[$variablename]; } throw new coding_exception('Asked for a variable that is not available . ('.$variablename.').'); } /** * Magic isset function. * * @param string $variablename The name of the property to test if isset(). * @return bool Whether the value is set or not. */ public function __isset($variablename) { return isset($this->data[$variablename]); } /** * Constructor * * @param mixed $data object or array with properties */ public function __construct($data) { // Initialize all the allowed variables to null so the array key exists. $validelements = array('name', 'type', 'max_length', 'scale', 'not_null', 'primary_key', 'auto_increment', 'binary', 'has_default', 'default_value', 'unique', 'meta_type'); foreach ($validelements as $element) { if (isset($data->$element)) { $this->data[$element] = $data->$element; } else { $this->data[$element] = null; } } switch ($this->data['meta_type']) { case 'R': // normalise counters (usually 'id') $this->data['binary'] = false; $this->data['has_default'] = false; $this->data['default_value'] = null; $this->data['unique'] = true; break; case 'C': $this->data['auto_increment'] = false; $this->data['binary'] = false; break; } } }