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;
$stmt = self::$pdo->prepare($query);
$values = array(
'fs_name' => Vfs::basename($path),
'fs_name' => self::limit_filename(Vfs::basename($path)),
'fs_dir' => $dir_stat['ino'],
// we use the mode of the dir, so files in group dirs stay accessible by all members
'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');
$ok = $stmt->execute(array(
'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_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'.
') 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(
'fs_name' => Vfs::basename($path),
'fs_name' => self::limit_filename(Vfs::basename($path)),
'fs_dir' => $parent['ino'],
'fs_mode' => $parent['mode'],
'fs_uid' => $parent['uid'],
@ -773,7 +773,7 @@ class StreamWrapper implements Vfs\StreamWrapperIface
if ($stmt->execute(array(
'fs_dir' => $parent['ino'],
'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
{
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)]);
return !!$stmt->execute(array(
'fs_name' => Vfs::basename($link),
'fs_name' => self::limit_filename(Vfs::basename($link)),
'fs_dir' => $dir_stat['ino'],
'fs_mode' => ($dir_stat['mode'] & 0666),
'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);
}
/**
* 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
*