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