Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Драйвер PosgreSQL (sources)


Автор: vegaua 19.12.2012, 12:54
Добрый день. Стоит задача "подпилить" postgresql драйвер для работы с через jdeveloper(что бы сущности, созданные в среде oracle корректно заливались в базу postgres).
Вопрос: какой класс в сорцах porsgres driver отвечает за создание sql запроса?

Автор: tzirechnoy 19.12.2012, 13:13
За создание sql-запроса в драйверах postgresql отвечает приложэние и программист, которые этот драйвер используют.
Драйверов postgresql, кстати, заметно более одного, под разные языки в первую очередь. Ну, поскольку протокол простенький -- вот и наделали.

Автор: LSD 19.12.2012, 13:19
Цитата(vegaua @  19.12.2012,  13:54 Найти цитируемый пост)
Стоит задача "подпилить" postgresql драйвер для работы с через jdeveloper(что бы сущности, созданные в среде oracle корректно заливались в базу postgres).

О как, а синтаксический анализатор для разбора Oracle SQL синтаксиса у вас еже готов? smile

Автор: vegaua 19.12.2012, 13:23
Цитата(LSD @ 19.12.2012,  13:19)
О как, а синтаксический анализатор для разбора Oracle SQL синтаксиса у вас еже готов? smile

уже готов. а какое значение он имеет сейчас? это уже следующий шаг.

Добавлено через 6 минут и 13 секунд
Цитата(tzirechnoy @ 19.12.2012,  13:13)
Драйверов postgresql, кстати, заметно более одного, под разные языки в первую очередь.

не наблюдал классификации драйверов postgresql по языкам, если можно - ссылочку.
использую драйвер postgresql-jdbc-9.0-802

Автор: LSD 19.12.2012, 14:09
Цитата(vegaua @  19.12.2012,  14:23 Найти цитируемый пост)
а какое значение он имеет сейчас?

Это 30% работы, еще 60% это трансформация синтаксического дерева и 10% генерация SQL кода для Посгреса и написание своего врапера над двайвером.

Автор: vegaua 19.12.2012, 14:57
Цитата(LSD @ 19.12.2012,  14:09)
Цитата(vegaua @  19.12.2012,  14:23 Найти цитируемый пост)
а какое значение он имеет сейчас?

Это 30% работы, еще 60% это трансформация синтаксического дерева и 10% генерация SQL кода для Посгреса и написание своего врапера над двайвером.

 smile

Добавлено через 21 секунду
Вижу, что Вы хорошо вникли в суть проблемы, но помочь не можете или не хотите

Автор: LSD 19.12.2012, 15:26
Цитата(vegaua @  19.12.2012,  15:57 Найти цитируемый пост)
Вижу, что Вы хорошо вникли в суть проблемы, но помочь не можете или не хотите

Я вник в проблему настолько насколько позволило описание проблемы. А вот вы не хотите понять простую вещь, что драйвер синтаксический разбор запросов не производит, это делает сервер. И не разбираясь в теме, лезть руками в драйвер совершенно не стоит.
Ну а раз у вас уже готов код по преобразованию запросов из диалекта Oracle  в диалек PostgreSQL, то написать враппер обертку над драйвером PostgreSQL не составит труда. Берете http://docs.oracle.com/javase/6/docs/technotes/guides/jdbc/ создаете свою реализацию которая будет деленировать вызовы к реальному драйверу, по пути подменяя запросы.

Автор: vegaua 19.12.2012, 15:51
Цитата(LSD @ 19.12.2012,  15:26)
Я вник в проблему настолько насколько позволило описание проблемы. А вот вы не хотите понять простую вещь, что драйвер синтаксический разбор запросов не производит, это делает сервер. И не разбираясь в теме, лезть руками в драйвер совершенно не стоит.
Ну а раз у вас уже готов код по преобразованию запросов из диалекта Oracle  в диалек PostgreSQL, то написать враппер обертку над драйвером PostgreSQL не составит труда. Берете http://docs.oracle.com/javase/6/docs/technotes/guides/jdbc/ создаете свою реализацию которая будет деленировать вызовы к реальному драйверу, по пути подменяя запросы.

