Support OCI (Create table)

pull/871/head
Austin Huang 2022-01-18 11:21:25 -05:00
parent ee99952d90
commit 6a489d35ab
No known key found for this signature in database
GPG Key ID: 84C23AA04587A91F
1 changed files with 58 additions and 13 deletions

View File

@ -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') .