Răsfoiți Sursa

Support OCI (Create table)

Austin Huang 4 ani în urmă
părinte
comite
6a489d35ab
1 a modificat fișierele cu 58 adăugiri și 13 ștergeri
  1. 58 13
      lib/Data/Database.php

+ 58 - 13
lib/Data/Database.php

@@ -572,7 +572,7 @@ class Database extends AbstractData
         );
         if (count($rows)) {
             foreach ($rows as $row) {
-                $pastes[] = $row['dataid'];
+                $pastes[] = $row[self::_sanitizeIdentifier('dataid')];
             }
         }
         return $pastes;
@@ -710,6 +710,18 @@ class Database extends AbstractData
         return $row ? $row[self::_sanitizeColumn('value')] : '';
     }
 
+    /**
+     * OCI cannot accept semicolons
+     *
+     * @access private
+     * @static
+     * @return string
+     */
+    private static function _getSemicolon()
+    {
+        return self::$_type === 'oci' ? "" : ";";
+    }
+
     /**
      * get the primary key clauses, depending on the database driver
      *
@@ -721,7 +733,7 @@ class Database extends AbstractData
     private static function _getPrimaryKeyClauses($key = 'dataid')
     {
         $main_key = $after_key = '';
-        if (self::$_type === 'mysql') {
+        if (self::$_type === 'mysql' || self::$_type === 'oci') {
             $after_key = ", PRIMARY KEY ($key)";
         } else {
             $main_key = ' PRIMARY KEY';
@@ -740,13 +752,13 @@ class Database extends AbstractData
      */
     private static function _getDataType()
     {
-        return self::$_type === 'pgsql' ? 'TEXT' : 'BLOB';
+        return self::$_type === 'pgsql' ? 'TEXT' : (self::$_type === 'oci' ? 'VARCHAR2(4000)' : 'BLOB');
     }
 
     /**
      * get the attachment type, depending on the database driver
      *
-     * PostgreSQL uses a different API for BLOBs then SQL, hence we use TEXT
+     * PostgreSQL and OCI use different APIs for BLOBs then SQL, hence we use TEXT and CLOB
      *
      * @access private
      * @static
@@ -754,7 +766,21 @@ class Database extends AbstractData
      */
     private static function _getAttachmentType()
     {
-        return self::$_type === 'pgsql' ? 'TEXT' : 'MEDIUMBLOB';
+        return self::$_type === 'pgsql' ? 'TEXT' : (self::$_type === 'oci' ? 'CLOB' : 'MEDIUMBLOB');
+    }
+
+    /**
+     * get the meta type, depending on the database driver
+     *
+     * OCI can't even accept TEXT so it has to be VARCHAR2(200)
+     *
+     * @access private
+     * @static
+     * @return string
+     */
+    private static function _getMetaType()
+    {
+        return self::$_type === 'oci' ? 'VARCHAR2(4000)' : 'TEXT';
     }
 
     /**
@@ -768,6 +794,7 @@ class Database extends AbstractData
         list($main_key, $after_key) = self::_getPrimaryKeyClauses();
         $dataType                   = self::_getDataType();
         $attachmentType             = self::_getAttachmentType();
+        $metaType                   = self::_getMetaType();
         self::$_db->exec(
             'CREATE TABLE ' . self::_sanitizeIdentifier('paste') . ' ( ' .
             "dataid CHAR(16) NOT NULL$main_key, " .
@@ -776,12 +803,26 @@ class Database extends AbstractData
             'expiredate INT, ' .
             'opendiscussion INT, ' .
             'burnafterreading INT, ' .
-            'meta TEXT, ' .
+            "meta $metaType, " .
             "attachment $attachmentType, " .
-            "attachmentname $dataType$after_key );"
+            "attachmentname $dataType$after_key )" . self::_getSemicolon()
         );
     }
 
+    /**
+     * get the nullable text type, depending on the database driver
+     *
+     * OCI will pad CHAR columns with spaces, hence VARCHAR2
+     *
+     * @access private
+     * @static
+     * @return string
+     */
+    private static function _getParentType()
+    {
+        return self::$_type === 'oci' ? 'VARCHAR2(16)' : 'CHAR(16)';
+    }
+
     /**
      * create the paste table
      *
@@ -792,19 +833,21 @@ class Database extends AbstractData
     {
         list($main_key, $after_key) = self::_getPrimaryKeyClauses();
         $dataType                   = self::_getDataType();
+        $parentType                 = self::_getParentType();
+        $attachmentType             = self::_getAttachmentType();
         self::$_db->exec(
             'CREATE TABLE ' . self::_sanitizeIdentifier('comment') . ' ( ' .
             "dataid CHAR(16) NOT NULL$main_key, " .
             'pasteid CHAR(16), ' .
-            'parentid CHAR(16), ' .
-            "data $dataType, " .
+            "parentid $parentType, " .
+            "data $attachmentType, " .
             "nickname $dataType, " .
             "vizhash $dataType, " .
-            "postdate INT$after_key );"
+            "postdate INT$after_key )" . self::_getSemicolon()
         );
         self::$_db->exec(
-            'CREATE INDEX IF NOT EXISTS comment_parent ON ' .
-            self::_sanitizeIdentifier('comment') . '(pasteid);'
+            'CREATE INDEX comment_parent ON ' .
+            self::_sanitizeIdentifier('comment') . '(pasteid)' . self::_getSemicolon()
         );
     }
 
@@ -817,9 +860,11 @@ class Database extends AbstractData
     private static function _createConfigTable()
     {
         list($main_key, $after_key) = self::_getPrimaryKeyClauses('id');
+        $charType                   = self::$_type === 'oci' ? 'VARCHAR2(16)' : 'CHAR(16)';
+        $textType                   = self::$_type === 'oci' ? 'VARCHAR2(4000)' : 'TEXT';
         self::$_db->exec(
             'CREATE TABLE ' . self::_sanitizeIdentifier('config') .
-            " ( id CHAR(16) NOT NULL$main_key, value TEXT$after_key );"
+            " ( id $charType NOT NULL$main_key, value $textType$after_key )" . self::_getSemicolon()
         );
         self::_exec(
             'INSERT INTO ' . self::_sanitizeIdentifier('config') .