Index: database/database.mysql =================================================================== RCS file: /cvs/drupal/drupal/database/database.mysql,v retrieving revision 1.197 diff -u -r1.197 database.mysql --- database/database.mysql 14 Sep 2005 21:37:11 -0000 1.197 +++ database/database.mysql 18 Sep 2005 09:41:15 -0000 @@ -249,6 +249,18 @@ filepath varchar(255) NOT NULL default '', filemime varchar(255) NOT NULL default '', filesize int(10) unsigned NOT NULL default '0', + KEY vid (vid), + KEY fid (fid) +) TYPE=MyISAM; + +-- +-- Table structure for table 'files' +-- + +CREATE TABLE file_revisions ( + fid int(10) unsigned NOT NULL default '0', + nid int(10) unsigned NOT NULL default '0', + vid int(10) unsigned NOT NULL default '0', list tinyint(1) unsigned NOT NULL default '0', KEY vid (vid), KEY fid (fid) Index: database/database.pgsql =================================================================== RCS file: /cvs/drupal/drupal/database/database.pgsql,v retrieving revision 1.136 diff -u -r1.136 database.pgsql --- database/database.pgsql 14 Sep 2005 21:37:11 -0000 1.136 +++ database/database.pgsql 18 Sep 2005 09:41:06 -0000 @@ -245,12 +245,24 @@ filepath varchar(255) NOT NULL default '', filemime varchar(255) NOT NULL default '', filesize integer NOT NULL default '0', - list smallint NOT NULL default '0' ); CREATE INDEX files_fid_idx ON files(fid); CREATE INDEX files_vid_idx ON files(vid); -- +-- Table structure for table 'files' +-- + +CREATE TABLE file_revisions ( + fid integer NOT NULL default '0', + nid integer NOT NULL default '0', + vid integer NOT NULL default '0', + list smallint NOT NULL default '0' + PRIMARY KEY (fid), + PRIMARY KEY (vid) +); + +-- -- Table structure for table 'filter_formats' -- Index: database/updates.inc =================================================================== RCS file: /cvs/drupal/drupal/database/updates.inc,v retrieving revision 1.134 diff -u -r1.134 updates.inc --- database/updates.inc 14 Sep 2005 21:37:11 -0000 1.134 +++ database/updates.inc 18 Sep 2005 09:40:52 -0000 @@ -66,7 +66,8 @@ "2005-08-08" => "update_144", "2005-08-15" => "update_145", "2005-08-25" => "update_146", - "2005-09-07" => "update_147" + "2005-09-07" => "update_147", + "2005-09-18" => "update_148" ); function update_110() { @@ -811,6 +812,35 @@ return $ret; } +function update_148() { + $ret = array(); + + if ($GLOBALS['db_type'] == 'mysql') { + // create file_revisions table + $ret[] = update_sql("CREATE TABLE {file_revisions} AS SELECT nid, vid, fid, list FROM {files}"); + $ret[] = update_sql("ALTER TABLE {file_revisions} ADD PRIMARY KEY vid (vid)"); + $ret[] = update_sql("ALTER TABLE {file_revisions} ADD PRIMARY KEY fid (fid)"); + + // fix files table + $ret[] = update_sql("ALTER TABLE {files} DROP KEY vid"); + $ret[] = update_sql("ALTER TABLE {files} DROP KEY fid"); + $ret[] = update_sql("ALTER TABLE {files} ADD PRIMARY KEY fid (fid)"); + $ret[] = update_sql("ALTER TABLE {files} DROP nid"); + $ret[] = update_sql("ALTER TABLE {files} DROP vid"); + $ret[] = update_sql("ALTER TABLE {files} DROP list"); + } + else { + // create file_revisions table + $ret[] = update_sql("CREATE TABLE {file_revisions} AS SELECT nid, vid, fid, list FROM {files}"); + + // fix files table + $ret[] = update_sql("ALTER TABLE {files} DROP nid"); + $ret[] = update_sql("ALTER TABLE {files} DROP vid"); + $ret[] = update_sql("ALTER TABLE {files} DROP list"); + } + + return $ret; +} function update_sql($sql) { $edit = $_POST["edit"]; Index: modules/upload.module =================================================================== RCS file: /cvs/drupal/drupal/modules/upload.module,v retrieving revision 1.51 diff -u -r1.51 upload.module --- modules/upload.module 2 Sep 2005 02:11:41 -0000 1.51 +++ modules/upload.module 18 Sep 2005 09:50:46 -0000 @@ -320,7 +320,7 @@ * The ammount 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 {file_revisions} r ON f.fid = r.fid INNER JOIN {node} n ON r.nid = n.nid WHERE n.uid = %d', $uid)); } /** @@ -330,7 +330,7 @@ * The ammount 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) { @@ -342,33 +342,35 @@ // 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) VALUES (%d, %d, %d, '%s', '%s', '%s', %d, %d)", - $fid, $node->nid, $node->vid, $file->filename, $file->filepath, $file->filemime, $file->filesize, $node->list[$key]); + db_query("INSERT INTO {files} (fid, filename, filepath, filemime, filesize) VALUES (%d, '%s', '%s', '%s', %d)", + $fid, $file->filename, $file->filepath, $file->filemime, $file->filesize); + db_query("INSERT INTO {file_revisions} (fid, nid, vid, list) VALUES (%d, %d, %d, %d)", $fid, $node->nid, $node->vid, $node->list[$key]); } } } // Remove or update existing files: foreach ((array)$node->remove as $key => $value) { if ($node->remove[$key]) { - db_query('DELETE FROM {files} WHERE fid = %d AND vid = %d', $key, $node->vid); + db_query('DELETE FROM {file_revisions} 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)); + $count = db_result(db_query('SELECT COUNT(fid) FROM {file_revisions} WHERE fid = %d', $key)); if (!($count > 0)) { + db_query('DELETE FROM {files} WHERE fid = %d', $key); file_delete($file->filepath); } } } foreach ((array)$node->list as $key => $value) { if (!$node->remove[$key]) { - db_query('UPDATE {files} SET list = %d WHERE fid = %d AND vid = %d', $node->list[$key], $key, $node->vid); + db_query('UPDATE {file_revisions} SET list = %d WHERE fid = %d AND vid = %d', $node->list[$key], $key, $node->vid); } } if ($node->old_vid) { foreach ((array)$node->remove as $key => $remove) { if (!$remove) { - $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) VALUES (%d, %d, %d, '%s', '%s', '%s', %d, %d)", - $key, $node->nid, $node->vid, $file->filename, $file->filepath, $file->filemime, $file->filesize, $file->list); + $file = db_fetch_object(db_query('SELECT list FROM {file_revisions} WHERE vid = %d AND fid = %d', $node->old_vid, $key)); + db_query("INSERT INTO {file_revisions} (fid, nid, vid, list) VALUES (%d, %d, %d, %d)", + $key, $node->nid, $node->vid, $file->list); } } } @@ -380,7 +382,11 @@ foreach ($node->files as $file) { file_delete($file->filepath); } - db_query("DELETE FROM {files} WHERE nid = %d", $node->nid); + $result = db_query("SELECT fid FROM {file_revisions} WHERE nid = %d", $node->nid); + while ($file = db_fetch_object($result)) { + db_query("DELETE FROM {files} WHERE fid = %d", $file->fid); + db_query("DELETE FROM {file_revisions} WHERE nid = %d", $node->nid); + } } function upload_form($node) { @@ -428,7 +434,7 @@ $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; }