Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

DbSimple: устаревшие сообщения. (Дмитрий Котеров)
Author Message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Dec 12, 2006 5:29 pm ()
   Post subject:
Reply with quote


М

Выделено из темы «DbSimple v2.x: лаконичная работа с различными СУБД»,
расположенной в форуме Конструктор (13 Января 2007, 15:43).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Dec 12, 2006 5:29 pm (спустя 1 секунду; написано за 1 минуту 24 секунды)
   Post subject:
Reply with quote

Кстати, если кто хочет помочь сделать "урезанную" версию статьи - по той же схеме, что и www.greaterscope.net/project/dbSimple - это очень приветствуется. Я думаю, расширенный вариант статьи тоже сохранится, но через отдельную ссылку. А этот будет открываться по умолчанию, в том числе на английском.
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Dec 15, 2006 2:16 pm (спустя 2 дня 20 часов 47 минут; написано за 2 минуты 9 секунд)
   Post subject:
Reply with quote

symbix
Ну можно конечно и так.
Обработка ошибок идет, если не прошел execute или fetch. Возможно и логичнее проверять заранее.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sat Dec 16, 2006 6:31 pm (спустя 1 день 4 часа 14 минут; написано за 2 минуты 56 секунд)
   Post subject:
Reply with quote

Сделал и то и другое. Но на сайт пока не выкладывал.

version 2.20:
- support for ARRAY_KEY* (multi-col grouping)
- test suite

Александр Шустов
Попробуйте новую версию у себя, dklab.ru/wsvn/lib/trunk/lib/DbSimple/?op=dl&rev=0&isdir=1
Там есть поддержка ARRAY_KEY*. Пример запросов:
Code (php): скопировать код в буфер обмена
$DB->query("CREATE TABLE test(id INTEGER, pid INTEGER, str TEXT)");
$DB->query("INSERT INTO test(id, pid, str) VALUES(100, 10, 'a')");
$DB->query("INSERT INTO test(id, pid, str) VALUES(101, 10, 'b')");
$DB->query("INSERT INTO test(id, pid, str) VALUES(200, 20, 'x')");
$DB->query("INSERT INTO test(id, pid, str) VALUES(201, 20, 'y')");
printr($DB->query("SELECT id AS ARRAY_KEY_2, pid AS ARRAY_KEY_1, str FROM test ORDER BY id"));
printr($DB->query("SELECT NULL AS ARRAY_KEY_2, pid AS ARRAY_KEY_1, str FROM test ORDER BY id"));
Результат:
Code (any language): скопировать код в буфер обмена
Query: 'SELECT id AS ARRAY_KEY_2, pid AS ARRAY_KEY_1, str FROM test ORDER BY id'
array (
  10 =>
  array (
    100 =>
    array (
      'str' => 'a',
    ),
    101 =>
    array (
      'str' => 'b',
    ),
  ),
  20 =>
  array (
    200 =>
    array (
      'str' => 'x',
    ),
    201 =>
    array (
      'str' => 'y',
    ),
  ),
)
Query: 'SELECT NULL AS ARRAY_KEY_2, pid AS ARRAY_KEY_1, str FROM test ORDER BY id'
array (
  10 =>
  array (
    0 =>
    array (
      'str' => 'a',
    ),
    1 =>
    array (
      'str' => 'b',
    ),
  ),
  20 =>
  array (
    0 =>
    array (
      'str' => 'x',
    ),
    1 =>
    array (
      'str' => 'y',
    ),
  ),
)
Это то, что Вы хотели? Если да, тогда я выкладываю в RELEASE.
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Sun Dec 17, 2006 3:44 am (спустя 9 часов 12 минут; написано за 1 минуту 50 секунд)
   Post subject:
Reply with quote

symbix wrote:
да, еще заменил ARRAY_KEY и FOREIGN_KEY на ловеркейсы, ибо неудобно в кавычках писать, а без кавычек pg ловеркейсит, но это уже мелочи.
Исправил этот недочет (а также pg_last_error после prepare). Качайте версию 2.21

