SQLJet (http://sqljet.com/) ise Java programlama dili içinden SQLite veritabanı oluşturma ve kullanma imkanı sunan, tamamen Java ile yazılmış, JDBC sürücüsü gerektirmeyen bir kütüphanedir.
Bu yazıda SQLJet ile ufak bir veritabanı uygulamasının nasıl çalışacağı aşağıda göreceğiniz JUnit test sınıfı içinde örneklenmiştir. Bu örnekte, log kayıtlarını veritabanında tutacak ve bu kayıtlara zaman bazlı hızlı erişim sunacak bir sistemin SQLJet ile gerçekleştirimi basit bir şekilde test edilmektedir.
package x.y.z.test;
import java.io.File;
import java.util.Date;
import org.junit.Test;
import org.tmatesoft.sqljet.core.SqlJetException;
import org.tmatesoft.sqljet.core.SqlJetTransactionMode;
import org.tmatesoft.sqljet.core.table.ISqlJetCursor;
import org.tmatesoft.sqljet.core.table.ISqlJetTable;
import org.tmatesoft.sqljet.core.table.SqlJetDb;
public class SQLJetTester {
private static final String DB_FILE_NAME = "/log-sqljet.db";
private static final String TABLE_LOG = "log";
private static final String TABLE_LOG_COL_TIMESTAMP = "timestamp";
private static final String TABLE_LOG_COL_MESSAGE = "message";
private Date startOfPeriod = null;
private Date endOfPeriod = null;
public SQLJetTester() {
}
@Test
public void queryTest() {
try {
SqlJetDb db = initDatabase();
if (db != null) {
db.beginTransaction(SqlJetTransactionMode.READ_ONLY);
ISqlJetTable table = db.getTable(TABLE_LOG);
ISqlJetCursor cursor = table.scope(table.getPrimaryKeyIndexName(), new Object[] { startOfPeriod.getTime() }, new Object[] { endOfPeriod.getTime() });
try {
System.out.printf("\nQuery results:\n");
while (!cursor.eof()) {
long timestamp = cursor.getInteger(TABLE_LOG_COL_TIMESTAMP);
String message = cursor.getString(TABLE_LOG_COL_MESSAGE);
System.out.printf("%s, %s\n", new Date(timestamp), message);
cursor.next();
}
} finally {
cursor.close();
db.commit();
}
}
} catch (SqlJetException e) {
e.printStackTrace();
}
}
@Test
public void cleanTest() {
try {
SqlJetDb db = initDatabase();
if (db != null) {
db.beginTransaction(SqlJetTransactionMode.WRITE);
ISqlJetTable table = db.getTable(TABLE_LOG);
ISqlJetCursor deleteCursor = table.scope(table.getPrimaryKeyIndexName(), new Object[] { Long.MIN_VALUE }, new Object[] { startOfPeriod.getTime() });
while (!deleteCursor.eof()) {
deleteCursor.delete();
}
deleteCursor.close();
db.commit();
db.beginTransaction(SqlJetTransactionMode.READ_ONLY);
ISqlJetCursor cursor = table.order(table.getPrimaryKeyIndexName());
try {
System.out.printf("\nQuery result after clean:\n");
while (!cursor.eof()) {
long timestamp = cursor.getInteger(TABLE_LOG_COL_TIMESTAMP);
String message = cursor.getString(TABLE_LOG_COL_MESSAGE);
System.out.printf("%s, %s\n", new Date(timestamp), message);
cursor.next();
}
} finally {
cursor.close();
db.commit();
}
}
} catch (SqlJetException e) {
e.printStackTrace();
}
}
// ---
private SqlJetDb initDatabase() {
File dbFile = new File(DB_FILE_NAME);
dbFile.delete();
try {
SqlJetDb db = SqlJetDb.open(dbFile, true);
db.beginTransaction(SqlJetTransactionMode.WRITE);
try {
String query = String.format("CREATE TABLE IF NOT EXISTS %s (%s INTEGER NOT NULL PRIMARY KEY, %s TEXT)", TABLE_LOG, TABLE_LOG_COL_TIMESTAMP, TABLE_LOG_COL_MESSAGE);
db.createTable(query);
} finally {
db.commit();
}
db.beginTransaction(SqlJetTransactionMode.WRITE);
try {
ISqlJetTable table = db.getTable(TABLE_LOG);
System.out.printf("\nInserting rows:\n");
for (int i = 0; i < 10; i++) {
Date date = new Date();
String message = "message-" + i;
System.out.printf("%s-%s\n", date.getTime(), message);
table.insert(date.getTime(), message);
if (i == 2) {
startOfPeriod = date;
} else if (i == 6) {
endOfPeriod = date;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
db.commit();
}
return db;
} catch (SqlJetException e) {
e.printStackTrace();
}
return null;
}
}
Bu test kodu içinde önce veritabanı yaratılmakta (varsa silinerek), sonra timestamp ve message kolonları içeren bir tablo yaratılmakta ve örnek kayıtlar eklenmektedir. Sonrasında iki test metodu, ilklenen bu veritabanı üzerinde şu işlemleri yapmaktadır:
- queryTest metodu iki tarih aralığı içindeki log mesajlarını getirir.
- queryClean metodu belirli bir tarihten önceki verilerin silinmesi işlevini test eder.
Inserting rows: 1305355900765-message-0 1305355900875-message-1 1305355900984-message-2 1305355901078-message-3 1305355901171-message-4 1305355901281-message-5 1305355901375-message-6 1305355901484-message-7 1305355901578-message-8 1305355901687-message-9 Query results: Sat May 14 09:51:40 EEST 2011, message-2 Sat May 14 09:51:41 EEST 2011, message-3 Sat May 14 09:51:41 EEST 2011, message-4 Sat May 14 09:51:41 EEST 2011, message-5 Sat May 14 09:51:41 EEST 2011, message-6 Inserting rows: 1305355901906-message-0 1305355902000-message-1 1305355902109-message-2 1305355902203-message-3 1305355902312-message-4 1305355902406-message-5 1305355902515-message-6 1305355902609-message-7 1305355902718-message-8 1305355902812-message-9 Query result after clean: Sat May 14 09:51:42 EEST 2011, message-3 Sat May 14 09:51:42 EEST 2011, message-4 Sat May 14 09:51:42 EEST 2011, message-5 Sat May 14 09:51:42 EEST 2011, message-6 Sat May 14 09:51:42 EEST 2011, message-7 Sat May 14 09:51:42 EEST 2011, message-8 Sat May 14 09:51:42 EEST 2011, message-9Linkler:

Hiç yorum yok:
Yorum Gönder