PostgreSQL

Intellect Board — cистема управления сайтом

Построение сайта на основе форума

Intellect Board — cистема управления сайтом »   Техническая поддержка версии 2.18 »   PostgreSQL
RSS

PostgreSQL

Текущий рейтинг темы: Нет
Выводить сообщения
Правила раздела

<<Назад  Вперед>>Страницы: 1 2 3 4 5 ... 11 12 13 14 15 16 17 18
Модераторы: aerograf, wsx
Печать
 
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Блин, еще ошибка, надеюсь, последняя
-KoT- написал:
[q]
fulltext_idx @@ to_tsquery('$text') AND
[/q]
нужно: fulltext_idx @@ to_tsquery('$text2') AND
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
В дистрибутиве от 30 июня не исправлено или содержит ошибки в отношении к PostgreSQL:

файл photos.php строки 35-37, порядок перечисления таблиц, деление без NULLIF, должно быть  $sql = "SELECT t.*, ph.*, p2.p_uname AS u__name, p2.p_uid AS u_id, p2.p__time AS posttime, t__ratingsum/NULLIF(t__ratingcount,0) AS trating, tv.tid AS visited, t__pcount AS pcount, p1.p__time AS lastpost ".
  "FROM ".$GLOBALS['DBprefix']."Post p2, ".
  $GLOBALS['DBprefix']."Photo ph, ".$GLOBALS['DBprefix']."Post p1, ". $GLOBALS['DBprefix']."Topic t ".


moderate.php, строка 171 порядок перечисления таблиц, должно быть    $sql = "SELECT f_id FROM ".$GLOBALS['DBprefix']."Topic, ".$GLOBALS['DBprefix']."Forum ".строка 616, пропущена точка между AND fid=" и $GLOBALS['forum'];



misc.php, строка 105 имя таблицы, передаваемое в ф-цию db_match, должно заканчиваться точкой, должно быть    $sql = "SELECT t_id,t_title, ".db_match($GLOBALS['DBprefix']."Topic.",$modedata,$title,"t_title,t_descr")." FROM ".$GLOBALS['DBprefix']."Topic WHERE ".db_match2($GLOBALS['DBprefix']."Topic.",$modedata,$title,"t_title,t_descr").">0 $sqldata ORDER BY rel DESC";



search.php, строки 112-121 — так же не хватает точки, должно быть  if ($mode=="0") {
    $sql = "INSERT INTO ".$GLOBALS['DBprefix']."SearchResult (srid,srpid,relevancy) SELECT $id,p_id, ".db_match("p.",$modedata,$text,'p.p_text','p.p_title')." FROM ".$GLOBALS['DBprefix']."Forum f, ".$GLOBALS['DBprefix']."Topic t, ".$GLOBALS['DBprefix']."Post p ".
    "WHERE (".db_match2("p.",$modedata,$text,'p.p_text','p.p_title').">0) AND ($sqldata) AND p_tid=t_id AND t_fid=f_id AND p__premoderate=0 $timelimit $limit";
    $res=db_query($sql,$link);
  }
  else {
    $sql = "INSERT INTO ".$GLOBALS['DBprefix']."SearchResult (srid,srpid,relevancy) SELECT DISTINCT $id,t_id, SUM(".db_match("p.",$modedata,$text,'p.p_text','p.p_title').") FROM ".$GLOBALS['DBprefix']."Forum f, ".$GLOBALS['DBprefix']."Topic t, ".$GLOBALS['DBprefix']."Post p ".
    "WHERE (".db_match2("p.",$modedata,$text,'p.p_text','p.p_title').">0) AND ($sqldata) AND p_tid=t_id AND t_fid=f_id AND p__premoderate=0 $timelimit GROUP BY t_id $limit";
    $res=db_query($sql,$link);
  }
строки 159-160, не хватает точки, должно быть   $sql = "INSERT INTO ".$GLOBALS['DBprefix']."SearchResult (srid,srpid,relevancy) SELECT $id,t_id, SUM(".db_match("t.",$modedata,$text,'t.t_text','t.t_title').") FROM ".$GLOBALS['DBprefix']."Forum f, ".$GLOBALS['DBprefix']."Topic t, ".$GLOBALS['DBprefix']."Post p ".
  "WHERE (".db_match2("t.",$modedata,$text,'t.t_title','t.t_descr').">0) AND ($sqldata) AND t_fid=f_id AND t__pcount>0 AND p_tid=t_id AND p_id=t__startpostid $timelimit GROUP BY t_id $limit";