Зачем делать обертку над драйвером, если есть возможность дописать код внутри него? В классе AbstractJdbc2Statement есть метод parseSql в котором и происходит синтаксический разбор.

Автор: Zloxa 19.12.2012, 19:40
Цитата(vegaua @  19.12.2012,  16:51 Найти цитируемый пост)
 в котором и происходит синтаксический разбор. 

Синтаксический разбор, запросов, как правило, производится таки на сервере а не на клиенте (на стороне которого работает драйвер).  Может быть, конечно, на клиенте реализуется какой никакой препарсинг с целью разделить стайтменты, подставить макроподстановки... трансформировать в конце концов запрос в диалект платформы. Но на сервер отдается именно запрос. И указанный вами метод, скорее всего, и делает это - передает запрос серверу, и слушает его ответ. Потому таки первый вопрос - вопрос трансформации запросов с диалекта PG в диалект оракле. Задача мутная, рутинная и бесперспективная.

Автор: LSD 20.12.2012, 11:59
Цитата(vegaua @  19.12.2012,  16:51 Найти цитируемый пост)
Зачем делать обертку над драйвером, если есть возможность дописать код внутри него?

1. Проще локализовывать ошибки.
2. Можно спокойно обновлять драйвер не трогая враппер.
3. Хоть вы этого и не понимаете, но задача преобразования запросов из диалекта Oracle в диалект PostgreSQL, очень нетривиальна (разумеется если речь идет о полной поддержке синтаксиса, а не замене VARCHAR2 на VARCHAR). И требует много кода, не говоря уж про усилия по реализации.



Цитата(vegaua @  19.12.2012,  16:51 Найти цитируемый пост)
В классе AbstractJdbc2Statement есть метод parseSql в котором и происходит синтаксический разбор.

Очень странно, что человек который смог реализовать синтаксический анализатор для Oracle SQL, не смог понять что метод просто ищет закрывающую скобку в строке (там даже это написано в комментарии smile ) и используется для простого преобразования эскейп последовательностей.
Цитата
Filter the SQL string of Java SQL Escape clauses.

Currently implemented Escape clauses are those mentioned in 11.3
in the specification. Basically we look through the sql string for
{d xxx}, {t xxx}, {ts xxx}, {oj xxx} or {fn xxx} in non-string sql 
code. When we find them, we just strip the escape part leaving only
the xxx part.
So, something like "select * from x where d={d '2001-10-09'}" would
return "select * from x where d= '2001-10-09'".

Автор: vegaua 20.12.2012, 13:59
Цитата(LSD @ 20.12.2012,  11:59)
Хоть вы этого и не понимаете, но задача преобразования запросов из диалекта Oracle в диалект PostgreSQL, очень нетривиальна (разумеется если речь идет о полной поддержке синтаксиса, а не замене VARCHAR2 на VARCHAR). И требует много кода, не говоря уж про усилия по реализации.

ценят не по словам, а по делам

Автор: tzirechnoy 20.12.2012, 18:16
Цитата
не наблюдал классификации драйверов postgresql по языкам, если можно - ссылочку.


Я тожэ не наблюдал.

Но, как минимум, есть "основная" сишная libpq, на её основе построены дефолтные биндинги к dbi/perl и dbi/ruby, такжэ к хаскеллю, питону, тиклю. В тикле и питоне (как минимум) есть (в дополнение, если требуются) написанные биндинги на чистом тикле и питоне. Кстати, в питоне разнообразных адаптэров что-то вообще дофига разных. В common lispах есть и драйвер через биндинги к libpq, и чуть не два драйвера, написанных напрямую -- и не сказать, что какой-то один более дефолтный чем другой. Единственный известный мне jdbc-драйвер написан полностью на джаве.

Добавлено через 53 секунды
Ну и да, по сути Вам ужэ ответили (притом на два вопроса). А именно: драйвер нигде не создаёт запрос, а если нужны преобразования в jdbc -- то напишыте обёртку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)