четверг, 26 января 2012 г.
Oracle. Администрирование и разработка.: Деление на ноль? Легко!
Oracle. Администрирование и разработка.: Деление на ноль? Легко!: Q: can oracle divide by zero? A: no Q: are you absolutely sure? A: yes Q: then why does this work? select 1 from dual where exists (sel...
среда, 25 января 2012 г.
setEncoding для java.util.zip
Как известно у методов замечательного стандартного пакета java.util.zip нет возможности указывать кодировку файлов. И вообще для работы с архивами лучше ипользовать сторонние специализированные библиотеки, как например Apache Commons Compress.
Но, если код (или его часть) уже написаны под java.util.zip, то можно воспользоваться пакетом для работы с архивами, входящим в состав бинарников Apache Ant. В пакете org.apache.tools.zip содержаться классы аналогичные java.util.zip, но исправленные (в частности содержится setEncoding), практически все имена и методы классов совпадают.
1) Скачиваем последнюю версию бинарника Appache Ant;
2) Достаем из папки lib файл ant.jar;
3) "Выковыриваем" все "ненужные" нам пакеты из папки org, оставляем на месте только файлы в папке /org/apache/tools/zip;
4) Подключаем jar-файл к своему проекту вместо java.util.zip;
5) В моем коде пришлось только изменить метод Entries на getEntries;
6) Теперь при создании экземпляра ZipFile вторым параметром можно указать кодировку.
Вот небольшой пример:
Лично я использовал этот пакет в хранимых java процедурах Oracle, предварительно загрузив jar-файл в базу с помощью loadjava.
И, само собой, при распространении своей программы с использованием этой библиотеки не забываем о соблюдении условий, выдвигаемых лицензией Apache.
Но, если код (или его часть) уже написаны под java.util.zip, то можно воспользоваться пакетом для работы с архивами, входящим в состав бинарников Apache Ant. В пакете org.apache.tools.zip содержаться классы аналогичные java.util.zip, но исправленные (в частности содержится setEncoding), практически все имена и методы классов совпадают.
1) Скачиваем последнюю версию бинарника Appache Ant;
2) Достаем из папки lib файл ant.jar;
3) "Выковыриваем" все "ненужные" нам пакеты из папки org, оставляем на месте только файлы в папке /org/apache/tools/zip;
4) Подключаем jar-файл к своему проекту вместо java.util.zip;
5) В моем коде пришлось только изменить метод Entries на getEntries;
6) Теперь при создании экземпляра ZipFile вторым параметром можно указать кодировку.
Вот небольшой пример:
import java.io.*;
import java.util.Enumeration;
import org.apache.tools.zip.*;
public class ZipUtil {
private static String ZIPENCODE = "CP866";
public static final void unzip(String extractFrom, String extractTo)
throws IOException {
File extractFromFile = new File(extractFrom);
File extractToFile = new File(extractTo);
ZipFile archive = new ZipFile( extractFromFile, ZIPENCODE);
Enumeration e = archive.getEntries();
while (e.hasMoreElements()) {
ZipEntry entry = (ZipEntry) e.nextElement();
File file = new File(extractToFile, entry.getName());
if (!entry.isDirectory()) {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
InputStream in = archive.getInputStream(entry);
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(file));
byte[] buffer = new byte[8192];
int read;
while (-1 != (read = in.read(buffer))) {
out.write(buffer, 0, read);
}
in.close();
out.close();
}
}
}
}
Лично я использовал этот пакет в хранимых java процедурах Oracle, предварительно загрузив jar-файл в базу с помощью loadjava.
И, само собой, при распространении своей программы с использованием этой библиотеки не забываем о соблюдении условий, выдвигаемых лицензией Apache.
вторник, 7 июня 2011 г.
Oracle: Выполнение команд ОС и обработка результатов
Этой теме посвещено много статей, но когда занялся сам, то встретился с трудностями получения и обработки кода ошибки (кода возврата) команды, поэтому опишу следующий вариант решения:
На просторах Интеренета (а именно здесь) нашел следующий код:
Меня вполне все устроило, заиcключением того, что проблематично получить код ошибки, возвращаемый при завершении работы программы.
В Windows строка Runtime.getRuntime().exec("echo %errorlevel%")
всегда вернет "0" (насколько я понял, из рантайма вообще невозможно работать с переменными окружения, из за того, что в разных системах доступ к ним осуществляется по разному).
Поискав дальше нашел статью.
Т.е. код возвата программы можно получить:
Код также будет работать и под Linux.
Данную процедуру можно переделать в функцию и возвращать результаты в выходном параметре.
На просторах Интеренета (а именно здесь) нашел следующий код:
try {
Process p = Runtime.getRuntime().exec("Команда ОС");
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}
}
catch (IOException e) {
System.out.println("exception happened - here's what I know:");
e.printStackTrace();
}
Программа выполняет команду, а затем считывает стандартный выходной поток и поток ошибок.Меня вполне все устроило, заиcключением того, что проблематично получить код ошибки, возвращаемый при завершении работы программы.
В Windows строка Runtime.getRuntime().exec("echo %errorlevel%")
всегда вернет "0" (насколько я понял, из рантайма вообще невозможно работать с переменными окружения, из за того, что в разных системах доступ к ним осуществляется по разному).
Поискав дальше нашел статью.
Т.е. код возвата программы можно получить:
System.out.println(p.exitValue());Теперь оформим в виде хранимой процедуры Oracle:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "os_execute" AS
import java.io.*;
public class os_execute {
public static void main() throws IOException {
String s = null;
try {
Process p = Runtime.getRuntime().exec("Команда ОС");
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}
System.out.println(p.exitValue());
}
catch (IOException e) {
System.out.println("exception happened - here's what I know:");
e.printStackTrace();
}
}
}
Таким образом на терминале отобразится текст, возвращаемый командной строкой, и код ошибки.Код также будет работать и под Linux.
Данную процедуру можно переделать в функцию и возвращать результаты в выходном параметре.
воскресенье, 5 июня 2011 г.
Удаление связанных таблиц ORACLE
При необходимсоти массового удаления таблиц возникают проблемы из-за многочисленных связей между ними.
Данный скрипт решает эту проблему, удаляя сначала внешние ключи, уникальные индексы и чеккеры, затем первичные ключи, а затем и сами таблицы.
Данный скрипт решает эту проблему, удаляя сначала внешние ключи, уникальные индексы и чеккеры, затем первичные ключи, а затем и сами таблицы.
set serveroutput on;
begin
for i in (select * from all_constraints where table_name in ('t1', 't2') and constraint_type in ('U','C','R')) loop
dbms_output.put_line('alter table ' || i.table_name || ' drop constraint ' || i.constraint_name || ';');
end loop;
for i in (select * from all_constraints where table_name in ('t1', 't2') and constraint_type = 'P') loop
dbms_output.put_line('alter table ' || i.table_name || ' drop constraint ' || i.constraint_name || ';');
end loop;
for i in (select * from all_tables where table_name in ('t1', 't2') loop
dbms_output.put_line('drop table ' || i.table_name || ';');
end loop;
end;
воскресенье, 13 февраля 2011 г.
Install Postgresql-9.0 on Ubuntu
Добавим новый источник postgresql:
Обновим список пакетов:
Установка postgresql:
и Pgadmin'а:
Чтобы открыть доступ для сетевых подключений в файле:
и в фале:
Я настроил так:
Т.е. доступ по сети только для указанного IP, для любого пользователя, к любой бд и без пароля.
запуск сервера:
Каталог с конфигурационными файлами: /etc/postgresql/9.0/main
Каталог по умолчанию с пользовательскими данными: /var/lib/postgresql/9.0/main
На основании статей
Installing PostgreSQL 9.0 on Ubuntu 10.04
Install PostgreSQL on Ubuntu 9.04/9.10
И личного опыта:)
sudo add-apt-repository ppa:pitti/postgresql
Обновим список пакетов:
sudo apt-get update
Установка postgresql:
sudo apt-get install postgresql-9.0 postgresql-client postgresql-contrib
и Pgadmin'а:
sudo apt-get install pgadmin3
Чтобы открыть доступ для сетевых подключений в файле:
sudo gedit /etc/postgresql/9.0/main/postgresql.confизменяем:
#listen_addresses = 'localhost'на:
listen_addresses = '*'
и в фале:
sudo gedit /etc/postgresql/9.0/main/pg_hba.confуказываем параметры подключений pg_hba.conf
Я настроил так:
# TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.1.49/32 trust
Т.е. доступ по сети только для указанного IP, для любого пользователя, к любой бд и без пароля.
запуск сервера:
sudo /etc/init.d/postgresql startперезапуск:
sudo /etc/init.d/postgresql restartостановка:
sudo /etc/init.d/postgresql stop
Каталог с конфигурационными файлами: /etc/postgresql/9.0/main
Каталог по умолчанию с пользовательскими данными: /var/lib/postgresql/9.0/main
На основании статей
Installing PostgreSQL 9.0 on Ubuntu 10.04
Install PostgreSQL on Ubuntu 9.04/9.10
И личного опыта:)
четверг, 27 января 2011 г.
Zend: отображение ошибок приложения
При возникновении ошибок, Zend по умолчанию выводит скупую фразу:
An error occurred Application errorЧтобы на экране была видна детальная информаця об ошибках, необходимо в application.ini в нужном блоке (у нас это testing) указать:
[testing : production] resources.frontController.params.displayExceptions = 1И незабыть в htacces показать, что мы хотим использовать именно этот блок:
SetEnv APPLICATION_ENV testing
Подписаться на:
Сообщения (Atom)