admin/stats.php: MOD(FLOOR(FLOAT(x)/y),z) в PostgreSQL не работает! Лучше оставить как было  elseif ($period=="wdays") $group1="MOD(FLOOR(uo_time/".(24*60*60)."),7)";
  elseif ($period=="hours") $group1="MOD(FLOOR((uo_time-".intval($GLOBALS['inuser']['u_timeregion']).")/".(60*60)."),24)";

  if (!$period || $period=="all") $group2="\"0\"";
  elseif ($period=="days") $group2="FLOOR((uo_lasttime-$starttime)/".(24*60*60).")";
  elseif ($period=="wdays") $group2="MOD(FLOOR(uo_lasttime/".(24*60*60)."),7)";
  elseif ($period=="hours") $group2="MOD(FLOOR((uo_lasttime-".intval($GLOBALS['inuser']['u_timeregion']).")/".(60*60)."),24)";
и вырезать FLOOR из MOD в pssql.php, соотвествующий preg_replace там есть.



admin/group.php, строка 181, REPLACE, должно быть        $sql = "DELETE FROM ".$GLOBALS['DBprefix']."UGroupAccess WHERE gid=\"$gid\" AND fid=\"".addslashes($curforum);
        $res = db_query($sql,$link);
        $sql = "INSERT INTO ".$GLOBALS['DBprefix']."UGroupAccess SET gid=\"$gid\", fid=\"".addslashes($curforum)."\", ga_level=\"".addslashes($curvalue)."\"";
        $res = db_query($sql,$link);




db/pssql.php, стока 133, неэкранированные кавычки ("100%"). Кроме того, при поиске вылетает ошибка на несуществующее поле "rel". Решение - добавить "AS rel" в ф-цию db_match:  return "rank(".$tab."fulltext_idx,to_tsquery('$text1')) AS rel";


Install.php в юникоде

С этими изменениями всё работает без ошибок.
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 3299
Рейтинг пользователя: 70


Ссылка


Дата регистрации на форуме:
29 сен. 2001
С FLOOR и MOD ситуацию решил следующим образом: вместо MOD(FLOOR(что-то там)) сделал FLOOR(MOD(что-то там)). Это работает одинаково как в MySQL, так и в PostgreSQL. А делать замену по предложенному тобой варианту я не хотел, т.к. это могло привести к тому, что мог бы исказиться текст сообщения, если бы он содержал этот самый MOD.
Сейчас все исправления внесены в дистрибутив и выложены. С UTF-8 возникали проблемы из-за того, что программа, которую я использую в качестве файл-менеджера, неправильно показывала кодировку: она при загрузке файла автоматически определяла ее как UTF-8, но при этом показывала, что стоит cp1251. Потом я его в другой программе перекодировал + провел пробную установку (в ходе которой выявил еще несколько мелких ошибок в install.php). Сейчас все наконец-то должно работать нормально.
Оффтопик: Но вообще, видимо, начиная со следующей версии придется вводить разделение на stable и under development версии.

---
Спорить со мной по поводу того, что в IntB будет, а чего нет -- бесполезно!
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006

XXXX Pro написал:
[q]
А делать замену по предложенному тобой варианту я не хотел, т.к. это могло привести к тому, что мог бы исказиться текст сообщения, если бы он содержал этот самый MOD.
[/q]

Да, я об этом не подумал. Тогда нужно убрать из pssql.php:  $query=preg_replace("/MOD\(FLOOR\(/is","MOD((",$query);
В photos.php NULLIF добавлен, но порядок перечисления таблиц в этом же запросе не исправлен, последней в FROM должна стоять Topic
В moderate.php строка 171 то же самое, последней должна быть .$GLOBALS['DBprefix']."Forum "

P.S. На следующей неделе, если выберу время, буду ставить форум на PostgreSQL для "боевого применения".
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 3299
Рейтинг пользователя: 70


Ссылка


Дата регистрации на форуме:
29 сен. 2001
Исправления внес, дистрибутив перевыложил... Надеюсь, это последние изменения...

