Sybase ASE Java sınıfı nasıl kullanılır, MD5 fonksiyonu nasıl eklenir
21 April 2008 – 3:03Sybase ASE’nin pek kullanılmayan özelliklerinden biri de Java sınıflarını çalıştırabilme özelliğidir. Sybase veritabanı sunucusuna Java sınıflarını kullanarak veri erişimi ve MD5 hesaplayabilme yeteneği ekleyeceğiz.
Sybase’de Java’nın özellikleri sınırlı bir kullanıma sahiptir. Kullanılan sanal makina Java 1.1 ile derlenmiş kodları çalıştırabilir. Bunun anlamı yüklenecek sınıfların 1.1 olarak derlenmiş olması gerektiğidir. Bu sanal makine içerisinde java.io paketi (GÇ fonksiyonları) kullanılamaz, Thread açılamaz, grafiksel gösterimler yapılamaz. Buna karşılık JDBC kullanılarak veriler değiştirilebilir ve tabii ki hesaplamalar yapılabilir.
İlk örneğimiz JDBC’nin üzerinde çalıştığı sunucuya bağlanması ile kullanımı. Bu sayede bir sorgu içerisinde kullanmak için normalde prosedür ve cursor kullanarak yapacağımız işlemleri daha basitleştirmiş oluyoruz:
public class Test {
public static java.sql.Timestamp sistemTarihi() throws java.sql.SQLException {
java.sql.Connection con = java.sql.DriverManager.getConnection("jdbc:default:connection");
java.sql.Statement stmt = con.createStatement("select sistemTarihi from sistemTablosu");
java.sql.ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return rs.getTimestamp(1);
}
return null;
}
Manyak Not: Bu sınıfta sadece URL değişimi yapıp Jconnect URL’i yazarsak başka bir sunucuya da bağlanabiliriz.
Yazdığımız kodu sunucuya önce derleyip, jar halinde yüklüyoruz. Yükleme işlemi tek tek sınıf halinde de yapılabilir. Derleme işini daha önce de belirttiğimiz gibi Java 1.1′e göre özel parametrelerle yapmamız gerekir. Jar haline getirme işi ise her zaman yaptığımız gibi:
javac.exe -source 1.3 -target 1.1 *.java
jar.exe cf0 test.jar Test.class
%SYBASE%\%SYBASE_OCS%\bin\instjava -STESTSERVER -Usa -P -Dtestdb -f test.jar -j test
Yazdığımız kodu sunucuya tanıtıyoruz:
create function sistemTarihi() returns datetime
called on null input nondeterministic exportable
language java parameter style java
external name 'Test.sistemTarihi()'
Bu tanımlama ile artık şu sorguyu yazabiliyoruz:
select * from islemler where islemTarihi = sistemTarihi()
Sybase ASE’ye statik bir fonksiyonu kullanmayı öğrendik. Şimdi ise durum bilgisi tutabilen bir sınıf yükleyeceğiz. Bu sayede istenilen sayıda veri üstüste eklenerek bir MD5 hesaplanabilecek.
İlk iş olarak Java 1.1 ile derlenebilen bir MD5 fonksiyonu bulmamız gerekiyor. Bunun için bir MD5 uygulaması indiriyoruz. Bu uygulama içerisinden MD5 ve MD5State sınıflarını kullanacağız. Bu sınıflardaki dosya okuma işlemlerini ve geri kalan sınıfları ise silebiliriz. Bu java dosyalarının aynı dizinde olduğunu düşünerek derleme, paketleme ve yüklemeyi yapıyoruz:
javac.exe -source 1.3 -target 1.1 *.java
jar.exe cf0 test.jar com/*
Bir sınıfı kullanmak için fonksiyonlarını tanımlamaya gerek yoktur. Hemen kullanabiliriz:
declare @md5 "com.twmacinta.util.MD5"
select @md5 = new "com.twmacinta.util.MD5"()
select @md5 = @md5>>"Update"('a')
select @md5>>Final()
Yukarıdaki kod a harfinin MD5 hesaplamasını yapıp select eder. Eğer MD5 hesaplamasını bir fonksiyon halinde yapmak istersek Test sınıfımıza bir metod ekleyerek bunu hesaplatabiliriz:
public static byte[] calcMD5(String s) {
MD5 md5 = new MD5();
md5.update(s)
return md5.Final();
}
Bu fonksiyonu sorgularımızda tanımlama yaparak ya da yapmayarak kullanabiliriz. Tanımlamazsak:
select convert(varchar(50), "Test".testString('aa'))
Bir SQL fonksiyonuna tanımlamak için ise:
create function MD5(s varchar(255)) returns varbinary(32)
called on null input deterministic exportable
language java parameter style java
external name 'Test.calcMD5(String)'
Son olrak referans olmak üzere Java sınıflarına karşılık gelen Sybase veri tiplerinin listesini çıkartalım:
| SQL type | Java type |
| char, varchar, text, nchar, nvarchar, unichar, univarchar, unitext |
String |
| numeric, decimal, money, smallmoney | java.math.BigDecimal |
| bigint, unsigned bigint, | java.math.BigInteger |
| bit | boolean |
| tinyint | byte |
| smallint | short |
| integer, unsigned smallint | int |
| unsigned int | long |
| real | float |
| float, double | double |
| date | java.sql.Date |
| time | java.sql.Time |
| datetime, smalldatetime | java.sql.Timestamp |
| binary, varbinary | byte[] |
| image | java.io.InputStream |
Yüklenilen jar sql üzerinden kaldırılabilir. Tanımladığımız fonksiyonları drop function ile sildikten sonra şu komut ile kaldırılabilir:
remove java jar test
MD5 hesaplamasını gerçekleştirdik ve Sybase’de henüz bulunmayan stored function özelliğini ekledik.
Manyak mutlu kodlamalar…
Vinnie