diff options
author | Dries Buytaert <dries@buytaert.net> | 2006-02-22 10:06:46 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2006-02-22 10:06:46 +0000 |
commit | 347a5bb5f642573fcc8567a4bbdca18ad50265f3 (patch) | |
tree | 6be6c89da82fad850ba1247765542fc4d166f0f8 /modules/upload | |
parent | cb05945caf65030cb3f9906dbbc78c648ca27406 (diff) | |
download | brdo-347a5bb5f642573fcc8567a4bbdca18ad50265f3.tar.gz brdo-347a5bb5f642573fcc8567a4bbdca18ad50265f3.tar.bz2 |
- Patch #31354 by Junyor et al: move node revision information for files to a separate table. (Today's critical bugfix #1.)
Diffstat (limited to 'modules/upload')
-rw-r--r-- | modules/upload/upload.module | 140 |
1 files changed, 85 insertions, 55 deletions
diff --git a/modules/upload/upload.module b/modules/upload/upload.module index fc296d6df..5961add23 100644 --- a/modules/upload/upload.module +++ b/modules/upload/upload.module @@ -210,6 +210,7 @@ function upload_nodeapi(&$node, $op, $arg) { $node->list[$key] = $file->list; } } + if (($file = file_check_upload('upload')) && user_access('upload files')) { global $user; @@ -319,19 +320,12 @@ function upload_nodeapi(&$node, $op, $arg) { upload_save($node); } break; - case 'delete revision': - $node->files = upload_load($node); - foreach ($node->files as $file) { - // Check any other revisions pointing to file first. - if( db_result(db_query("SELECT COUNT(fid) FROM {files} WHERE fid = %d", $file->fid)) == 1 ) { - file_delete($file->filepath); - } - } - db_query("DELETE FROM {files} WHERE vid = %d", $node->vid); - break; case 'delete': upload_delete($node); break; + case 'delete revision': + upload_delete_revision($node); + break; case 'search result': return $node->files ? format_plural(count($node->files), '1 attachment', '%count attachments') : null; case 'rss item': @@ -363,65 +357,74 @@ function upload_nodeapi(&$node, $op, $arg) { * @param $uid * The integer user id of a user. * @return - * The ammount of disk space used by the user in bytes. + * The amount of disk space used by the user in bytes. */ function upload_space_used($uid) { - return db_result(db_query('SELECT SUM(f.filesize) FROM {files} f INNER JOIN {node_revisions} n ON f.vid = n.vid WHERE uid = %d', $uid)); + return db_result(db_query('SELECT SUM(filesize) FROM {files} f INNER JOIN {node} n ON f.nid = n.nid WHERE n.uid = %d', $uid)); } /** * Determine how much disk space is occupied by uploaded files. * * @return - * The ammount of disk space used by uploaded files in bytes. + * The amount of disk space used by uploaded files in bytes. */ function upload_total_space_used() { - return db_result(db_query('SELECT SUM(f.filesize) FROM {files} f INNER JOIN {node_revisions} n ON f.vid = n.vid')); + return db_result(db_query('SELECT SUM(filesize) FROM {files}')); } function upload_save($node) { - $node->files = upload_load($node); + $node->old_files = isset($node->files) ? $node->files : array(); upload_nodeapi($node, 'validate', NULL); - foreach ((array)$node->files as $key => $file) { - if ($file->source && !$file->remove) { - // Clean up the session: - unset($_SESSION['file_uploads'][$file->source]); + $node->files = $node->old_files + $node->files; - // Insert new files: - if ($file = file_save_upload($file, $file->filename)) { - $fid = db_next_id('{files}_fid'); - db_query("INSERT INTO {files} (fid, nid, vid, filename, filepath, filemime, filesize, list, description) VALUES (%d, %d, %d, '%s', '%s', '%s', %d, %d, '%s')", - $fid, $node->nid, $node->vid, $file->filename, $file->filepath, $file->filemime, $file->filesize, $node->list[$key], $node->description[$key]); - } - } - } - // Remove existing files, as needed - foreach ((array)$node->remove as $key => $value) { - if ($node->remove[$key]) { - $file = db_fetch_object(db_query('SELECT * FROM {files} WHERE vid = %d AND fid = %d', $node->vid, $key)); - db_query('DELETE FROM {files} WHERE fid = %d AND vid = %d', $key, $node->vid); - // We only delete a file if it isn't used anymore by any revision. - $count = db_result(db_query('SELECT COUNT(fid) FROM {files} WHERE fid = %d', $key)); - if (!($count > 0)) { - file_delete($file->filepath); + foreach ((array)$node->files as $key => $file) { + // New file upload + if ($file->source) { + // Only add a file if it's not marked for removal + if (!$node->remove[$key]) { + if ($file = file_save_upload($file, $file->filename)) { + $fid = db_next_id('{files}_fid'); + db_query("INSERT INTO {files} (fid, nid, filename, filepath, filemime, filesize) VALUES (%d, %d, '%s', '%s', '%s', %d)", $fid, $node->nid, $file->filename, $file->filepath, $file->filemime, $file->filesize); + db_query("INSERT INTO {file_revisions} (fid, vid, list, description) VALUES (%d, %d, %d, '%s')", $fid, $node->vid, $node->list[$key], $node->description[$key]); + } } + + // Clean up the session + unset($_SESSION['file_uploads'][$file->source]); } - } - // Create a new revision, as needed - if ($node->old_vid) { - foreach ((array)$node->remove as $key => $remove) { - if (!$remove && is_numeric($key)) { - $file = db_fetch_object(db_query('SELECT * FROM {files} WHERE vid = %d AND fid = %d', $node->old_vid, $key)); - db_query("INSERT INTO {files} (fid, nid, vid, filename, filepath, filemime, filesize, list, description) VALUES (%d, %d, %d, '%s', '%s', '%s', %d, %d, '%s')", - $key, $node->nid, $node->vid, $file->filename, $file->filepath, $file->filemime, $file->filesize, $node->list[$key], $node->description[$key]); + + // Update existing file + else { + // Remove existing file, as needed + if ($node->remove[$key]) { + db_query('DELETE FROM {file_revisions} WHERE fid = %d AND vid = %d', $key, $node->vid); + // Only delete a file if it isn't used by any revision + $count = db_result(db_query('SELECT COUNT(fid) FROM {file_revisions} WHERE fid = %d', $key)); + if ($count < 1) { + db_query('DELETE FROM {files} WHERE fid = %d', $key); + file_delete($file->filepath); + } } - } - } - // Update existing files, as needed - else { - foreach ((array)$node->list as $key => $value) { - if (!$node->remove[$key]) { - db_query('UPDATE {files} SET list = %d, description = \'%s\' WHERE fid = %d AND vid = %d', $node->list[$key], $node->description[$key], $key, $node->vid); + + else { + // Create a new revision, as needed + if ($node->old_vid && is_numeric($key)) { + // new revision + if (isset($node->list)) { + db_query("INSERT INTO {file_revisions} (fid, vid, list, description) VALUES (%d, %d, %d, '%s')", $key, $node->vid, $node->list[$key], $node->description[$key]); + } + + // copy of old revision + else { + db_query("INSERT INTO {file_revisions} (fid, vid, list, description) VALUES (%d, %d, %d, '%s')", $key, $node->vid, $file->list, $file->description); + } + } + + // Update existing revision + else { + db_query("UPDATE {file_revisions} SET list = %d, description = '%s' WHERE fid = %d AND vid = %d", $node->list[$key], $node->description[$key], $key, $node->vid); + } } } } @@ -430,11 +433,38 @@ function upload_save($node) { } function upload_delete($node) { - $node->files = upload_load($node); - foreach ($node->files as $file) { + $files = array(); + $result = db_query('SELECT * FROM {files} WHERE nid = %d', $node->nid); + while ($file = db_fetch_object($result)) { + $files[$file->fid] = $file; + } + + foreach ($files as $fid => $file) { + // delete all file revision information associated with the node + db_query('DELETE FROM {file_revisions} WHERE fid = %d', $fid); file_delete($file->filepath); } - db_query("DELETE FROM {files} WHERE nid = %d", $node->nid); + + // delete all files associated with the node + db_query('DELETE FROM {files} WHERE nid = %d', $node->nid); +} + +function upload_delete_revision($node) { + $files = upload_load($node); + + foreach ($files as $file) { + // check if the file will be used after this revision is deleted + $count = db_result(db_query('SELECT COUNT(fid) FROM {file_revisions} WHERE fid = %d', $file->fid)); + + // if the file won't be used, delete it + if ($count < 2) { + db_query('DELETE FROM {files} WHERE fid = %d', $file->fid); + file_delete($file->filepath); + } + } + + // delete the revision + db_query('DELETE FROM {file_revisions} WHERE vid = %d', $node->vid); } function _upload_form($node) { @@ -504,7 +534,7 @@ function upload_load($node) { $files = array(); if ($node->vid) { - $result = db_query("SELECT * FROM {files} WHERE vid = %d", $node->vid); + $result = db_query('SELECT * FROM {files} f INNER JOIN {file_revisions} r ON f.fid = r.fid WHERE r.vid = %d', $node->vid); while ($file = db_fetch_object($result)) { $files[$file->fid] = $file; } |