---
Спорить со мной по поводу того, что в IntB будет, а чего нет -- бесполезно!
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Поставил с нуля, ничего не правил. Пока ошибок не замечено.
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Залил (пока на тестовый сервер в VMware — FreeBSD, Apache 2.2, PostgreSQL 8.1.4) backup с рабочей базы MySQL'а. Пока полет нормальный...
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Работающий backup для PostgreSQL:function db_backup($filename,$mode="f") {
    $link=$GLOBALS['link'];
    $open=$mode."open";
    $write=$mode."write";
    $close=$mode."close";
    $fh=call_user_func($open,$filename,"wb");
    $output.= "-- Dump of database ".$GLOBALS['DBname']." from forum \"".$GLOBALS['opt_title']."\"\n";
    $output.= "-- Time of dump: ".date("l, d F Y  G:i:s")."\n";
    $output.= "-- \n\n\n";
    
    $ddl="SELECT show_ddl_db()";
    $query=db_query($ddl,$link);
    while ($row=pg_fetch_row($query)) {
          $output .=  $row[0];
    }
    $output.="\n";
    call_user_func($write,$fh,$output);

    $tbl = db_table();
    $tablequery = db_query($tbl,$link);
    if (!$tablequery) error(MSG_e_dump_tables);
    while ($table=pg_fetch_row($tablequery)) {
      $output .= "\n\n-- Table ".$table[0]." data:\n";
      $query = pg_query("SELECT * FROM $table[0]");
      $count = pg_num_fields($query);
      while ($row=pg_fetch_row($query)) {
        unset($output);
        $output .= "INSERT INTO $table[0] VALUES (";
        for ($i=0; $i<$count; $i++) {
          if (isset($row[$i])) {
            if ($blobs[$table[0]][$i]==1) {
              $output .= "0x";
              $len=strlen($row[$i]);
              for ($j=0; $j<$len; $j++) $output.=dechex(ord($row[$i][$j]));
            }
            else {
              $row[$i]=str_replace("\n","\\n",mysql_real_escape_string($row[$i]));
              $output .= "'".$row[$i]."'";
            }
          } // WARNING!!!
          else $output .= "NULL";
          if ($i<($count-1)) { $output .= ","; }
        }
        $output .= ");\n";
        call_user_func($write,$fh,$output);
      }
    }
    call_user_func($close,$fh);
}

Для работы backup'а необходимо наличие в базе двух хранимых процедур, их текст в прикрепленном файле. Для их создания достаточно выполнить один запрос из АЦ.

Прикрепленный файл (fn_for_backup.txt, 3575 байт, скачан: 1243 раза)
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Забыл совсем — еще в pssql добавить функцию:function db_table() {
  return "SELECT pt.relname AS Name ".
"FROM pg_catalog.pg_class pt ".
"     LEFT JOIN pg_catalog.pg_roles r ON r.oid = pt.relowner ".
"     LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = pt.relnamespace ".
" WHERE pt.relkind IN ('r','') ".
"      AND pt.relname NOT LIKE ('pg_ts_%') ".
"      AND pn.nspname NOT IN ('pg_catalog', 'pg_toast') ".
"      AND pt.relname LIKE ('ib_%') ".
"      AND pg_catalog.pg_table_is_visible(pt.oid) ";
}

-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Опять поторопился... ib_ — это префикс моей тестовой базы. На самом деле эта строка должна быть:"      AND pt.relname LIKE ('".$GLOBALS['DBprefix']."%') ".Хотя, если в базу установлен только 1 форум, без этой строки вполне можно обойтись.
<<Назад  Вперед>>Страницы: 1 2 3 4 5 ... 11 12 13 14 15 16 17 18
Модераторы: aerograf, wsx
Печать
Intellect Board — cистема управления сайтом »   Техническая поддержка версии 2.18 »   PostgreSQL
RSS

1 посетитель просмотрел эту тему за последние 10 минут
В том числе: 1 гость, 0 скрытых пользователей

Последние RSS
Ограничение доступа
не отображаются разделы
Архив версий
Установка стиля на Intellect Board 2.22
Завершилась работа над новой версией 3.00

Самые активные 5 тем RSS


Время выполнения скрипта: 0.0571. Количество выполненных запросов: 17, время выполнения запросов 0.0000
Creative Commons License Rambler's Top100 Rambler's Top100 Рейтинг@Mail.ru Valid HTML 4.01 Transitional Valid CSS!