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;
}
}