Пока автоматически кавычатся только служебные алиасы.
Осталось приводить все поля к закавыченным алиасам и кавычить алиасы, если в оных встречается хотя бы одна буква в верхнем регистре.
Back to top
View user's profile Send private message
symbix
Guest





Карма: 388
   поощрить/наказать


PostPosted: Sun Dec 17, 2006 3:23 pm (спустя 11 часов 39 минут; написано за 5 минут 36 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT], спасибо!

Еще такой момент тут обнаружился. Конструкция ?a в update запросах крайне удобна, но, к сожалению, для insert into ничего подобного нет (mysql-расширение синтаксиса insert into table set) postgresql, к сожалению, не поддерживает).

Пока придумал такое решение:
Code (any language): скопировать код в буфер обмена
--- Generic.php.orig        2006-12-15 19:28:00.000000000 +0300
+++ Generic.php        2006-12-17 15:12:57.849648000 +0300
@@ -704,7 +704,7 @@
               |
             (?>
                 # Placeholder
-                (\?) ( [_dsafn\#]? )                           #2 #3
+                (\?) ( [_dsafni\#]? )                           #2 #3
             )
         }sx';
         $query = preg_replace_callback(
@@ -744,6 +744,7 @@
             // First process guaranteed non-native placeholders.
             switch ($type) {
                 case 'a':
+                case 'i':
                     if (!$value) $this->_placeholderNoValueFound = true;
                     if (!is_array($value)) return 'DBSIMPLE_ERROR_VALUE_NOT_ARRAY';
                     $parts = array();
@@ -751,12 +752,18 @@
                         $v = $v === null? 'NULL' : $this->escape($v);
                         if (!is_int($k)) {
                             $k = $this->escape($k, true);
-                            $parts[] = "$k=$v";
+                            if ($type == 'i')
+                                $parts[$k] = $v;
+                            else
+                                $parts[] = "$k=$v";
                         } else {
                             $parts[] = $v;
                         }
                     }
-                    return join(", ", $parts);
+                    if ($type == 'i')
+                        return '(' . join(', ', array_keys($parts)) . ') VALUES (' . join(', ', $parts) . ')';
+                    else
+                        return join(", ", $parts);
                 case "#":
                     // Identifier.
                     return $this->escape($value, true);
То есть добавил плейсхолдер ?i ("i" - от insert), пример: $DB->query('insert into test ?i', array('i'=>1)).
Правда, что-то на ugly hack это смахивает :) Но в целом, вынос такого функционала в Generic мне кажется вполне оправданным, так как стандарт предусматривает только такую форму записи insert into.
Back to top
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Sun Dec 17, 2006 10:56 pm (спустя 7 часов 32 минуты; написано за 59 секунд)
   Post subject:
Reply with quote

Phoebus wrote:
Я уже давно себе переделал его, добавив проверку is_array: если массив, то квотим массив идентификаторов, разделяя запятой, если нет -- то стандартный квотинг строки.
Логично. +1 Вам.
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Sun Dec 17, 2006 11:27 pm (спустя 31 минуту; написано за 38 секунд)
   Post subject:
Reply with quote

DbSimple2 version 2.22:
 - added array support in ?# placeholder

Пользуйтесь (-;
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sun Dec 17, 2006 11:45 pm (спустя 18 минут; написано за 6 минут 16 секунд)
   Post subject:
Reply with quote

symbix wrote:
пример: $DB->query('insert into test ?i', array('i'=>1)).
Мне кажется, это не очень хорошее решение. Тут в форуме много обсуждалось насчет того, чтобы сделать в ?# поддержку массивов. Тогда INSERT-запрос будет записываться так:
Code (php): скопировать код в буфер обмена
$data = array (www.php.net/array)('i' => 1);
$DB->query('insert into test(?#) values(?a)', array_keys (www.php.net/array_keys)($data), array_values (www.php.net/array_values)($data))
Это хоть и длиннее, зато значительно более читабельно: SQL-запрос не изменяется структурно (placeholder-ы предназначены не для того, чтобы менять структуру запроса, а для того, чтобы подставлять значения). К тому же не нужно добавлять дополнительный placeholder (это большое преимущество, ибо простота).

Опа. Костя уже его сделал, супер!
Константин Жинько [tIT] wrote:
Исправил этот недочет (а также pg_last_error после prepare). Качайте версию 2.21
Пока автоматически кавычатся только служебные алиасы.

М

А вот это, я считаю, опрометчиво. Просьба на будущее - любые серьезные архитектурные изменения вначале обсуждать со мной. Все-таки я автор библиотеки и ее главный идеолог. :-)

Возможно, более концептуально было бы просто сделать сравнение со служебными алиасами без учета регистра в Generic. Тем более, что ARRAY_KEY-поля сейчас и так выискиваются полным перебором (из-за ARRAY_KEY*). Добавить такое же выискивание для PARENT_KEY не составило бы особого труда. Вполне можно заложиться за то, что в таблицах не будет полей с именами "array_key" и "parent_key".
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Mon Dec 18, 2006 12:57 am (спустя 1 час 12 минут; написано за 4 секунды)
   Post subject:
Reply with quote

Внимание: в Subversion-репозитории версии теперь указываются в формате:

@version 2.x $Id: Generic.php 59 2006-12-17 21:16:54Z dk $

Версия в данном случае - 2.x, ревизия 59. Старые номера версий теперь не поддерживаются. Чтобы узнать версию файла, смотрите $Id: ... $ в этом файде.
Back to top
View user's profile Send private message Send e-mail
Александр Шустов
Заглянувший



Joined: 18 Sep 2006
Posts: 16
Карма: 0
   поощрить/наказать

Location: Москва

PostPosted: Mon Dec 18, 2006 3:59 am (спустя 3 часа 1 минуту; написано за 1 минуту 57 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Это то, что Вы хотели? Если да, тогда я выкладываю в RELEASE.
Да, это именно то, что я хотел.
Поставил, вариант библиотеки, приведенной по ссылке, в своих запросах заменил только PRIMARY_KEY и PARENT_KEY на ARRAY_KEY_*, все работает, деревья стыкуются правильно.
Код посмотрел, вроде все на месте.

По поводу выноса в будущем данной функциональности в отдельное место: мне кажется, что место этих вещей как раз в ядре библиотеки, ведь как вы сами говорили это не очередная библиотека для абстракции от БД, а библиотека для лаконичной работы с БД. По сути ARRAY_KEY и, например, selectCol идеологически есть одно и тоже - реструктуризация результата запроса, возвращенного БД. Вообщем мне кажется, что сейчас все на своих местах.

массивы в ?# - отлично, теперь полностью отпала необходимость в DbSimple с собственными добавлениями, - все есть в оригинальной версии (-:
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Dec 22, 2006 12:58 pm (спустя 4 дня 8 часов 59 минут; написано за 28 секунд)
   Post subject:
Reply with quote

Исправлен баг в кэшировании (Generic.php). Советую обновиться.
Back to top
View user's profile Send private message
chin
Участник форума



Joined: 23 Feb 2005
Posts: 312
Карма: 26
   поощрить/наказать

Location: Украина, Киев

PostPosted: Wed Jan 03, 2007 6:33 pm (спустя 12 дней 5 часов 34 минуты; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

PHP Version 5.1.6
Code (php): скопировать код в буфер обмена
/**
 * @version 2.x $Id: Generic.php 67 2006-12-25 16:52:34Z tit $
 */
Quote:
Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of preg_match(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in .../includes/DbSimple/Generic.php on line 533
Quote:
Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in .../includes/DbSimple/Generic.php on line 543
Так надо? (:
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Thu Jan 04, 2007 4:53 pm (спустя 22 часа 19 минут; написано за 22 секунды)
   Post subject:
Reply with quote

fixed
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Jan 09, 2007 1:21 am (спустя 4 дня 8 часов 27 минут)
   Post subject:
Reply with quote

Внимание! Библиотека вынесена в отдельный svn-модуль. Правильный путь теперь:
dklab.ru/wsvn/lib/DbSimple/trunk/
svn://dklab.ru/lib/DbSimple/trunk

Выход каждой новой стабильной версии сопровождается созданием тэга в
dklab.ru/wsvn/lib/DbSimple/tags/
(например, dklab.ru/wsvn/lib/DbSimple/tags/2.30/)

Если линкуетесь по svn:externals, линкуйтесь лучше на один из тэгов.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Jan 10, 2007 12:21 am (спустя 23 часа 40 секунд; написано за 1 минуту 33 секунды)
   Post subject:
Reply with quote

Написал сокращенную версию статьи, перевел ее также на английский. Она теперь умолчательная: dklab.ru/lib/DbSimple/
Также завел аккаунты на phpclasses.org и freshmeat.net (кстати, для JsHttpRequest тоже). Попробую за рубежом раскрутить библиотеку...
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Wed Jan 10, 2007 11:09 am (спустя 10 часов 47 минут; написано за 1 минуту 10 секунд)
   Post subject:
Reply with quote

Чай, за славой гоняесся? (-;
Почитал русскую версию - ошибок почти нет. То, что нашел, по орфусу отправил.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Jan 10, 2007 11:12 am (спустя 3 минуты; написано за 1 минуту 4 секунды)
   Post subject:
Reply with quote

Скорее уж за деньгами тогда (PageRank ~ деньги). :-) Рунет - это всего-то 7% от всего Интернета, надоело в песочнице сидеть.
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Wed Jan 10, 2007 11:25 am (спустя 12 минут; написано за 2 минуты 12 секунд)
   Post subject:
Reply with quote

Только что обнаружил, что в комментариях Generic слово "Contains" начинается с русской буквы "С". Почему-то очень меня это развеселило )))
Обнови годы копирайта. Ну если меня еще как-нибудь добавишь туда же, буду признателен (-;
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Jan 12, 2007 10:51 am (спустя 1 день 23 часа 26 минут; написано за 1 минуту 18 секунд)
   Post subject:
Reply with quote

Почти Windows =))))))
Джоэл Спольски wrote:
Они сообщили это разработчикам Windows, которые дизассемблировали SymCity, шаг за шагом в дебаггере найдя ошибку, и добавили специальный код, проверяющий наличие SymCity в памяти и запускающий распределитель памяти в специальном режиме, в котором SymCity разрешается использовать память после ее освобождения.
Back to top
View user's profile Send private message
AlexK
Заглянувший



