shorten filenames to precision of the column (200 characters9, to not give SQL error under PostgreSQL

This commit is contained in:
Ralf Becker 2015-08-22 12:47:04 +00:00
parent 07835ec446
commit 56980366ba

View File

@ -239,7 +239,7 @@ class StreamWrapper implements Vfs\StreamWrapperIface
if (self::LOG_LEVEL > 2) $query = '/* '.__METHOD__.': '.__LINE__.' */ '.$query; if (self::LOG_LEVEL > 2) $query = '/* '.__METHOD__.': '.__LINE__.' */ '.$query;
$stmt = self::$pdo->prepare($query); $stmt = self::$pdo->prepare($query);
$values = array( $values = array(
'fs_name' => Vfs::basename($path), 'fs_name' => self::limit_filename(Vfs::basename($path)),
'fs_dir' => $dir_stat['ino'], 'fs_dir' => $dir_stat['ino'],
// we use the mode of the dir, so files in group dirs stay accessible by all members // we use the mode of the dir, so files in group dirs stay accessible by all members
'fs_mode' => $dir_stat['mode'] & 0666, 'fs_mode' => $dir_stat['mode'] & 0666,
@ -661,7 +661,7 @@ class StreamWrapper implements Vfs\StreamWrapperIface
' WHERE fs_dir=:old_dir AND fs_name'.self::$case_sensitive_equal.':old_name'); ' WHERE fs_dir=:old_dir AND fs_name'.self::$case_sensitive_equal.':old_name');
$ok = $stmt->execute(array( $ok = $stmt->execute(array(
'fs_dir' => $to_dir_stat['ino'], 'fs_dir' => $to_dir_stat['ino'],
'fs_name' => Vfs::basename($path_to), 'fs_name' => self::limit_filename(Vfs::basename($path_to)),
'old_dir' => $from_dir_stat['ino'], 'old_dir' => $from_dir_stat['ino'],
'old_name' => $from_stat['name'], 'old_name' => $from_stat['name'],
)); ));
@ -751,7 +751,7 @@ class StreamWrapper implements Vfs\StreamWrapperIface
$stmt = self::$pdo->prepare('INSERT INTO '.self::TABLE.' (fs_name,fs_dir,fs_mode,fs_uid,fs_gid,fs_size,fs_mime,fs_created,fs_modified,fs_creator'. $stmt = self::$pdo->prepare('INSERT INTO '.self::TABLE.' (fs_name,fs_dir,fs_mode,fs_uid,fs_gid,fs_size,fs_mime,fs_created,fs_modified,fs_creator'.
') VALUES (:fs_name,:fs_dir,:fs_mode,:fs_uid,:fs_gid,:fs_size,:fs_mime,:fs_created,:fs_modified,:fs_creator)'); ') VALUES (:fs_name,:fs_dir,:fs_mode,:fs_uid,:fs_gid,:fs_size,:fs_mime,:fs_created,:fs_modified,:fs_creator)');
if (($ok = $stmt->execute(array( if (($ok = $stmt->execute(array(
'fs_name' => Vfs::basename($path), 'fs_name' => self::limit_filename(Vfs::basename($path)),
'fs_dir' => $parent['ino'], 'fs_dir' => $parent['ino'],
'fs_mode' => $parent['mode'], 'fs_mode' => $parent['mode'],
'fs_uid' => $parent['uid'], 'fs_uid' => $parent['uid'],
@ -773,7 +773,7 @@ class StreamWrapper implements Vfs\StreamWrapperIface
if ($stmt->execute(array( if ($stmt->execute(array(
'fs_dir' => $parent['ino'], 'fs_dir' => $parent['ino'],
'fs_active' => self::_pdo_boolean(true), 'fs_active' => self::_pdo_boolean(true),
'fs_name' => Vfs::basename($path), 'fs_name' => self::limit_filename(Vfs::basename($path)),
)) && $stmt->fetchColumn() > 1) // if there's more then one --> remove our new dir )) && $stmt->fetchColumn() > 1) // if there's more then one --> remove our new dir
{ {
self::$pdo->query('DELETE FROM '.self::TABLE.' WHERE fs_id='.$new_fs_id); self::$pdo->query('DELETE FROM '.self::TABLE.' WHERE fs_id='.$new_fs_id);
@ -1319,7 +1319,7 @@ class StreamWrapper implements Vfs\StreamWrapperIface
unset(self::$stat_cache[Vfs::parse_url($link,PHP_URL_PATH)]); unset(self::$stat_cache[Vfs::parse_url($link,PHP_URL_PATH)]);
return !!$stmt->execute(array( return !!$stmt->execute(array(
'fs_name' => Vfs::basename($link), 'fs_name' => self::limit_filename(Vfs::basename($link)),
'fs_dir' => $dir_stat['ino'], 'fs_dir' => $dir_stat['ino'],
'fs_mode' => ($dir_stat['mode'] & 0666), 'fs_mode' => ($dir_stat['mode'] & 0666),
'fs_uid' => $dir_stat['uid'] ? $dir_stat['uid'] : Vfs::$user, 'fs_uid' => $dir_stat['uid'] ? $dir_stat['uid'] : Vfs::$user,
@ -1572,6 +1572,34 @@ class StreamWrapper implements Vfs\StreamWrapperIface
return is_array($fs_ids) ? $pathes : array_shift($pathes); return is_array($fs_ids) ? $pathes : array_shift($pathes);
} }
/**
* Limit filename to precision of column while keeping the extension
*
* @param string $name
* @return string
*/
static protected function limit_filename($name)
{
static $fs_name_precision = null;
if (!isset($fs_name_precision))
{
$fs_name_precision = $GLOBALS['egw']->db->get_column_attribute('fs_name', self::TABLE, 'phpgwapi', 'precision');
}
if (mb_strlen($name) > $fs_name_precision)
{
$parts = explode('.', $name);
if ($parts > 1 && mb_strlen($extension = '.'.array_pop($parts)) <= $fs_name_precision)
{
$name = mb_substr(implode('.', $parts), 0, $fs_name_precision-mb_strlen($extension)).$extension;
}
else
{
$name = mb_substr(implode('.', $parts), 0, $fs_name_precision);
}
}
return $name;
}
/** /**
* Convert a sqlfs-file-info into a stat array * Convert a sqlfs-file-info into a stat array
* *