From ba781964f43bc131bc46c642efdedcda41658b69 Mon Sep 17 00:00:00 2001
From: Jared Hancock <jared@osticket.com>
Date: Thu, 9 Jan 2014 09:05:40 -0600
Subject: [PATCH] Rewrite %file table structure

Add `attrs` field for backend state information (multi-part migration,
multi-part upload, etc). Change `size` to be an integer rather than text
field. (Storage space will be about the same, but int makes more sense).
Size the `key` and `signature` for ~512 bits. The base64 encoding allows
6-bits per char. At 86 chars, we have 516 bits maximum space.
---
 include/upgrader/streams/core.sig             |  2 +-
 .../streams/core/934954de-f1ccd3bb.patch.sql  | 23 +++++++++++++++++++
 .../streams/core/ed60ba20-7e2017c8.patch.sql  | 19 ---------------
 setup/inc/streams/core/install-mysql.sql      | 10 ++++----
 4 files changed, 30 insertions(+), 24 deletions(-)
 create mode 100644 include/upgrader/streams/core/934954de-f1ccd3bb.patch.sql
 delete mode 100644 include/upgrader/streams/core/ed60ba20-7e2017c8.patch.sql

diff --git a/include/upgrader/streams/core.sig b/include/upgrader/streams/core.sig
index c285c35e5..6dad7bd6c 100644
--- a/include/upgrader/streams/core.sig
+++ b/include/upgrader/streams/core.sig
@@ -1 +1 @@
-756b22698b4f69d1aa3b51e5cbd917da
+f1ccd3bb620e314b0ae1dbd0a1a99177
diff --git a/include/upgrader/streams/core/934954de-f1ccd3bb.patch.sql b/include/upgrader/streams/core/934954de-f1ccd3bb.patch.sql
new file mode 100644
index 000000000..c6bb713e7
--- /dev/null
+++ b/include/upgrader/streams/core/934954de-f1ccd3bb.patch.sql
@@ -0,0 +1,23 @@
+/**
+ * @version v1.8.1
+ * @signature f1ccd3bb620e314b0ae1dbd0a1a99177
+ * @title Pluggable Storage Backends
+ *
+ * This patch will allow attachments to be stored outside the database (like
+ * on the filesystem)
+ */
+
+ALTER TABLE `%TABLE_PREFIX%file`
+    ADD `bk` CHAR(1) NOT NULL DEFAULT 'D' AFTER `ft`,
+    -- RFC 4288, Section 4.2 declares max MIMEType at 255 ascii chars
+    CHANGE `type` `type` varchar(255) collate ascii_general_ci NOT NULL default '',
+    CHANGE `size` `size` BIGINT(20) NOT NULL DEFAULT 0,
+    CHANGE `hash` `key` VARCHAR(86) COLLATE ascii_general_ci,
+    ADD `signature` VARCHAR(86) COLLATE ascii_bin AFTER `key`,
+    ADD `attrs` VARCHAR(255) AFTER `name`,
+    ADD INDEX (`signature`);
+
+-- Finished with patch
+UPDATE `%TABLE_PREFIX%config`
+    SET `value` = 'f1ccd3bb620e314b0ae1dbd0a1a99177'
+    WHERE `key` = 'schema_signature' AND `namespace` = 'core';
diff --git a/include/upgrader/streams/core/ed60ba20-7e2017c8.patch.sql b/include/upgrader/streams/core/ed60ba20-7e2017c8.patch.sql
deleted file mode 100644
index cbf4e9d06..000000000
--- a/include/upgrader/streams/core/ed60ba20-7e2017c8.patch.sql
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * @version v1.8.1
- * @signature ee1f4b2752ee7b4be24a4d9dfe96185a
- * @title Pluggable Storage
- *
- * This patch will allow attachments to be stored outside the database (like
- * on the filesystem)
- */
-
-ALTER TABLE `%TABLE_PREFIX%file`
-    ADD `bk` CHAR(1) NOT NULL DEFAULT 'D' AFTER `ft`,
-    CHANGE `hash` `key` VARCHAR(125) COLLATE ascii_general_ci,
-    ADD `signature` VARCHAR(125) COLLATE ascii_bin AFTER `key`,
-    ADD INDEX (`signature`);
-
--- Finished with patch
-UPDATE `%TABLE_PREFIX%config`
-    SET `value` = 'ee1f4b2752ee7b4be24a4d9dfe96185a'
-    WHERE `key` = 'schema_signature' AND `namespace` = 'core';
diff --git a/setup/inc/streams/core/install-mysql.sql b/setup/inc/streams/core/install-mysql.sql
index 3cc30e3f1..4b51a63c9 100644
--- a/setup/inc/streams/core/install-mysql.sql
+++ b/setup/inc/streams/core/install-mysql.sql
@@ -318,11 +318,13 @@ CREATE TABLE `%TABLE_PREFIX%file` (
   `id` int(11) NOT NULL auto_increment,
   `ft` CHAR( 1 ) NOT NULL DEFAULT  'T',
   `bk` CHAR( 1 ) NOT NULL DEFAULT  'D',
-  `type` varchar(255) NOT NULL default '',
-  `size` varchar(25) NOT NULL default '',
-  `key` varchar(125) collate ascii_general_ci NOT NULL,
-  `signature` varchar(125) collate ascii_bin NOT NULL,
+  -- RFC 4288, Section 4.2 declares max MIMEType at 255 ascii chars
+  `type` varchar(255) collate ascii_general_ci NOT NULL default '',
+  `size` bigint(20) unsigned NOT NULL default 0,
+  `key` varchar(86) collate ascii_general_ci NOT NULL,
+  `signature` varchar(86) collate ascii_bin NOT NULL,
   `name` varchar(255) NOT NULL default '',
+  `attrs` varchar(255),
   `created` datetime NOT NULL,
   PRIMARY KEY  (`id`),
   KEY `ft` (`ft`),
-- 
GitLab