Извлечение операторов SQL из файлов Java/SQL

У меня огромная кодовая база, в которой много файлов JAVA и .sql. Я намерен извлечь все операторы SQL из всех этих файлов.

Вот как я намерен добиться этого -

  1. Создайте файл регулярного выражения, содержащий шаблоны, такие как выбор, вставка, удаление, обновление и т. д., которые я намереваюсь извлечь.
  2. Разбирать файлы построчно в кодовой базе и сопоставлять с Regex. Если совпадение найдено, зарегистрируйте строку кода, имя файла, шаблон и т. д.

Проблема возникает, когда SQL-запросы разбиты на несколько строк.

Я использую методы java.util.regex.Matcher и java.util.regex.Pattern для создания/сопоставления шаблонов регулярных выражений, когда я читаю строки с помощью Buffered Reader.

  pattern = Pattern.compile(regexString,Pattern.CASE_INSENSITIVE);
  .
  .
  matcher = pattern.matcher(lineBuffer.readline().trim());
  if( matcher.find()){
    //Do something
  }

Для многострочных операторов я должен искать терминатор строки ";" - если не найдено, я могу прочитать следующую строку и добавить вывод в совпадающую строку, чтобы он понимался как один запрос.

 while(!lineString.endsWith(";")) {
   lineString = lineString + lineBfr.readLine().trim();
 }

Есть ли лучший способ решить это требование, используя Pattern.MULTILINE или StreamBuffers, где я читаю весь файл в один буфер и продолжаю его обработку?


person Prasoon    schedule 24.10.2012    source источник


Ответы (3)


Вы можете воспользоваться преимуществами Apache Commons и их отличным методом FileUtils#readFileToString(файловый файл) .
Это в сочетании с Pattern.MULTILINE, о котором вы упомянули, кажется потенциально очень простым решением.

person Keppil    schedule 24.10.2012

Если ваш файл не содержит только операторов SQL в согласованном предсказуемом формате, я думаю, что анализ операторов SQL с помощью регулярных выражений окажется чрезвычайно сложным.

На первый взгляд это может показаться довольно простым, но существует множество особых случаев, с которыми приходится иметь дело.

  • Как насчет правильной обработки комментариев?
  • Как насчет слова SELECT или точки с запятой, содержащейся в строке?
  • Как насчет строковых экранирующих символов?

И так далее. Если вы не справитесь со всем этим, вы не сможете сделать даже такую ​​простую вещь, как получение всех утверждений.

Лучшим подходом было бы использование существующей библиотеки для разбора SQL за вас. В этом вопросе есть несколько хороших вариантов для Java: библиотека парсера SQL для Java

person dan1111    schedule 24.10.2012

Для файлов Java или, точнее, скомпилированных классов Java, я пытаюсь сделать что-то подобное, но я использую декомпилятор Java javap -verbose для поиска строк (типа Utf8), которые начинаются с select или которые иначе выглядят как операторы SQL.

Это незавершенная работа, и я сам сбиваюсь с толку, поэтому не могу опубликовать полное решение, но этого должно быть достаточно для построения.

person Menachem    schedule 25.06.2018