/*
ClientDao.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.event.cache.db;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import org.deviceconnect.android.event.Event;
import org.deviceconnect.android.event.cache.Utils;
import java.sql.Timestamp;
/**
* Clientテーブル用DAOクラス.
*
*
* @author NTT DOCOMO, INC.
*/
final class ClientDao implements ClientSchema {
/**
* Clientテーブル情報クラス.
*
* @author NTT DOCOMO, INC.
*
*/
static class Client {
/**
* ID.
*/
long mId;
/**
* アクセストークン.
*/
String mAccessToken;
/**
* オリジン.
*/
String mOrigin;
/**
* レシーバー.
*/
String mReceiver;
/**
* EventSessionの作成日.
*/
Timestamp mESCreateDate;
/**
* EventSessionの更新日.
*/
Timestamp mESUpdateDate;
}
/**
* Utilityクラスなのでprivate.
*/
private ClientDao() {
}
/**
* クライアントデータを登録する.
* SessionKey、Receiverが同じ場合はAccessTokenを更新する。
*
* @param db データベース操作オブジェクト
* @param event イベントデータ
* @return 登録出来た場合は登録時のIDを返す。重複している場合は登録済みのIDを返す。処理に失敗した場合は-1を返す。
*/
static long insert(final SQLiteDatabase db, final Event event) {
if (event == null) {
throw new IllegalArgumentException("Event is null.");
}
long result = -1L;
String receiver = event.getReceiverName();
if (receiver == null) {
receiver = "";
}
Cursor cursor = db.query(TABLE_NAME, new String[] {_ID}, ORIGIN + "=? AND " + RECEIVER + "=?",
new String[] {event.getOrigin(), receiver}, null, null, null);
if (cursor.getCount() == 0) {
ContentValues values = new ContentValues();
values.put(ACCESS_TOKEN, event.getAccessToken());
values.put(ORIGIN, event.getOrigin());
values.put(RECEIVER, receiver);
values.put(CREATE_DATE, Utils.getCurreTimestamp().getTime());
values.put(UPDATE_DATE, Utils.getCurreTimestamp().getTime());
result = db.insert(TABLE_NAME, null, values);
} else if (cursor.moveToFirst()) {
if (cursor.getColumnIndex(_ID) != -1) {
result = cursor.getLong(0);
// アクセストークンは更新されるので、重複の場合は常に新しいものにアップデートしておく
ContentValues values = new ContentValues();
values.put(ACCESS_TOKEN, event.getAccessToken());
values.put(UPDATE_DATE, Utils.getCurreTimestamp().getTime());
int count = db.update(TABLE_NAME, values, _ID + "=?", new String[]{"" + result});
if (count != 1) {
result = -1;
}
}
}
cursor.close();
return result;
}
/**
* 指定したセッションキーをもつデータを取得する.
*
* @param db データベース操作オブジェクト
* @param origin リクエスト元のオリジン
* @return マッチする行データ。無い場合はnullを返す。
*/
static Client[] getByOrigin(final SQLiteDatabase db, final String origin) {
Client[] result = null;
Cursor c = db.query(TABLE_NAME, new String[] {_ID, ORIGIN, ACCESS_TOKEN, RECEIVER}, ORIGIN + "=?",
new String[] {origin}, null, null, null);
if (c.moveToFirst()) {
int index = 0;
result = new Client[c.getCount()];
do {
if (c.getColumnIndex(_ID) != -1) {
Client data = new Client();
data.mId = c.getLong(0);
data.mOrigin = c.getString(1);
data.mAccessToken = c.getString(2);
data.mReceiver = c.getString(3);
result[index++] = data;
}
} while (c.moveToNext());
}
c.close();
return result;
}
/**
* IDから行データを取得する.
*
* @param db データベース操作オブジェクト
* @param id ID
* @return 見つかった場合は行のデータ、その他はnullを返す。
*/
static Client getById(final SQLiteDatabase db, final long id) {
Client result = null;
Cursor c = db.query(TABLE_NAME, new String[] {_ID, ORIGIN, ACCESS_TOKEN, RECEIVER},
_ID + "=?", new String[] {"" + id}, null, null, null);
if (c.moveToFirst()) {
result = new Client();
if (c.getColumnIndex(_ID) != -1) {
result.mId = c.getLong(0);
result.mOrigin = c.getString(1);
result.mAccessToken = c.getString(2);
result.mReceiver = c.getString(3);
}
}
c.close();
return result;
}
/**
* 指定されたAPIのパスとサービスIDに紐づく送り先のデータを取得する.
*
* @param db データベース操作オブジェクト
* @param event イベントデータ
* @return 見つかった場合は各行のデータ、その他はnullを返す。
*/
static Client[] getByAPIAndServiceId(final SQLiteDatabase db, final Event event) {
Client[] result = null;
StringBuilder sb = new StringBuilder();
String join = " INNER JOIN ";
String prepared = " = ? ";
String and = " AND ";
sb.append("SELECT c.");
sb.append(_ID);
sb.append(", c.");
sb.append(ORIGIN);
sb.append(", c.");
sb.append(ACCESS_TOKEN);
sb.append(", c.");
sb.append(RECEIVER);
sb.append(", es.");
sb.append(CREATE_DATE);
sb.append(", es.");
sb.append(UPDATE_DATE);
sb.append(" FROM ");
sb.append(ProfileSchema.TABLE_NAME);
sb.append(" as p");
sb.append(join);
sb.append(InterfaceSchema.TABLE_NAME);
sb.append(" as i ON p.");
sb.append(ProfileSchema._ID);
sb.append(" = i.");
sb.append(InterfaceSchema.P_ID);
sb.append(join);
sb.append(AttributeSchema.TABLE_NAME);
sb.append(" as a ON i.");
sb.append(InterfaceSchema._ID);
sb.append(" = a.");
sb.append(AttributeSchema.I_ID);
sb.append(join);
sb.append(EventDeviceSchema.TABLE_NAME);
sb.append(" as ed ON a.");
sb.append(AttributeSchema._ID);
sb.append(" = ed.");
sb.append(EventDeviceSchema.A_ID);
sb.append(join);
sb.append(DeviceSchema.TABLE_NAME);
sb.append(" as d ON ed.");
sb.append(EventDeviceSchema.D_ID);
sb.append(" = d.");
sb.append(DeviceSchema._ID);
sb.append(join);
sb.append(EventSessionSchema.TABLE_NAME);
sb.append(" as es ON es.");
sb.append(EventSessionSchema.ED_ID);
sb.append(" = ed.");
sb.append(EventDeviceSchema._ID);
sb.append(join);
sb.append(ClientSchema.TABLE_NAME);
sb.append(" as c ON es.");
sb.append(EventSessionSchema.C_ID);
sb.append(" = c.");
sb.append(ClientSchema._ID);
sb.append(" WHERE p.");
sb.append(ProfileSchema.NAME);
sb.append(prepared);
sb.append(and);
sb.append("i.");
sb.append(InterfaceSchema.NAME);
sb.append(prepared);
sb.append(and);
sb.append("a.");
sb.append(AttributeSchema.NAME);
sb.append(prepared);
sb.append(and);
sb.append("d.");
sb.append(DeviceSchema.SERVICE_ID);
sb.append(prepared);
String inter = (event.getInterface() == null) ? "" : event.getInterface();
String attr = (event.getAttribute() == null) ? "" : event.getAttribute();
String serviceId = (event.getServiceId() == null) ? "" : event.getServiceId();
String[] params = {event.getProfile(), inter, attr, serviceId};
Cursor c = db.rawQuery(sb.toString(), params);
if (c.moveToFirst()) {
int index = 0;
result = new Client[c.getCount()];
do {
if (c.getColumnIndex(_ID) != -1) {
Client data = new Client();
data.mId = c.getLong(0);
data.mOrigin = c.getString(1);
data.mAccessToken = c.getString(2);
data.mReceiver = c.getString(3);
long createTime = c.getLong(4);
long updateTime = c.getLong(5);
data.mESCreateDate = new Timestamp(createTime);
data.mESUpdateDate = new Timestamp(updateTime);
result[index++] = data;
}
} while (c.moveToNext());
}
c.close();
return result;
}
}