Joined: 24 Nov 2006
Posts: 4
Карма: 0
   поощрить/наказать


PostPosted: Sat Jan 13, 2007 12:25 am (спустя 13 часов 33 минуты; написано за 7 минут 5 секунд)
   Post subject: Что делать со слешами в dbSimple
Reply with quote

При работе с dbSimple, если в одно из полей таблицы идет запись строки типа O'reilly publishing, то в саму таблицу пишет строку O\'reilly publishing, т.е ставит перед кавычкой слеш.
Таким образом при выборке из БД соотв. значение необходимо дополнительно пропускать через stripslashes(). Что несовсем удобно.

Имеется ли возможность записи в таблицу текста без слешей?

Заранее спасибо!
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sat Jan 13, 2007 12:33 am (спустя 8 минут; написано за 47 секунд)
   Post subject:
Reply with quote

Это неправда. Скорее всего, Вы перепутали с magic_quotes_gpc, и слэш появляется в переменной значительно раньше. Используйте print_r для диагностики.
В DbSimple со слэшами все в поряде точно.
Back to top
View user's profile Send private message Send e-mail
AlexK
Заглянувший



Joined: 24 Nov 2006
Posts: 4
Карма: 0
   поощрить/наказать


PostPosted: Sat Jan 13, 2007 1:15 am (спустя 41 минуту; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote

Действительно перепутал. Отключил magic_quotes_gpc, все работает.
Спасибо :)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML