diff --git a/mod/glossary/sql.php b/mod/glossary/sql.php index 75279803fdb..d0e4b4de71c 100644 --- a/mod/glossary/sql.php +++ b/mod/glossary/sql.php @@ -11,42 +11,48 @@ /// Initialise some variables $sqlorderby = ''; - $sqlsortkey = NULL; - $textlib = textlib_get_instance(); /// Calculate the SQL sortkey to be used by the SQL statements later switch ( $sortkey ) { case "CREATION": $sqlsortkey = "timecreated"; - break; + break; case "UPDATE": $sqlsortkey = "timemodified"; - break; + break; case "FIRSTNAME": $sqlsortkey = "firstname"; - break; + break; case "LASTNAME": $sqlsortkey = "lastname"; - break; + break; } $sqlsortorder = $sortorder; + switch ($CFG->dbtype) { + case 'postgres7': + $as = 'as'; + break; + case 'mysql': + $as = ''; + break; + } + /// Pivot is the field that set the break by groups (category, initial, author name, etc) /// fullpivot indicate if the whole pivot should be compared agasint the db or just the first letter /// printpivot indicate if the pivot should be printed or not - $fullpivot = 1; $userid = ''; - if ( !empty($USER->id) ) { + if ( isset($USER->id) ) { $userid = "OR ge.userid = $USER->id"; } switch ($tab) { case GLOSSARY_CATEGORY_VIEW: if ($hook == GLOSSARY_SHOW_ALL_CATEGORIES ) { - $sqlselect = "SELECT gec.id AS cid, ge.*, gec.entryid, gc.name AS glossarypivot"; + $sqlselect = "SELECT gec.id, ge.*, gec.entryid, gc.name $as pivot"; $sqlfrom = "FROM {$CFG->prefix}glossary_entries ge, {$CFG->prefix}glossary_entries_categories gec, {$CFG->prefix}glossary_categories gc"; @@ -59,7 +65,7 @@ } elseif ($hook == GLOSSARY_SHOW_NOT_CATEGORISED ) { $printpivot = 0; - $sqlselect = "SELECT ge.*, concept AS glossarypivot"; + $sqlselect = "SELECT ge.*, concept $as pivot"; $sqlfrom = "FROM {$CFG->prefix}glossary_entries ge LEFT JOIN {$CFG->prefix}glossary_entries_categories gec ON ge.id = gec.entryid"; $sqlwhere = "WHERE (glossaryid = '$glossary->id' OR sourceglossaryid = '$glossary->id') AND @@ -71,7 +77,7 @@ } else { $printpivot = 0; - $sqlselect = "SELECT ge.*, ce.entryid, c.name AS glossarypivot"; + $sqlselect = "SELECT ge.*, ce.entryid, c.name $as pivot"; $sqlfrom = "FROM {$CFG->prefix}glossary_entries ge, {$CFG->prefix}glossary_entries_categories ce, {$CFG->prefix}glossary_categories c"; $sqlwhere = "WHERE ge.id = ce.entryid AND ce.categoryid = '$hook' AND ce.categoryid = c.id AND ge.approved != 0 AND @@ -84,20 +90,35 @@ break; case GLOSSARY_AUTHOR_VIEW: - $where = ''; - - if ( $sqlsortkey == 'firstname' ) { - $usernamefield = sql_fullname('u.firstname' , 'u.lastname'); - } else { - $usernamefield = sql_fullname('u.lastname' , 'u.firstname'); + if (!isset($sqlsortkey)) { + $sqlsortkey = NULL; } - $where = "AND " . sql_substr() . "(upper($usernamefield),1," . $textlib->strlen($hook) . ") = '" . $textlib->strtoupper($hook) . "'"; + $where = ''; + switch ($CFG->dbtype) { + case 'postgres7': + $usernametoshow = "u.firstname || ' ' || u.lastname"; + if ( $sqlsortkey == 'FIRSTNAME' ) { + $usernamefield = "u.firstname || ' ' || u.lastname"; + } else { + $usernamefield = "u.lastname || ' ' || u.firstname"; + } + $where = "AND substr(upper($usernamefield),1," . strlen($hook) . ") = '" . strtoupper($hook) . "'"; + break; + case 'mysql': + if ( $sqlsortkey == 'FIRSTNAME' ) { + $usernamefield = "CONCAT(CONCAT(u.firstname,' '), u.lastname)"; + } else { + $usernamefield = "CONCAT(CONCAT(u.lastname,' '), u.firstname)"; + } + $where = "AND left(ucase($usernamefield)," . strlen($hook) . ") = '$hook'"; + break; + } if ( $hook == 'ALL' ) { $where = ''; } - $sqlselect = "SELECT ge.*, $usernamefield AS glossarypivot, 1 AS userispivot "; + $sqlselect = "SELECT ge.id, $usernamefield $as pivot, u.id as uid, ge.*"; $sqlfrom = "FROM {$CFG->prefix}glossary_entries ge, {$CFG->prefix}user u"; $sqlwhere = "WHERE ge.userid = u.id AND (ge.approved != 0 $userid) @@ -109,12 +130,23 @@ $fullpivot = 0; $printpivot = 0; - $where = ''; - if ($hook != 'ALL' and $hook != 'SPECIAL') { - $where = 'AND ' . sql_substr() . '(upper(concept),1,' . $textlib->strlen($hook) . ') = \'' . $textlib->strtoupper($hook) . '\''; + if (!isset($sqlsortkey)) { + $sqlsortkey = NULL; } - $sqlselect = "SELECT ge.*, ge.concept AS glossarypivot"; + $where = ''; + if ($hook != 'ALL' and $hook != 'SPECIAL') { + switch ($CFG->dbtype) { + case 'postgres7': + $where = 'AND substr(upper(concept),1,' . strlen($hook) . ') = \'' . strtoupper($hook) . '\''; + break; + case 'mysql': + $where = 'AND left(ucase(concept),' . strlen($hook) . ") = '$hook'"; + break; + } + } + + $sqlselect = "SELECT ge.*, ge.concept $as pivot"; $sqlfrom = "FROM {$CFG->prefix}glossary_entries ge"; $sqlwhere = "WHERE (ge.glossaryid = '$glossary->id' OR ge.sourceglossaryid = '$glossary->id') AND ge.approved = 0 $where"; @@ -129,22 +161,29 @@ $printpivot = 0; case GLOSSARY_STANDARD_VIEW: default: - $sqlselect = "SELECT ge.*, ge.concept AS glossarypivot"; + $sqlselect = "SELECT ge.*, ge.concept $as pivot"; $sqlfrom = "FROM {$CFG->prefix}glossary_entries ge"; $where = ''; $fullpivot = 0; - $LIKE = sql_ilike(); - $NOTLIKE = 'NOT ' . $LIKE; + if ($CFG->dbtype == "postgres7") { + $LIKE = "ILIKE"; // case-insensitive + } else { + $LIKE = "LIKE"; + } switch ( $mode ) { case 'search': /// Some differences in syntax for PostgreSQL - if ($CFG->dbfamily == "postgres") { + if ($CFG->dbtype == "postgres7") { + $LIKE = "ILIKE"; // case-insensitive + $NOTLIKE = "NOT ILIKE"; // case-insensitive $REGEXP = "~*"; $NOTREGEXP = "!~*"; } else { + $LIKE = "LIKE"; + $NOTLIKE = "NOT LIKE"; $REGEXP = "REGEXP"; $NOTREGEXP = "NOT REGEXP"; } @@ -166,13 +205,6 @@ if ($definitionsearch) { $definitionsearch .= " AND "; } - - /// Under Oracle and MSSQL, trim the + and - operators and perform - /// simpler LIKE search - if ($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql') { - $searchterm = trim($searchterm, '+-'); - } - if (substr($searchterm,0,1) == "+") { $searchterm = substr($searchterm,1); $conceptsearch .= " ge.concept $REGEXP '(^|[^a-zA-Z0-9])$searchterm([^a-zA-Z0-9]|$)' "; @@ -241,7 +273,14 @@ case 'letter': if ($hook != 'ALL' and $hook != 'SPECIAL') { - $where = 'AND ' . sql_substr() . '(upper(concept),1,' . $textlib->strlen($hook) . ') = \'' . $textlib->strtoupper($hook) . '\''; + switch ($CFG->dbtype) { + case 'postgres7': + $where = 'AND substr(upper(concept),1,' . strlen($hook) . ') = \'' . strtoupper($hook) . '\''; + break; + case 'mysql': + $where = 'AND left(ucase(concept),' . strlen($hook) . ") = '" . strtoupper($hook) . "'"; + break; + } } if ($hook == 'SPECIAL') { //Create appropiate IN contents @@ -253,7 +292,14 @@ } $sqlalphabet .= '\''.$alphabet[$i].'\''; } - $where = 'AND ' . sql_substr() . '(upper(concept),1,1) NOT IN (' . $textlib->strtoupper($sqlalphabet) . ')'; + switch ($CFG->dbtype) { + case 'postgres7': + $where = 'AND substr(upper(concept),1,1) NOT IN (' . strtoupper($sqlalphabet) . ')'; + break; + case 'mysql': + $where = 'AND left(ucase(concept),1) NOT IN (' . strtoupper($sqlalphabet) . ')'; + break; + } } break; } @@ -275,12 +321,19 @@ } $count = count_records_sql("select count(*) $sqlfrom $sqlwhere"); - $limitfrom = $offset; - $limitnum = 0; + $sqllimit = ''; if ( $offset >= 0 ) { - $limitnum = $entriesbypage; + switch ($CFG->dbtype) { + case 'postgres7': + $sqllimit = " LIMIT $entriesbypage OFFSET $offset"; + break; + case 'mysql': + $sqllimit = " LIMIT $offset, $entriesbypage"; + break; + } } - $allentries = get_records_sql("$sqlselect $sqlfrom $sqlwhere $sqlorderby", $limitfrom, $limitnum); + $allentries = get_records_sql("$sqlselect $sqlfrom $sqlwhere $sqlorderby $sqllimit"); + ?>