format('Y-m-d\TH:i:s.u\Z'); } static function get() { if (self::$db != null) { return self::$db; } $dsn = MTrackConfig::get('core', 'dsn'); $user = MTrackConfig::get('core', 'dsnuser'); $pass = MTrackConfig::get('core', 'dsnpassword'); if ($dsn === null) { $dsn = 'sqlite:' . MTrackConfig::get('core', 'dblocation'); } $db = new PDO($dsn, $user, $pass); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$db = $db; if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'sqlite') { $db->sqliteCreateAggregate('mtrack_group_concat', array('MTrackDB', 'group_concat_step'), array('MTrackDB', 'group_concat_final')); $db->sqliteCreateFunction('mtrack_cleanup_attachments', array('MTrackAttachment', 'attachment_row_deleted')); } foreach (self::$extensions as $ext) { $ext->onHandleCreated($db); } return self::$db; } static function lastInsertId($tablename, $keyfield) { if (!strlen($tablename) || !strlen($keyfield)) { throw new Exception("missing tablename or keyfield"); } if (self::$db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'pgsql') { return self::$db->lastInsertId($tablename . '_' . $keyfield . '_seq'); } else { return self::$db->lastInsertId(); } } // bit like stored procs in SQLITE.. static function group_concat_step($context, $rownum, $value) { if (!is_array($context)) { $context = array(); } $context[] = $value; return $context; } static function group_concat_final($context, $rownum) { if ($context === null) { return null; } asort($context); return join(", ", $context); } static function esc($str) // escape.. { return "'" . str_replace("'", "''", $str) . "'"; } /* issue a query, passing optional parameters */ static function q($sql) { self::$queries++; if (isset(self::$query_strings[$sql])) { self::$query_strings[$sql]++; } else { self::$query_strings[$sql] = 1; } $params = func_get_args(); array_shift($params); $db = self::get(); # echo "
SQL: $sql\n"; # var_dump($params); #echo "
"; try { if (count($params)) { $q = $db->prepare($sql); $q->execute($params); } else { $q = $db->query($sql); } } catch (Exception $e) { echo $e->getMessage(); throw $e; } return $q; } }