Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
hitmanzero
А если я вытаскиваю код объекта таким образом
i := sql_txt (sql_text);

      FOR i IN sql_text.FIRST .. sql_text.LAST
      LOOP
         -- !!!!!!
         v_code := v_code || sql_text (i);
      END LOOP;

Как мне считать версию из комментариев? Какой код вместо "!!!!!!" туда нужно вставить?
Я так думаю разработчик будет писать версию в виде "v.1.0.0.0" ?
Подскажите пожалуйста . не пойму просто как в этот цикл впихнуть выбор версии из комментария =(



Вышеизложенные предложения мне не очень подошли мне надо как нибудь проделать это всё с рег. выражениями
9 мар 10, 17:45    [8451219]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
hitmanzero,

проблема у Вас не в необходимости использования регулярных выражений, а в отсутствии условий. И лучший путь решения этой проблемы - административный. Нужно утвердить стандарт отражения версионности кода в этом самом коде и обязать разработчиков следовать этому стандарту. Пусть это будет "пятая строка с /*!!! ... !!!*/", заполняемая вручную, макрос, изменяемый хранилищем кода, ещё что-нибудь - но Вы должны быть уверены, что стандарт выполняется, и на основании этой уверенности уже искать поле, отвечающее за версию. Измените вопрос "Я так думаю разработчик будет писать версию в виде 'v.1.0.0.0'?" на утверждение "Наши разработчики всегда будут писать версию в виде xxx там-то." - и у Вас будет половина решения.

PS:
select ltrim(regexp_replace(' v..    1 2. 13. 14. 15   ', '[^[:digit:]\.]'), '.') from dual;
9 мар 10, 18:22    [8451432]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
suPPLer,

Разработчик будет точно писать каждую версию в виде
"v.цифра.цифра.цифра.цифра",
как и в этом коменте

/***************************************************************************************
 Назначение: Тестовый пакет рассчета 
 Модуль:     OV   
 
 Изменения:
 Версия    Дата     Автор, описание изменений
 ------ ----------  --------------------------------------------------------------------
 v.1.0.0.0  20.01.2010  Громыко А.А.
                                Создан макет пакета   
 v.1.0.0.1  11,02,2010  Петров С.А.
                                Вторая итерация разработки               
***************************************************************************************/

последняя версия ближе к концу комментария.
Только вопрос как раз остаётся в том как мне выбрать её из коммента
если код объекта (не только пакета) при его компиляции выбирается триггером таким образом
      
      i := sql_txt (sql_text);

      FOR i IN sql_text.FIRST .. sql_text.LAST
      LOOP
         v_code := v_code || sql_text (i);
      END LOOP;


v_code - это переменная CLOB содержащая код объекта.
v_ver - это переменная в которую мне надо запихнуть выбранную версию.

Вот вопрос именно состоит в том чтобы изменить этот цикл таким образом чтобы он выбирал последнюю версию которая ближе к концу комментария в том виде который показан выше.
16 мар 10, 11:41    [8484540]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
JaRo
Member

Откуда:
Сообщений: 1659
По-моему Вы занимаетесь фигней - если Вы заставляете разработчика жестко следовать правилам оформления комментария (лишний пробел или ещё чего - и у Вас Ваш алгоритм работать не будет), то, что мешает в это жесткое правило внести правило изменения определенной константы пакета?
16 мар 10, 11:56    [8484740]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
JaRo,

Это не я решаю. Такую задачу поставили передо мной вышестоящие лица.
16 мар 10, 11:58    [8484761]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
JaRo
Member

Откуда:
Сообщений: 1659
hitmanzero
JaRo,
Это не я решаю. Такую задачу поставили передо мной вышестоящие лица.
Ну так объясните им, что для решения разработчик и в том, и в другом случае будет жестко обязан следовать правилам. Но решение "выцарапать из комментария" - менее надежное.
16 мар 10, 12:13    [8484919]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
JaRo,

Говорил насчёт этого не раз. Но им нужен именно комментарий.
Я думал насчёт того что предлагал некий gpu. Но не удобно прописывать разработчику в каждом объекте процедуру.
16 мар 10, 12:22    [8485008]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
JaRo
Member

Откуда:
Сообщений: 1659
hitmanzero
Я думал насчёт того что предлагал некий gpu. Но не удобно прописывать разработчику в каждом объекте процедуру.
Процедура или просто константа в спецификации. Не вижу неудобства поменять одну цифирь для разработчика... Но если Вы хотите ненадежно, то в конце концов это Ваше дело.

Пишите "выдирание" : идете тем же FOR LOOP только с REVERSE. И кажду строку проверяете на regexp_instr(v, CHR(10)||' v.\d\.\d\.\d.\d '), например, ну и потом вырезаете. В каком-то приближении получите ответ.
16 мар 10, 12:27    [8485062]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
JaRo,

А можно пример кода как это всё будет выглядеть если не трудно?
16 мар 10, 12:41    [8485188]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
Просто я никак не могу придумать как бы выполнить эту задачу =(
16 мар 10, 14:31    [8486187]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
hitmanzero
Просто я никак не могу придумать как бы выполнить эту задачу =(

имхо, вам достаточно и советов и техники дали..
16 мар 10, 14:35    [8486221]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
JaRo
Member

Откуда:
Сообщений: 1659
hitmanzero
А можно пример кода как это всё будет выглядеть если не трудно?
А что именно непонятно?

ЗЫ: CHR(10) - это не надо, он на предыдущей строке будет.
16 мар 10, 14:35    [8486224]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
JaRo,

FOR i IN sql_text.FIRST .. sql_text.LAST
      LOOP
         if substr(sql_text (i), 1, 10) like '%.%.%.%' THEN
         v_ver := regexp_substr(sql_text (i),'v\.\d+\.\d+\.\d+');
         end if;
         v_code := v_code || sql_text (i);
      END LOOP;

Написал такой код, только он выбирает не последнюю версию а первую? Как мне определить номер строки, содержащей последнюю версию???
18 мар 10, 10:59    [8496086]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
JaRo
Member

Откуда:
Сообщений: 1659
hitmanzero

FOR i IN sql_text.FIRST .. sql_text.LAST
      LOOP
JaRo
идете тем же FOR LOOP только с REVERSE
18 мар 10, 11:22    [8496279]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
Так в этом коде какая то ошибка, только не могу понять какая.
Если я меняю в like меняю % на v как показано ниже то он вообще не выбирает версию...

FOR i IN sql_text.FIRST .. sql_text.LAST
      LOOP
         if substr(sql_text (i), 1, 10) like 'v.%.%.%' THEN
         v_ver := regexp_substr(sql_text (i),'v\.\d+\.\d+\.\d+');
         end if;
         v_code := v_code || sql_text (i);
      END LOOP;

И при таком коде он ищет версию первую версию именно в этой процедуре
CREATE OR REPLACE PROCEDURE OV_TEST.ov_Conctwostr_p(Str1 in Varchar2, Str2 in varchar2)  IS
/***************************************************************************************
 Назначение:  Тестовая процедура 1
 Модуль:     OV   
 
 Изменения:
 Версия    Дата     Автор, описание изменений
 ------ ----------  --------------------------------------------------------------------
 v.1.0.0  20.01.2010  Громыко А.А.
                    Создана процедура  
 v.1.0.1  18.03.2010  Громыко А.А. 
                    Тестовая версия            
***************************************************************************************/
BEGIN
  DBMS_OUTPUT.enable;
  DBMS_OUTPUT.put_line(Str1||' '||Str2);
END ov_Conctwostr_p;

А например в этой не ищет
CREATE OR REPLACE PROCEDURE OV_TEST.ov_firstfoursym_p(Str in varchar2) IS
/***************************************************************************************
 Назначение:  Тестовая процедура 2
 Модуль:     OV   
 
 Изменения:
 Версия    Дата     Автор, описание изменений
 ------ ----------  --------------------------------------------------------------------
 v.1.0.0  20.01.2010  Громыко А.А.
                    Создана процедура              
***************************************************************************************/
BEGIN
    Dbms_output.enable;
    dbms_output.put_line(LPad(str,4));
END ov_firstfoursym_p;
18 мар 10, 11:48    [8496524]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
JaRo
Member

Откуда:
Сообщений: 1659
hitmanzero
Так в этом коде какая то ошибка, только не могу понять какая.
Если я меняю в like меняю % на v как показано ниже то он вообще не выбирает версию...
У Вас первый сивол в строке не v, а пробел
18 мар 10, 11:56    [8496601]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
JaRo,

ну хорошо а почему она тогда ищёт только в той процедуре и то первую версию?
И ещё вопрос есть ли какой нить оператор типа fetch который может читать каждую строку из переменной v_code типа CLOB? Чтобы работать не с каждой строкой а с целым кодом? так проще будет)
18 мар 10, 12:01    [8496648]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
JaRo
Member

Откуда:
Сообщений: 1659
hitmanzero
ну хорошо а почему она тогда ищёт только в той процедуре
не должна. Проверьте ещё раз.
Собственно добавьте в свой триггер dbms_output.put_line и смотрите на то, что делает триггер
18 мар 10, 12:17    [8496783]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
После этого цикла добавил output почему то в той процедуре выводит значение v_ver = v.1.0.0 не последнее ,а в остальных не выводит.
Хотя когда смотрел output внутри цикла v_ver считало во всех процедурах
18 мар 10, 12:31    [8496906]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
JaRo
Member

Откуда:
Сообщений: 1659
hitmanzero
После этого цикла добавил output почему то в той процедуре выводит значение v_ver = v.1.0.0 не последнее ,а в остальных не выводит.
Хотя когда смотрел output внутри цикла v_ver считало во всех процедурах
По-моему Вам карты в руки, сейчас не особо понятно, что Вы в результате делаете и что проверяете.
18 мар 10, 12:38    [8496971]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
Ладно тогда такой вопрос...
Можно ли переписать этот код в каком нибудь более оптимальном виде?
Может выбирать версию после того как известен весь код( после цикла? ? Или ещё как нибудь?
18 мар 10, 12:51    [8497095]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
hitmanzero
Ладно тогда такой вопрос...
Можно ли переписать этот код в каком нибудь более оптимальном виде?
Может выбирать версию после того как известен весь код( после цикла? ? Или ещё как нибудь?


Ну так что? ни у кого нет вариантов?
18 мар 10, 13:59    [8497783]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
С этим я разобрался...
Осталось только одно:
когда компилируется пакет( тело и спецификация вместе), версия записана в комментарии спецификации и телу пакета должна присваиваться версия спецификации... Подскажите как реализовать это в коде
      FOR i IN sql_text.FIRST .. sql_text.LAST
      LOOP
         v_code := v_code || sql_text (i);
          if sql_text (i) like '%.%.%.%' THEN
         v_ver := regexp_substr(sql_text (i),'v\.\d+\.\d+\.\d+');
       end if;
      END LOOP;
18 мар 10, 15:27    [8498536]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
Fucker
Member [заблокирован]

Откуда:
Сообщений: 1525
По уму номер версии назначается системой контроля версий и пишется в требуемом формате в заголовочную часть файла с исходным кодом. Чуть ниже по тексту также автоматом формируется история изменений кода. Формируется она из текста, введенного кодером при фиксации изменения в svn.

В таких условиях мы гарантированно получим номер версии из строго определенной строки кода. В нашем случае это вторая строка с текстом примерно такого содержания:
/* $Header: OEXVSHPB.pls 115.138.11510.7 2005/01/18 09:46:40 rmoharan ship $ */
18 мар 10, 17:20    [8499781]     Ответить | Цитировать Сообщить модератору
 Re: Считывание версии из комментария  [new]
hitmanzero
Member

Откуда:
Сообщений: 121
я немного изменил код
      FOR i IN sql_text.FIRST .. sql_text.LAST
      LOOP
         v_code := v_code || sql_text (i);
      END LOOP;
      
               IF v_code LIKE '%.%.%.%'
         THEN
            v_ver := REGEXP_SUBSTR (v_code, 'v\.\d+\.\d+\.\d+');
         END IF;

только из кода это выражение возвращает первое совпадение!! Нельзя ли как нибудь исправить это регулярное выражение чтобы оно возвращало последнее совпадение???
18 мар 10, 17:34    [8499897]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
Все форумы / Oracle Ответить