/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2010 psiinon@gmail.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.parosproxy.paros.db.paros;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.parosproxy.paros.db.DatabaseException;
import org.parosproxy.paros.db.DbUtils;
import org.parosproxy.paros.db.RecordSessionUrl;
import org.parosproxy.paros.db.TableSessionUrl;
public class ParosTableSessionUrl extends ParosAbstractTable implements TableSessionUrl {
private static final String TABLE_NAME = "SESSION_URL";
private static final String URLID = "URLID";
private static final String TYPE = "TYPE";
private static final String URL = "URL";
private PreparedStatement psRead = null;
private PreparedStatement psInsert = null;
private CallableStatement psGetIdLastInsert = null;
private PreparedStatement psGetAlluRLSForType = null;
private PreparedStatement psDeleteUrls = null;
private PreparedStatement psDeleteAllUrlsForType = null;
public ParosTableSessionUrl() {
}
@Override
protected void reconnect(Connection conn) throws DatabaseException {
try {
if (!DbUtils.hasTable(conn, TABLE_NAME)) {
// Need to create the table
DbUtils.executeAndClose(
conn.prepareStatement("CREATE cached TABLE SESSION_URL (urlid bigint generated by default as identity (start with 1), type int not null, url varchar(8192) default '')"));
}
psRead = conn.prepareStatement("SELECT * FROM SESSION_URL WHERE " + URLID + " = ?");
psInsert = conn.prepareStatement("INSERT INTO SESSION_URL (" + TYPE + ","+ URL + ") VALUES (?, ?)");
psGetIdLastInsert = conn.prepareCall("CALL IDENTITY();");
psDeleteUrls = conn.prepareStatement("DELETE FROM SESSION_URL WHERE " + TYPE + " = ? AND " + URL + " = ?");
psDeleteAllUrlsForType = conn.prepareStatement("DELETE FROM SESSION_URL WHERE " + TYPE + " = ?");
psGetAlluRLSForType = conn.prepareStatement("SELECT * FROM SESSION_URL WHERE " + TYPE + " = ?");
} catch (SQLException e) {
throw new DatabaseException(e);
}
}
/* (non-Javadoc)
* @see org.parosproxy.paros.db.paros.TableSessionUrl#read(long)
*/
@Override
public synchronized RecordSessionUrl read(long urlId) throws DatabaseException {
try {
psRead.setLong(1, urlId);
try (ResultSet rs = psRead.executeQuery()) {
return build(rs);
}
} catch (SQLException e) {
throw new DatabaseException(e);
}
}
/* (non-Javadoc)
* @see org.parosproxy.paros.db.paros.TableSessionUrl#insert(int, java.lang.String)
*/
@Override
public synchronized RecordSessionUrl insert(int type, String url) throws DatabaseException {
try {
psInsert.setInt(1, type);
psInsert.setString(2, url);
psInsert.executeUpdate();
long id;
try (ResultSet rs = psGetIdLastInsert.executeQuery()) {
rs.next();
id = rs.getLong(1);
}
return read(id);
} catch (SQLException e) {
throw new DatabaseException(e);
}
}
/* (non-Javadoc)
* @see org.parosproxy.paros.db.paros.TableSessionUrl#delete(int, java.lang.String)
*/
@Override
public synchronized void delete(int type, String url) throws DatabaseException {
try {
psDeleteUrls.setInt(1, type);
psDeleteUrls.setString(2, url);
psDeleteUrls.executeUpdate();
} catch (SQLException e) {
throw new DatabaseException(e);
}
}
/* (non-Javadoc)
* @see org.parosproxy.paros.db.paros.TableSessionUrl#deleteAllUrlsForType(int)
*/
@Override
public synchronized void deleteAllUrlsForType(int type) throws DatabaseException {
try {
psDeleteAllUrlsForType.setInt(1, type);
psDeleteAllUrlsForType.executeUpdate();
} catch (SQLException e) {
throw new DatabaseException(e);
}
}
/* (non-Javadoc)
* @see org.parosproxy.paros.db.paros.TableSessionUrl#getUrlsForType(int)
*/
@Override
public synchronized List<RecordSessionUrl> getUrlsForType (int type) throws DatabaseException {
try {
psGetAlluRLSForType.setInt(1, type);
try (ResultSet rs = psGetAlluRLSForType.executeQuery()) {
List<RecordSessionUrl> result = new ArrayList<>();
while (rs.next()) {
result.add(new RecordSessionUrl(rs.getLong(URLID), rs.getInt(TYPE), rs.getString(URL)));
}
return result;
}
} catch (SQLException e) {
throw new DatabaseException(e);
}
}
private RecordSessionUrl build(ResultSet rs) throws DatabaseException {
try {
RecordSessionUrl rt = null;
if (rs.next()) {
rt = new RecordSessionUrl(rs.getLong(URLID), rs.getInt(TYPE), rs.getString(URL));
}
return rt;
} catch (SQLException e) {
throw new DatabaseException(e);
}
}
/* (non-Javadoc)
* @see org.parosproxy.paros.db.paros.TableSessionUrl#setUrls(int, java.util.List)
*/
@Override
public void setUrls(int type, List<String> urls) throws DatabaseException {
this.deleteAllUrlsForType(type);
for (String url : urls) {
this.insert(type, url);
}
}
}