java/jdbc-loopback-driver/src/info/globalcode/jdbc/loopback/PreparedStatement.java
author František Kučera <franta-hg@frantovo.cz>
Tue, 26 Feb 2019 18:19:49 +0100
branchv_0
changeset 236 a3ec71fa8e17
parent 176 9aa00e214020
permissions -rw-r--r--
Avoid reusing/rewriting the DB connection properties. There was weird random errors while testing connection to multiple DB in parallel when one of them was meta connection to same DB connection. Two kinds of exception: 1) missing password 2) „Passing DB password as CLI parameter is insecure!“
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
171
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     1
/**
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     2
 * SQL-DK
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     3
 * Copyright © 2014 František Kučera (frantovo.cz)
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     4
 *
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     5
 * This program is free software: you can redistribute it and/or modify
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     7
 * the Free Software Foundation, either version 3 of the License, or
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     8
 * (at your option) any later version.
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     9
 *
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    13
 * GNU General Public License for more details.
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    14
 *
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    16
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    17
 */
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    18
package info.globalcode.jdbc.loopback;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    19
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    20
import java.sql.SQLException;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    21
import java.sql.SQLWarning;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    22
import java.sql.Types;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    23
import java.util.ArrayList;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    24
import java.util.HashMap;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    25
import java.util.List;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    26
import java.util.Map;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    27
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    28
/**
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    29
 *
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    30
 * @author Ing. František Kučera (frantovo.cz)
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    31
 */
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    32
public class PreparedStatement extends AbstractPreparedStatement {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    33
172
dec1ba8af6c5 improved JDBC loopback driver
František Kučera <franta-hg@frantovo.cz>
parents: 171
diff changeset
    34
	private final Map<Integer, ObjectParameter> parameters = new HashMap<>();
171
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    35
	private List<Object[]> table;
172
dec1ba8af6c5 improved JDBC loopback driver
František Kučera <franta-hg@frantovo.cz>
parents: 171
diff changeset
    36
	private final ResultSetMetaData metadata = new ResultSetMetaData();
171
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    37
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    38
	@Override
176
9aa00e214020 parameter index → parameter number (starts with 1
František Kučera <franta-hg@frantovo.cz>
parents: 172
diff changeset
    39
	public void setObject(int parameterNumber, Object data, int targetSqlType) throws SQLException {
9aa00e214020 parameter index → parameter number (starts with 1
František Kučera <franta-hg@frantovo.cz>
parents: 172
diff changeset
    40
		parameters.put(parameterNumber, new ObjectParameter(data, targetSqlType));
171
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    41
	}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    42
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    43
	@Override
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    44
	public boolean execute() throws SQLException {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    45
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    46
		if (parameters.size() < 1) {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    47
			throw new SQLException("Missing first parameter (column count)");
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    48
		} else {
172
dec1ba8af6c5 improved JDBC loopback driver
František Kučera <franta-hg@frantovo.cz>
parents: 171
diff changeset
    49
			int columnCount = Integer.valueOf(String.valueOf(parameters.get(1).getData()));
171
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    50
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    51
			for (int i = 0; i < columnCount; i++) {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    52
				String label = parameters.get(1 + i + 1).getData().toString();
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    53
				metadata.addColumn(new ResultSetMetaData.ColumnDescriptor(Types.VARCHAR, "VARCHAR", label, label));
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    54
			}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    55
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    56
			int cellIndex = 0;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    57
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    58
			table = new ArrayList<>();
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    59
			Object[] currentRow = null;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    60
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    61
			for (int parameterNumber = (1 + columnCount + 1); true; parameterNumber++) {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    62
				ObjectParameter data = parameters.get(parameterNumber);
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    63
				if (data == null) {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    64
					break;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    65
				} else {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    66
					int columnIndex = cellIndex % columnCount;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    67
					cellIndex++;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    68
					if (columnIndex == 0) {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    69
						currentRow = new Object[columnCount];
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    70
						table.add(currentRow);
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    71
					}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    72
					currentRow[columnIndex] = data.getData();
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    73
				}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    74
			}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    75
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    76
			return true;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    77
		}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    78
	}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    79
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    80
	@Override
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    81
	public java.sql.ResultSet getResultSet() throws SQLException {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    82
		return new ResultSet(metadata, table);
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    83
	}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    84
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    85
	@Override
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    86
	public int getUpdateCount() throws SQLException {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    87
		return -1;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    88
	}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    89
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    90
	@Override
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    91
	public boolean getMoreResults() throws SQLException {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    92
		return false;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    93
	}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    94
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    95
	@Override
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    96
	public void close() throws SQLException {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    97
	}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    98
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    99
	@Override
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   100
	public SQLWarning getWarnings() throws SQLException {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   101
		return null;
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   102
	}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   103
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   104
	@Override
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   105
	public void clearWarnings() throws SQLException {
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   106
	}
701ec4db43fb JDBC loopback driver: first version
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
   107
}