annotate src/main/java/org/monetdb/client/JdbcClient.java @ 796:d2f14f2b28b3 monetdbs

Allow to pass whole URL to jdbcclient not just separate parameters Pass all information using Properties rather than building a URL. If the 'database' parameter starts with jdbc:, use that as the URL. Otherwise, use a stub
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 07 Dec 2023 09:00:00 +0100 (17 months ago)
parents a418afda6b21
children 5aa19bbed0d6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1 /*
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
2 * This Source Code Form is subject to the terms of the Mozilla Public
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
5 *
716
aeb268156580 Updated Copyright year.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 709
diff changeset
6 * Copyright 1997 - July 2008 CWI, August 2008 - 2023 MonetDB B.V.
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
7 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
8
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
9 package org.monetdb.client;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
10
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
11 import org.monetdb.jdbc.MonetDriver;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
12 import org.monetdb.jdbc.MonetConnection;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
13 import org.monetdb.util.CmdLineOpts;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
14 import org.monetdb.util.Exporter;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
15 import org.monetdb.util.FileTransferHandler;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
16 import org.monetdb.util.MDBvalidator;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
17 import org.monetdb.util.OptionsException;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
18 import org.monetdb.util.SQLExporter;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
19 import org.monetdb.util.XMLExporter;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
20
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
21 import java.io.BufferedReader;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
22 import java.io.BufferedWriter;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
23 import java.io.Console;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
24 import java.io.IOException;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
25 import java.io.InputStreamReader;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
26 import java.io.File;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
27 import java.io.PrintWriter;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
28 import java.net.HttpURLConnection;
770
1b9fe515f574 Fixed javac version 20 compiler warning.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 768
diff changeset
29 import java.net.URI;
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
30 import java.net.URL;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
31 import java.nio.charset.Charset;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
32 import java.sql.Connection;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
33 import java.sql.DatabaseMetaData;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
34 import java.sql.DriverManager; // this import is required as it will trigger loading the org.monetdb.jdbc.MonetDriver class
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
35 import java.sql.ResultSet;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
36 import java.sql.Statement;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
37 import java.sql.SQLException;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
38 import java.sql.SQLWarning;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
39 import java.util.ArrayList;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
40 import java.util.LinkedList;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
41 import java.util.List;
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
42 import java.util.Properties;
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
43
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
44 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
45 * This program acts like an extended client program for MonetDB. Its
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
46 * look and feel is very much like PostgreSQL's interactive terminal
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
47 * program. Although it looks like this client is designed for MonetDB,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
48 * it demonstrates the power of the JDBC interface since it built on top
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
49 * of JDBC only.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
50 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
51 * @author Fabian Groffen
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
52 * @author Martin van Dinther
768
a80c21fe7bb2 Removed deprecated nl.cwi.monetdb.*.* classes and package.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 723
diff changeset
53 * @version 1.8
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
54 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
55
768
a80c21fe7bb2 Removed deprecated nl.cwi.monetdb.*.* classes and package.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 723
diff changeset
56 public final class JdbcClient {
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
57
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
58 private static Connection con;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
59 private static DatabaseMetaData dbmd;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
60 private static Statement stmt;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
61 private static BufferedReader in;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
62 private static PrintWriter out;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
63 private static Exporter exporter;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
64
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
65 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
66 * JdbcClient is a command line query tool for MonetDB, similar to mclient.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
67 * It uses the JDBC API and the MonetDB JDBC driver to communicate with a
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
68 * MonetDB server. The MonetDB JDBC driver is included in the jdbcclient.jre8.jar
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
69 * for ease of use, so only 1 jar file is needed to use it.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
70 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
71 * <pre>Usage java -jar jdbcclient.jre8.jar
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
72 * [-h host[:port]] [-p port] [-f file] [-u user]
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
73 * [-l language] [-d database] [-e] [-D [table]]
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
74 * [--csvdir /path/to/csvfiles] [-X&lt;opt&gt;]
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
75 * | [--help] | [--version]
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
76 * or using long option equivalents --host --port --file --user --language
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
77 * --dump --echo --database.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
78 * Arguments may be written directly after the option like -p50000.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
79 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
80 * If no host and port are given, localhost and 50000 are assumed.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
81 * An .monetdb file may exist in the user's home directory. This file can contain
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
82 * preferences to use each time JdbcClient is started. Options given on the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
83 * command line override the preferences file. The .monetdb file syntax is
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
84 * &lt;option&gt;=&lt;value&gt; where option is one of the options host, port, file, mode
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
85 * debug, or password. Note that the last one is perilous and therefore not
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
86 * available as command line option.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
87 * If no input file is given using the -f flag, an interactive session is
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
88 * started on the terminal.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
89 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
90 * OPTIONS
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
91 * -h --host The hostname of the host that runs the MonetDB database. A port
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
92 * number can be supplied by use of a colon, i.e. -h somehost:12345.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
93 * -p --port The port number to connect to.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
94 * -f --file A file name to use either for reading or writing. The file will
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
95 * be used for writing when dump mode is used (-D --dump). In read
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
96 * mode, the file can also be an URL pointing to a plain text file
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
97 * that is optionally gzip compressed.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
98 * -u --user The username to use when connecting to the database.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
99 * -d --database Try to connect to the given database (only makes sense if
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
100 * connecting to monetdbd).
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
101 * -l --language Use the given language, defaults to 'sql'.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
102 * --help This help screen.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
103 * --version Display driver version and exit.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
104 * -e --echo Also outputs the contents of the input file, if any.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
105 * -q --quiet Suppress printing the welcome header.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
106 * -D --dump Dumps the given table(s), or the complete database if none given.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
107 * --csvdir The directory path where csv data files wil be read from or
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
108 * written to when COPY ... ON CLIENT commands are executed.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
109 * -Xoutput The output mode when dumping. Default is sql, xml may be used for
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
110 * an experimental XML output.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
111 * -Xhash Use the given hash algorithm during challenge response.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
112 * Supported algorithm names: SHA512, SHA384, SHA256 and SHA1.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
113 * -Xdebug Writes a transmission log to disk for debugging purposes. If a
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
114 * file name is given, it is used, otherwise a file called
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
115 * monet&lt;timestamp&gt;.log is created. A given file never be
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
116 * overwritten; instead a unique variation of the file is used.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
117 * -Xbatching Indicates that a batch should be used instead of direct
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
118 * communication with the server for each statement. If a number is
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
119 * given, it is used as batch size. i.e. 8000 would execute the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
120 * contents on the batch after each 8000 statements read. Batching
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
121 * can greatly speedup the process of restoring a database dump.</pre>
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
122 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
123 * @param args optional list of startup arguments
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
124 * @throws Exception if uncaught exception is thrown
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
125 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
126 public final static void main(String[] args) throws Exception {
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
127 final Properties props = new Properties();
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
128 final CmdLineOpts copts = new CmdLineOpts();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
129
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
130 // arguments which take exactly one argument
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
131 copts.addOption("h", "host", CmdLineOpts.CAR_ONE, "localhost",
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
132 "The hostname of the host that runs the MonetDB database. " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
133 "A port number can be supplied by use of a colon, i.e. " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
134 "-h somehost:12345.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
135 copts.addOption("p", "port", CmdLineOpts.CAR_ONE, "50000",
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
136 "The port number to connect to.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
137 // todo make it CAR_ONE_MANY
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
138 copts.addOption("f", "file", CmdLineOpts.CAR_ONE, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
139 "A file name to use either for reading or writing. The " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
140 "file will be used for writing when dump mode is used " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
141 "(-D --dump). In read mode, the file can also be an URL " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
142 "pointing to a plain text file that is optionally gzip " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
143 "compressed.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
144 copts.addOption("u", "user", CmdLineOpts.CAR_ONE, System.getProperty("user.name"),
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
145 "The username to use when connecting to the database.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
146 // this one is only here for the .monetdb file parsing, it is
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
147 // removed before the command line arguments are parsed
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
148 copts.addOption(null, "password", CmdLineOpts.CAR_ONE, null, null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
149 copts.addOption("d", "database", CmdLineOpts.CAR_ONE, "",
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
150 "Try to connect to the given database (only makes sense " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
151 "if connecting to monetdbd).");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
152 copts.addOption("l", "language", CmdLineOpts.CAR_ONE, "sql",
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
153 "Use the given language, defaults to 'sql'.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
154 copts.addOption(null, "csvdir", CmdLineOpts.CAR_ONE, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
155 "The directory path where csv data files are read or " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
156 "written when using ON CLIENT clause of COPY command.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
157
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
158 // arguments which have no argument(s)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
159 copts.addOption(null, "help", CmdLineOpts.CAR_ZERO, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
160 "This help screen.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
161 copts.addOption(null, "version", CmdLineOpts.CAR_ZERO, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
162 "Display driver version and exit.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
163 copts.addOption("e", "echo", CmdLineOpts.CAR_ZERO, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
164 "Also outputs the contents of the input file, if any.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
165 copts.addOption("q", "quiet", CmdLineOpts.CAR_ZERO, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
166 "Suppress printing the welcome header.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
167
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
168 // arguments which have zero to many arguments
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
169 copts.addOption("D", "dump", CmdLineOpts.CAR_ZERO_MANY, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
170 "Dumps the given table(s), or the complete database if " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
171 "none given.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
172
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
173 // extended options
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
174 copts.addOption(null, "Xoutput", CmdLineOpts.CAR_ONE, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
175 "The output mode when dumping. Default is sql, xml may " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
176 "be used for an experimental XML output.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
177 copts.addOption(null, "Xhash", CmdLineOpts.CAR_ONE, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
178 "Use the given hash algorithm during challenge response. " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
179 "Supported algorithm names: SHA512, SHA384, SHA256 and SHA1.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
180 // arguments which can have zero or one argument(s)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
181 copts.addOption(null, "Xdebug", CmdLineOpts.CAR_ZERO_ONE, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
182 "Writes a transmission log to disk for debugging purposes. " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
183 "If a file name is given, it is used, otherwise a file " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
184 "called monet<timestamp>.log is created. A given file " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
185 "never be overwritten; instead a unique variation of the " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
186 "file is used.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
187 copts.addOption(null, "Xbatching", CmdLineOpts.CAR_ZERO_ONE, null,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
188 "Indicates that a batch should be used instead of direct " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
189 "communication with the server for each statement. If a " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
190 "number is given, it is used as batch size. i.e. 8000 " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
191 "would execute the contents on the batch after each 8000 " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
192 "statements read. Batching can greatly speedup the " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
193 "process of restoring a database dump.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
194
794
a418afda6b21 Suppress jdbcclient warnings about unknown .monetdb settings
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 777
diff changeset
195 // This file can contain defaults for the flags user, password, language,
a418afda6b21 Suppress jdbcclient warnings about unknown .monetdb settings
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 777
diff changeset
196 // database, save_history, format, host, port, and width. For example, an
a418afda6b21 Suppress jdbcclient warnings about unknown .monetdb settings
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 777
diff changeset
197
a418afda6b21 Suppress jdbcclient warnings about unknown .monetdb settings
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 777
diff changeset
198 copts.addIgnored("save_history");
a418afda6b21 Suppress jdbcclient warnings about unknown .monetdb settings
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 777
diff changeset
199 copts.addIgnored("format");
a418afda6b21 Suppress jdbcclient warnings about unknown .monetdb settings
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 777
diff changeset
200 copts.addIgnored("width");
a418afda6b21 Suppress jdbcclient warnings about unknown .monetdb settings
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 777
diff changeset
201
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
202 // we store user and password in separate variables in order to
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
203 // be able to properly act on them like forgetting the password
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
204 // from the user's file if the user supplies a username on the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
205 // command line arguments
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
206 String pass = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
207 String user = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
208
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
209 // look for a file called .monetdb in the current dir or in the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
210 // user's homedir and read its preferences
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
211 File pref = new File(".monetdb");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
212 if (!pref.exists())
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
213 pref = new File(System.getProperty("user.home"), ".monetdb");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
214 if (pref.exists()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
215 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
216 copts.processFile(pref);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
217 } catch (OptionsException e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
218 System.err.println("Error in " + pref.getAbsolutePath() + ": " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
219 System.exit(1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
220 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
221 user = copts.getOption("user").getArgument();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
222 pass = copts.getOption("password").getArgument();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
223 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
224
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
225 // process the command line arguments, remove password option
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
226 // first, and save the user we had at this point
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
227 copts.removeOption("password");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
228 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
229 copts.processArgs(args);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
230 } catch (OptionsException e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
231 System.err.println("Error: " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
232 System.exit(1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
233 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
234 // we can actually compare pointers (objects) here
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
235 if (user != copts.getOption("user").getArgument())
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
236 pass = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
237
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
238 if (copts.getOption("help").isPresent()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
239 System.out.print(
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
240 "Usage java -jar jdbcclient.jre8.jar\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
241 "\t\t[-h host[:port]] [-p port] [-f file] [-u user]\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
242 "\t\t[-l language] [-d database] [-e] [-D [table]]\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
243 "\t\t[--csvdir /path/to/csvfiles]] [-X<opt>]\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
244 "\t\t| [--help] | [--version]\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
245 "or using long option equivalents --host --port --file --user --language\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
246 "--dump --echo --database.\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
247 "Arguments may be written directly after the option like -p50000.\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
248 "\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
249 "If no host and port are given, localhost and 50000 are assumed.\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
250 "An .monetdb file may exist in the user's home directory. This file can contain\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
251 "preferences to use each time JdbcClient is started. Options given on the\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
252 "command line override the preferences file. The .monetdb file syntax is\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
253 "<option>=<value> where option is one of the options host, port, file, mode\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
254 "debug, or password. Note that the last one is perilous and therefore not\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
255 "available as command line option.\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
256 "If no input file is given using the -f flag, an interactive session is\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
257 "started on the terminal.\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
258 "\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
259 "OPTIONS\n" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
260 copts.produceHelpMessage()
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
261 );
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
262 System.exit(0);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
263 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
264
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
265 if (copts.getOption("version").isPresent()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
266 // We cannot use the DatabaseMetaData here, because we
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
267 // cannot get a Connection. So instead, we just get the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
268 // values we want out of the Driver directly.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
269 System.out.println("JDBC Driver: v" + MonetDriver.getDriverVersion());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
270 System.exit(0);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
271 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
272
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
273 // whether the semi-colon at the end of a String terminates the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
274 // query or not (default = yes => SQL)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
275 final boolean scolonterm = true;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
276 final boolean xmlMode = "xml".equals(copts.getOption("Xoutput").getArgument());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
277
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
278 // we need the password from the user, fetch it with a pseudo
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
279 // password protector
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
280 if (pass == null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
281 final Console syscon = System.console();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
282 char[] tmp = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
283 if (syscon != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
284 tmp = syscon.readPassword("password: ");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
285 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
286 if (tmp == null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
287 System.err.println("Invalid password!");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
288 System.exit(1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
289 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
290 pass = String.valueOf(tmp);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
291 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
292
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
293 user = copts.getOption("user").getArgument();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
294
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
295 // extract hostname and port
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
296 String host = copts.getOption("host").getArgument();
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
297 String port = copts.getOption("port").getArgument();
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
298 int hostColon = host.indexOf(':');
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
299 if (hostColon > 0) {
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
300 port = host.substring(hostColon + 1);
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
301 host = host.substring(0, hostColon);
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
302 }
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
303 props.setProperty("host", host);
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
304 props.setProperty("port", port);
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
305
723
7200f7942b16 For JdbcClient enlarge the fetchsize at connection moment.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 716
diff changeset
306 // increase the fetchsize from the default 250 to 10000
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
307 props.setProperty("fetchsize", "10000");
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
308
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
309 CmdLineOpts.OptionContainer oc = copts.getOption("language");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
310 final String lang = oc.getArgument();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
311 if (oc.isPresent())
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
312 props.setProperty("language", lang);
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
313
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
314 /* Xquery is no longer functional or supported
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
315 // set some behaviour based on the language XQuery
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
316 if (lang.equals("xquery")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
317 scolonterm = false; // no ; to end a statement
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
318 if (!copts.getOption("Xoutput").isPresent())
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
319 xmlMode = true; // the user will like xml results, most probably
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
320 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
321 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
322 oc = copts.getOption("Xdebug");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
323 if (oc.isPresent()) {
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
324 props.setProperty("debug", "true");
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
325 if (oc.getArgumentCount() == 1)
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
326 props.setProperty("logfile", "logfile=" + oc.getArgument());
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
327 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
328 oc = copts.getOption("Xhash");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
329 if (oc.isPresent())
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
330 props.setProperty("hash", oc.getArgument());
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
331
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
332 // request a connection suitable for MonetDB from the driver
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
333 // manager note that the database specifier is only used when
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
334 // connecting to a proxy-like service, since MonetDB itself
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
335 // can't access multiple databases.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
336 con = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
337 final String database = copts.getOption("database").getArgument();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
338 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
339 // make sure the driver class is loaded (and thus register itself with the DriverManager)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
340 Class.forName("org.monetdb.jdbc.MonetDriver");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
341
796
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
342 // If the database name is a full url, use that.
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
343 // Otherwise, construct something.
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
344 String url;
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
345 if (database.startsWith("jdbc:")) {
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
346 url = database;
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
347 } else {
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
348 url = "jdbc:monetdb:"; // special case
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
349 props.setProperty("database", database);
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
350 }
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
351 props.setProperty("user", user);
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
352 props.setProperty("password", pass);
d2f14f2b28b3 Allow to pass whole URL to jdbcclient not just separate parameters
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents: 794
diff changeset
353 con = DriverManager.getConnection(url, props);
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
354 SQLWarning warn = con.getWarnings();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
355 while (warn != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
356 System.err.println("Connection warning: " + warn.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
357 warn = warn.getNextWarning();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
358 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
359 con.clearWarnings();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
360 } catch (SQLException e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
361 System.err.println("Database connect failed: " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
362 System.exit(1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
363 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
364
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
365 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
366 dbmd = con.getMetaData();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
367 } catch (SQLException e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
368 // we ignore this because it's probably because we don't use
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
369 // SQL language
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
370 dbmd = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
371 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
372
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
373 oc = copts.getOption("csvdir");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
374 if (oc.isPresent()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
375 final String csvdir = oc.getArgument();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
376 if (csvdir != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
377 // check if provided csvdir is an existing dir
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
378 // else a download of data into file will terminate the JDBC connection!!
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
379 if (java.nio.file.Files.isDirectory(java.nio.file.Paths.get(csvdir))) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
380 final FileTransferHandler FThandler = new FileTransferHandler(csvdir, Charset.defaultCharset());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
381
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
382 // register file data uploadHandler to allow support
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
383 // for: COPY INTO mytable FROM 'data.csv' ON CLIENT;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
384 ((MonetConnection) con).setUploadHandler(FThandler);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
385
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
386 // register file data downloadHandler to allow support
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
387 // for: COPY select_query INTO 'data.csv' ON CLIENT;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
388 ((MonetConnection) con).setDownloadHandler(FThandler);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
389 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
390 System.err.println("Warning: provided csvdir \"" + csvdir + "\" does not exist. Ignoring csvdir setting.");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
391 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
392 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
393 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
394
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
395 stmt = con.createStatement(); // is used by processInteractive(), processBatch(), doDump()
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
396
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
397 in = new BufferedReader(new InputStreamReader(System.in));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
398 out = new PrintWriter(new BufferedWriter(new java.io.OutputStreamWriter(System.out)));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
399
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
400 // see if we will have to perform a database dump (only in SQL mode)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
401 if ("sql".equals(lang) && copts.getOption("dump").isPresent() && dbmd != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
402 final int argcount = copts.getOption("dump").getArgumentCount();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
403
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
404 // use the given file for writing
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
405 oc = copts.getOption("file");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
406 if (oc.isPresent())
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
407 out = new PrintWriter(new BufferedWriter(new java.io.FileWriter(oc.getArgument())));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
408
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
409 // we only want user tables and views to be dumped (DDL and optional data), unless a specific table is requested
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
410 final String[] types = {"TABLE","VIEW","MERGE TABLE","REMOTE TABLE","REPLICA TABLE","STREAM TABLE"};
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
411 // Future: fetch all type names using dbmd.getTableTypes() and construct String[] with all
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
412 // table type names excluding the SYSTEM ... ones and LOCAL TEMPORARY TABLE ones.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
413
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
414 // request the list of tables/views available in the current schema in the database
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
415 ResultSet tbl = dbmd.getTables(null, con.getSchema(), null, (argcount == 0) ? types : null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
416 // fetch all tables and store them in a LinkedList of Table objects
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
417 final LinkedList<Table> tables = new LinkedList<Table>();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
418 while (tbl.next()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
419 tables.add(new Table(
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
420 tbl.getString(2), // 2 = "TABLE_SCHEM"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
421 tbl.getString(3), // 3 = "TABLE_NAME"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
422 tbl.getString(4))); // 4 = "TABLE_TYPE"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
423 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
424 tbl.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
425 tbl = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
426
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
427 if (xmlMode) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
428 exporter = new XMLExporter(out);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
429 exporter.setProperty(XMLExporter.TYPE_NIL, XMLExporter.VALUE_XSI);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
430 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
431 exporter = new SQLExporter(out);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
432 // stick with SQL INSERT INTO commands for now
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
433 // in the future we might do COPY INTO's here using VALUE_COPY
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
434 exporter.setProperty(SQLExporter.TYPE_OUTPUT, SQLExporter.VALUE_INSERT);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
435 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
436 exporter.useSchemas(true);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
437
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
438 // start SQL output
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
439 if (!xmlMode)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
440 out.println("START TRANSACTION;\n");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
441
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
442 // dump specific table(s) or not?
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
443 if (argcount > 0) { // yes we do
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
444 final String[] dumpers = copts.getOption("dump").getArguments();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
445 for (int i = 0; i < tables.size(); i++) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
446 Table ttmp = tables.get(i);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
447 for (int j = 0; j < dumpers.length; j++) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
448 String dumptblnm = dumpers[j].toString();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
449 if (ttmp.getName().equalsIgnoreCase(dumptblnm) ||
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
450 ttmp.getFqname().equalsIgnoreCase(dumptblnm))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
451 {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
452 // dump the table
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
453 doDump(out, ttmp);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
454 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
455 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
456 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
457 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
458 /* this returns everything, so including SYSTEM TABLE constraints */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
459 tbl = dbmd.getImportedKeys(null, null, null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
460 while (tbl.next()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
461 // find FK table object 6 = "FKTABLE_SCHEM", 7 = "FKTABLE_NAME"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
462 Table fk = Table.findTable(tbl.getString(6), tbl.getString(7), tables);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
463
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
464 // find PK table object 2 = "PKTABLE_SCHEM", 3 = "PKTABLE_NAME"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
465 Table pk = Table.findTable(tbl.getString(2), tbl.getString(3), tables);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
466
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
467 // this happens when a system table has referential constraints
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
468 if (fk == null || pk == null)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
469 continue;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
470
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
471 // add PK table dependency to FK table
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
472 fk.addDependency(pk);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
473 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
474 tbl.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
475 tbl = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
476
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
477 // search for cycles of type a -> (x ->)+ b probably not
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
478 // the most optimal way, but it works by just scanning
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
479 // every table for loops in a recursive manor
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
480 for (Table t : tables) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
481 Table.checkForLoop(t, new ArrayList<Table>());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
482 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
483
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
484 // find the graph, at this point we know there are no
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
485 // cycles, thus a solution exists
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
486 for (int i = 0; i < tables.size(); i++) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
487 final List<Table> needs = tables.get(i).requires(tables.subList(0, i + 1));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
488 if (needs.size() > 0) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
489 tables.removeAll(needs);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
490 tables.addAll(i, needs);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
491
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
492 // re-evaluate this position, for there is a new
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
493 // table now
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
494 i--;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
495 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
496 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
497
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
498 // we now have the right order to dump tables
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
499 for (Table t : tables) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
500 // dump the table
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
501 doDump(out, t);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
502 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
503 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
504
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
505 if (!xmlMode)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
506 out.println("COMMIT;");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
507 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
508
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
509 // free resources, close the statement
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
510 stmt.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
511 // close the connection with the database
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
512 con.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
513 // completed database dump
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
514 System.exit(0);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
515 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
516
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
517 if (xmlMode) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
518 exporter = new XMLExporter(out);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
519 exporter.setProperty(XMLExporter.TYPE_NIL, XMLExporter.VALUE_XSI);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
520 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
521 exporter = new SQLExporter(out);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
522 // we want nice table formatted output
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
523 exporter.setProperty(SQLExporter.TYPE_OUTPUT, SQLExporter.VALUE_TABLE);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
524 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
525 exporter.useSchemas(false);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
526
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
527 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
528 // use the given file for reading
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
529 final boolean hasFile = copts.getOption("file").isPresent();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
530 final boolean doEcho = hasFile && copts.getOption("echo").isPresent();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
531 if (hasFile) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
532 final String tmp = copts.getOption("file").getArgument();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
533 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
534 in = getReader(tmp);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
535 } catch (Exception e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
536 System.err.println("Error: " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
537 System.exit(1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
538 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
539
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
540 // check for batch mode
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
541 int batchSize = 0;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
542 oc = copts.getOption("Xbatching");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
543 if (oc.isPresent()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
544 if (oc.getArgumentCount() == 1) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
545 // parse the number
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
546 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
547 batchSize = Integer.parseInt(oc.getArgument());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
548 } catch (NumberFormatException ex) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
549 // complain to the user
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
550 throw new IllegalArgumentException("Illegal argument for Xbatching: " + oc.getArgument() + " is not a parseable number!");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
551 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
552 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
553 processBatch(batchSize);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
554 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
555 processInteractive(true, doEcho, scolonterm, user);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
556 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
557 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
558 if (!copts.getOption("quiet").isPresent()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
559 // print welcome message
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
560 out.println("Welcome to the MonetDB interactive JDBC terminal!");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
561 if (dbmd != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
562 out.println("JDBC Driver: " + dbmd.getDriverName() +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
563 " v" + dbmd.getDriverVersion());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
564 out.println("Database Server: " + dbmd.getDatabaseProductName() +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
565 " v" + dbmd.getDatabaseProductVersion());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
566 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
567 out.println("Current Schema: " + con.getSchema());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
568 out.println("Type \\q to quit (you can also use: quit or exit), \\? or \\h for a list of available commands");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
569 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
570 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
571 processInteractive(false, doEcho, scolonterm, user);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
572 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
573
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
574 // free resources, close the statement
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
575 stmt.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
576 // close the connection with the database
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
577 con.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
578 // close the file (if we used a file)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
579 in.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
580 } catch (Exception e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
581 System.err.println("A fatal exception occurred: " + e.toString());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
582 e.printStackTrace(System.err);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
583 // at least try to close the connection properly, since it will
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
584 // close all statements associated with it
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
585 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
586 con.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
587 } catch (SQLException ex) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
588 // ok... nice try
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
589 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
590 System.exit(1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
591 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
592 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
593
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
594 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
595 * Tries to interpret the given String as URL or file. Returns the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
596 * assigned BufferedReader, or throws an Exception if the given
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
597 * string couldn't be identified as a valid URL or file.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
598 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
599 * @param uri URL or filename as String
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
600 * @return a BufferedReader for the uri
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
601 * @throws Exception if uri cannot be identified as a valid URL or file
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
602 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
603 static BufferedReader getReader(final String uri) throws Exception {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
604 BufferedReader ret = null;
772
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
605 URI u = null;
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
606
772
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
607 // Try and parse as URL
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
608 try {
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
609 // Note: as of Java version 20 java.net.URL(String) constructor is deprecated.
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
610 // https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/net/URL.html#%3Cinit%3E(java.lang.String)
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
611 u = new java.net.URI(uri);
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
612 // the URL must start with a scheme such as: "http://" or "https://" else u.toURL() errors
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
613 if (u != null && u.isAbsolute()) {
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
614 final URL url = u.toURL();
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
615 HttpURLConnection.setFollowRedirects(true);
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
616 final HttpURLConnection con = (HttpURLConnection)url.openConnection();
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
617 con.setRequestMethod("GET");
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
618 final String ct = con.getContentType();
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
619 if ("application/x-gzip".equals(ct)) {
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
620 // open gzip stream
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
621 ret = new BufferedReader(new InputStreamReader(
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
622 new java.util.zip.GZIPInputStream(con.getInputStream())));
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
623 } else {
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
624 // text/plain otherwise just attempt to read as is
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
625 ret = new BufferedReader(new InputStreamReader(con.getInputStream()));
770
1b9fe515f574 Fixed javac version 20 compiler warning.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 768
diff changeset
626 }
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
627 }
772
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
628 } catch (IOException e) {
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
629 // failed to open/read the url
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
630 throw new Exception("Failed to open/read http URL: " + e.getMessage());
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
631 } catch (Exception e) {
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
632 if (u != null)
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
633 throw new Exception("Invalid http URL: " + uri + "\n" + e.getMessage());
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
634 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
635
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
636 if (ret == null) {
772
9493dacdd186 Fix problem where passed file name contained a : character but was not an URL,
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 770
diff changeset
637 // uri is not a valid URI/URL, so probably a file name
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
638 try {
770
1b9fe515f574 Fixed javac version 20 compiler warning.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 768
diff changeset
639 ret = new BufferedReader(new java.io.FileReader(uri));
1b9fe515f574 Fixed javac version 20 compiler warning.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 768
diff changeset
640 } catch (java.io.FileNotFoundException fnfe) {
1b9fe515f574 Fixed javac version 20 compiler warning.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 768
diff changeset
641 // the message is descriptive enough,
1b9fe515f574 Fixed javac version 20 compiler warning.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 768
diff changeset
642 // adds "(No such file or directory)" itself.
1b9fe515f574 Fixed javac version 20 compiler warning.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 768
diff changeset
643 throw new Exception(fnfe.getMessage());
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
644 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
645 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
646
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
647 return ret;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
648 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
649
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
650 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
651 * Starts an interactive processing loop, where output is adjusted to an
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
652 * user session. This processing loop is not suitable for bulk processing
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
653 * as in executing the contents of a file, since processing on the given
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
654 * input is done after each row that has been entered.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
655 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
656 * @param hasFile a boolean indicating whether a file is used as input
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
657 * @param doEcho a boolean indicating whether to echo the given input
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
658 * @param scolonterm whether a ';' makes this query part complete
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
659 * @param user a String representing the username of the current user
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
660 * @throws IOException if an IO exception occurs
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
661 * @throws SQLException if a database related error occurs
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
662 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
663 private static void processInteractive(
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
664 final boolean hasFile,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
665 final boolean doEcho,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
666 final boolean scolonterm,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
667 final String user)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
668 throws IOException, SQLException
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
669 {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
670 // an SQL stack keeps track of ( " and '
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
671 final SQLStack stack = new SQLStack();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
672 boolean lastac = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
673
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
674 if (!hasFile) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
675 lastac = con.getAutoCommit();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
676 out.println("auto commit mode: " + (lastac ? "on" : "off"));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
677 out.print(getPrompt(stack, true));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
678 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
679 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
680
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
681 String curLine;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
682 String query = "";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
683 boolean doProcess;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
684 boolean wasComplete = true;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
685
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
686 // the main (interactive) process loop
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
687 for (long i = 1; true; i++) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
688 // Manually read a line, because we want to detect an EOF
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
689 // (ctrl-D). Doing so allows to have a terminator for query
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
690 // which is not based on a special character, as is the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
691 // problem for XQuery
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
692 curLine = in.readLine();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
693 if (curLine == null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
694 out.println("");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
695 if (!query.isEmpty()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
696 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
697 executeQuery(query, stmt, out, !hasFile);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
698 } catch (SQLException e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
699 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
700 do {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
701 if (hasFile) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
702 System.err.println("Error on line " + i + ": [" + e.getSQLState() + "] " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
703 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
704 System.err.println("Error [" + e.getSQLState() + "]: " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
705 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
706 // print all error messages in the chain (if any)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
707 } while ((e = e.getNextException()) != null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
708 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
709 query = "";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
710 wasComplete = true;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
711 if (!hasFile) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
712 final boolean ac = con.getAutoCommit();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
713 if (ac != lastac) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
714 out.println("auto commit mode: " + (ac ? "on" : "off"));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
715 lastac = ac;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
716 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
717 out.print(getPrompt(stack, wasComplete));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
718 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
719 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
720 // try to read again
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
721 continue;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
722 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
723 // user did ctrl-D without something in the buffer,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
724 // so terminate
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
725 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
726 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
727 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
728
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
729 if (doEcho) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
730 out.println(curLine);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
731 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
732 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
733
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
734 // a query part is a line of an SQL query
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
735 QueryPart qp = scanQuery(curLine, stack, scolonterm);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
736 if (!qp.isEmpty()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
737 final String command = qp.getQuery();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
738 doProcess = true;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
739 if (wasComplete) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
740 doProcess = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
741 // check for commands only when the previous row was complete
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
742 if (command.equals("\\q") || command.equals("quit") || command.equals("exit")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
743 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
744 } else if (dbmd != null && command.startsWith("\\d")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
745 processDescribeCmd(command, scolonterm);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
746 } else if (command.startsWith("\\v")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
747 if (command.equals("\\vsci")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
748 MDBvalidator.validateSqlCatalogIntegrity(con, true);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
749 } else if (command.equals("\\vsci_noheader")) { // used only for internal automated testing
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
750 MDBvalidator.validateSqlCatalogIntegrity(con, false);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
751 } else if (command.equals("\\vsni")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
752 MDBvalidator.validateSqlNetcdfTablesIntegrity(con, true);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
753 } else if (command.equals("\\vsni_noheader")) { // used only for internal automated testing
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
754 MDBvalidator.validateSqlNetcdfTablesIntegrity(con, false);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
755 } else if (command.equals("\\vsgi")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
756 MDBvalidator.validateSqlGeomTablesIntegrity(con, true);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
757 } else if (command.equals("\\vsgi_noheader")) { // used only for internal automated testing
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
758 MDBvalidator.validateSqlGeomTablesIntegrity(con, false);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
759 } else if (command.startsWith("\\vsi ")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
760 String schema_nm = command.substring(5);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
761 MDBvalidator.validateSchemaIntegrity(con, schema_nm, true);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
762 } else if (command.startsWith("\\vsi_noheader ")) { // used only for internal automated testing
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
763 String schema_nm = command.substring(14);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
764 MDBvalidator.validateSchemaIntegrity(con, schema_nm, false);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
765 } else if (command.equals("\\vdbi")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
766 MDBvalidator.validateDBIntegrity(con, true);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
767 } else if (command.equals("\\vdbi_noheader")) { // used only for internal automated testing
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
768 MDBvalidator.validateDBIntegrity(con, false);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
769 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
770 showCommands();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
771 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
772 } else if (command.startsWith("\\l") || command.startsWith("\\i")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
773 String object = command.substring(2).trim();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
774 if (scolonterm && object.endsWith(";"))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
775 object = object.substring(0, object.length() - 1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
776 if (object.isEmpty()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
777 System.err.println("Usage: '" + command.substring(0, 2) + "<uri>' where <uri> is a file or URL");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
778 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
779 // temporarily redirect input from in
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
780 final BufferedReader console = in;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
781 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
782 in = getReader(object);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
783 if (command.startsWith("\\l")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
784 processInteractive(true, doEcho, scolonterm, user);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
785 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
786 processBatch(0);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
787 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
788 } catch (Exception e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
789 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
790 System.err.println("Error: " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
791 } finally {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
792 // put back in redirection
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
793 in = console;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
794 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
795 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
796 } else if (command.equals("\\?") || command.equals("\\h") || command.startsWith("\\")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
797 showCommands();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
798 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
799 doProcess = true;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
800 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
801 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
802
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
803 if (doProcess) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
804 query += command + (qp.hasOpenQuote() ? "\\n" : " ");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
805 if (qp.isComplete()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
806 // strip off trailing ';'
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
807 query = query.substring(0, query.length() - 2);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
808 // execute query
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
809 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
810 executeQuery(query, stmt, out, !hasFile);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
811 } catch (SQLException e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
812 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
813 final String startmsg = (hasFile ? ("Error on line " + i + ": [") : "Error [");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
814 do {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
815 System.err.println(startmsg + e.getSQLState() + "] " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
816 // print all error messages in the chain (if any)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
817 } while ((e = e.getNextException()) != null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
818 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
819 query = "";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
820 wasComplete = true;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
821 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
822 wasComplete = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
823 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
824 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
825 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
826
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
827 if (!hasFile) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
828 final boolean ac = con.getAutoCommit();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
829 if (ac != lastac) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
830 out.println("auto commit mode: " + (ac ? "on" : "off"));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
831 lastac = ac;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
832 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
833 out.print(getPrompt(stack, wasComplete));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
834 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
835 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
836 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
837 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
838
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
839 private static void showCommands()
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
840 {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
841 out.println("Available commands:");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
842 out.println("\\q quits this program (you can also use: quit or exit)");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
843 if (dbmd != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
844 out.println("\\d list available user tables and views in current schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
845 out.println("\\dt list available user tables in current schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
846 out.println("\\dv list available user views in current schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
847 out.println("\\df list available user functions in current schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
848 out.println("\\dp list available user procedures in current schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
849 out.println("\\ds list available user sequences in current schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
850 out.println("\\dn list available user schemas");
777
5788507c01b9 Adapt JdbcClient to show information_schema views when using commands: \dS or \dSv or \dvS and current schema is information_schema.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 772
diff changeset
851 out.println("\\dS list available system tables and views in sys/tmp/information_schema schema");
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
852 out.println("\\dSt list available system tables in sys/tmp schema");
777
5788507c01b9 Adapt JdbcClient to show information_schema views when using commands: \dS or \dSv or \dvS and current schema is information_schema.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 772
diff changeset
853 out.println("\\dSv list available system views in sys/information_schema/logging schema");
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
854 out.println("\\dSf list available system functions in current schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
855 out.println("\\dSp list available system procedures in current schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
856 out.println("\\dSn list available system schemas");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
857 out.println("\\d <obj> describes the given table or view");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
858 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
859 out.println("\\l<uri> executes the contents of the given file or URL");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
860 out.println("\\i<uri> batch executes the inserts from the given file or URL");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
861 out.println("\\vsci validate sql system catalog integrity");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
862 // out.println("\\vsni validate sql system netcdf tables integrity"); // do not print as it depends on availability of netcdf library on server
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
863 // out.println("\\vsgi validate sql system geom tables integrity"); // do not print as it depends on availability of geom library on server
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
864 out.println("\\vsi <schema> validate integrity of data in the given schema");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
865 out.println("\\vdbi validate integrity of data in all user schemas in the database");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
866 out.println("\\? or \\h this help screen");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
867 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
868
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
869 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
870 * Process the commands that start with \d
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
871 * These commands list the available user or system tables, views, functions, procedures, schemas
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
872 * or user sequences
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
873 * or describe a specific table or view by printing the CREATE DDL statement
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
874 * See also showCommands()
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
875 * These commands are almost the same as in mclient program
709
bdeabbd46ec6 Resolve javac and javadoc warnings when compiled with JDK19.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 698
diff changeset
876 *
bdeabbd46ec6 Resolve javac and javadoc warnings when compiled with JDK19.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 698
diff changeset
877 * @param dcommand the command starting with \d
bdeabbd46ec6 Resolve javac and javadoc warnings when compiled with JDK19.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 698
diff changeset
878 * @param scolonterm whether a ';' makes this query part complete
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
879 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
880 private static void processDescribeCmd(final String dcommand, final boolean scolonterm)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
881 {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
882 final String command = dcommand.substring(1); // remove the leading \ character first
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
883 ResultSet rs = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
884 Statement st = null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
885 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
886 if (command.equals("d") || command.equals("dt") || command.equals("dv")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
887 // list available user tables and/or views in current schema (maybe tmp schema to show temporary tables)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
888 boolean tablesOnly = command.equals("dt");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
889 boolean viewsOnly = command.equals("dv");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
890 rs = dbmd.getTables(null, con.getSchema(), null, null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
891 while (rs.next()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
892 final String tableType = rs.getString(4); // 4 = "TABLE_TYPE"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
893 boolean include = (tableType != null && !tableType.startsWith("SYSTEM "));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
894 if (include && tablesOnly && !tableType.contains("TABLE"))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
895 include = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
896 if (include && viewsOnly && !tableType.contains("VIEW"))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
897 include = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
898 if (include) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
899 out.println(tableType + "\t" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
900 optAddDqs(rs.getString(2)) + "." + // 2 = "TABLE_SCHEM"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
901 optAddDqs(rs.getString(3)) ); // 3 = "TABLE_NAME"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
902 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
903 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
904 } else
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
905 if (command.equals("dS") || command.equals("dSt") || command.equals("dSv") || command.equals("dtS") || command.equals("dvS")) {
777
5788507c01b9 Adapt JdbcClient to show information_schema views when using commands: \dS or \dSv or \dvS and current schema is information_schema.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 772
diff changeset
906 // list available system tables and/or views in sys/tmp/information_schema/logging schema
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
907 boolean tablesOnly = command.contains("t");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
908 boolean viewsOnly = command.contains("v");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
909 String curSchema = con.getSchema();
777
5788507c01b9 Adapt JdbcClient to show information_schema views when using commands: \dS or \dSv or \dvS and current schema is information_schema.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 772
diff changeset
910 // only schemas: sys, tmp, information_schema and logging contain system tables and/or system views.
5788507c01b9 Adapt JdbcClient to show information_schema views when using commands: \dS or \dSv or \dvS and current schema is information_schema.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 772
diff changeset
911 if (!("sys".equals(curSchema) || "tmp".equals(curSchema) || "information_schema".equals(curSchema) || "logging".equals(curSchema)))
5788507c01b9 Adapt JdbcClient to show information_schema views when using commands: \dS or \dSv or \dvS and current schema is information_schema.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 772
diff changeset
912 // when currently in another schema, default to the sys schema else nothing will be listed
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
913 curSchema = "sys";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
914 rs = dbmd.getTables(null, curSchema, null, null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
915 while (rs.next()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
916 final String tableType = rs.getString(4); // 4 = "TABLE_TYPE"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
917 boolean include = (tableType != null && tableType.startsWith("SYSTEM "));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
918 if (include && tablesOnly && !tableType.contains("TABLE"))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
919 include = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
920 if (include && viewsOnly && !tableType.contains("VIEW"))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
921 include = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
922 if (include) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
923 out.println(tableType + "\t" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
924 optAddDqs(rs.getString(2)) + "." + // 2 = "TABLE_SCHEM"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
925 optAddDqs(rs.getString(3)) ); // 3 = "TABLE_NAME"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
926 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
927 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
928 } else
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
929 if (command.equals("df") || command.equals("dp") || command.equals("dSf") || command.equals("dSp") || command.equals("dfS") || command.equals("dpS")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
930 // list available user/system functions or procedures in current schema (maybe tmp schema)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
931 boolean proceduresOnly = command.contains("p");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
932 boolean systemOnly = command.contains("S");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
933 // Note we cannot use: dbmd.getFunctions(null, con.getSchema(), null); or dbmd.getProcedures(null, con.getSchema(), null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
934 // as they do not return the full function type name, nor provide information whether it is a system function or system procedure.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
935 // Instead we query the MonetDB system catog tables directly using:
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
936 String qy = "SELECT DISTINCT " + (systemOnly ? "'SYSTEM ' || " : "") + "\"function_type_keyword\" as func_type, " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
937 "\"schemas\".\"name\" as schem_name, \"functions\".\"name\" as func_name" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
938 " FROM sys.\"functions\"" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
939 " JOIN sys.\"function_types\" ON \"functions\".\"type\" = \"function_types\".\"function_type_id\"" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
940 " JOIN sys.\"schemas\" ON \"functions\".\"schema_id\" = \"schemas\".\"id\"" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
941 " WHERE \"functions\".\"system\" = " + (systemOnly ? "true" : "false") +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
942 " AND \"functions\".\"type\" " + (proceduresOnly ? "= 2" : "<> 2") +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
943 " AND \"schemas\".\"name\" = current_schema" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
944 " ORDER BY 2, 3";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
945 st = con.createStatement();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
946 rs = st.executeQuery(qy);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
947 while (rs.next()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
948 out.println(rs.getString(1) + " \t" + // 1 = func_type
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
949 optAddDqs(rs.getString(2)) + "." + // 2 = schem_name
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
950 optAddDqs(rs.getString(3)) ); // 3 = func_name
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
951 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
952 } else
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
953 if (command.equals("ds")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
954 // list available (user) sequences in current schema
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
955 String qy = "SELECT \"schemas\".\"name\", \"sequences\".\"name\"" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
956 " FROM sys.\"sequences\"" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
957 " JOIN sys.\"schemas\" ON \"sequences\".\"schema_id\" = \"schemas\".\"id\"" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
958 " WHERE \"schemas\".\"name\" = current_schema" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
959 " ORDER BY 1, 2";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
960 st = con.createStatement();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
961 rs = st.executeQuery(qy);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
962 while (rs.next()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
963 out.println("SEQUENCE " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
964 optAddDqs(rs.getString(1)) + "." + // 1 = schemas.name
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
965 optAddDqs(rs.getString(2)) ); // 2 = sequences.name
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
966 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
967 } else
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
968 if (command.equals("dn") || command.equals("dSn") || command.equals("dnS")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
969 // list available user/system schemas in the database
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
970 boolean systemOnly = command.contains("S");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
971 String qy = "SELECT \"name\"" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
972 " FROM sys.\"schemas\"" +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
973 " WHERE \"system\" = " + (systemOnly ? "true" : "false") +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
974 " ORDER BY 1";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
975 String schema_type = (systemOnly ? "SYSTEM SCHEMA\t" : "SCHEMA\t");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
976 st = con.createStatement();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
977 rs = st.executeQuery(qy);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
978 while (rs.next()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
979 out.println(schema_type + optAddDqs(rs.getString(1)) ); // 1 = schemas.name
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
980 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
981 } else
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
982 if (command.startsWith("d ")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
983 // describes the given table or view name. It may be a fully qualified name such as: sys."keys"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
984 String object = command.substring(2).trim();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
985 if (scolonterm && object.endsWith(";"))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
986 object = object.substring(0, object.length() - 1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
987 if (object.isEmpty()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
988 System.err.println("Missing name of object to describe");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
989 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
990 // extract the name of the schema first. If none found use current schema
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
991 String schema;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
992 String obj_nm = object;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
993 int len;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
994 boolean found = false;
698
6beecac8aa1b Use indexOf(char) instead of indexOf(String) where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 675
diff changeset
995 final int dot = object.indexOf('.');
675
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
996 if (dot > 0) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
997 // use specified schema
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
998 schema = object.substring(0, dot);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
999 obj_nm = object.substring(dot + 1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1000 // remove potential surrounding double quotes around schema name
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1001 len = schema.length();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1002 if (len > 2 && schema.charAt(0) == '"' && schema.charAt(len -1) == '"')
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1003 schema = schema.substring(1, len -1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1004 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1005 // use current schema
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1006 schema = con.getSchema();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1007 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1008 // remove potential surrounding double quotes around table or view name
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1009 len = obj_nm.length();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1010 if (len > 2 && obj_nm.charAt(0) == '"' && obj_nm.charAt(len -1) == '"')
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1011 obj_nm = obj_nm.substring(1, len -1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1012
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1013 // System.err.println("calling dbmd.getTables(" + schema + ", " + obj_nm + ")");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1014 rs = dbmd.getTables(null, schema, obj_nm, null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1015 while (rs.next() && !found) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1016 final String schemaName = rs.getString(2); // 2 = "TABLE_SCHEM"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1017 final String tableName = rs.getString(3); // 3 = "TABLE_NAME"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1018 if (obj_nm.equals(tableName) && schema.equals(schemaName)) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1019 String tableType = rs.getString(4); // 4 = "TABLE_TYPE"
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1020 if (tableType.startsWith("SYSTEM "))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1021 tableType = tableType.substring(7);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1022 // we found it, describe it
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1023 exporter.dumpSchema(dbmd, tableType, schemaName, tableName);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1024 found = true;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1025 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1026 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1027 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1028 if (!found)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1029 System.err.println("table or view: " + schema + "." + obj_nm + " does not exist");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1030 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1031 } else
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1032 if (command.startsWith("d")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1033 System.err.println("unknown sub-command for \\d: " + command.substring(1));
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1034 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1035 showCommands();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1036 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1037 } catch (SQLException e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1038 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1039 do {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1040 System.err.println("Error [" + e.getSQLState() + "]: " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1041 // print all error messages in the chain (if any)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1042 } while ((e = e.getNextException()) != null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1043 } finally {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1044 if (rs != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1045 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1046 rs.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1047 } catch (SQLException e) { /* ignore */ }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1048 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1049 if (st != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1050 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1051 st.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1052 } catch (SQLException e) { /* ignore */ }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1053 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1054 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1055 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1056
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1057 private static String optAddDqs(final String name)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1058 {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1059 if (name.contains(" ") || name.contains("\t") || name.contains("\n"))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1060 return Exporter.dq(name);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1061 return name;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1062 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1063
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1064 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1065 * Executes the given query and prints the result tabularised to the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1066 * given PrintWriter stream. The result of this method is the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1067 * default output of a query: tabular data.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1068 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1069 * @param query the query to execute
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1070 * @param stmt the Statement to execute the query on
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1071 * @param out the PrintWriter to write to
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1072 * @param showTiming flag to specify if timing information nees to be printed
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1073 * @throws SQLException if a database related error occurs
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1074 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1075 private static void executeQuery(final String query,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1076 final Statement stmt,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1077 final PrintWriter out,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1078 final boolean showTiming)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1079 throws SQLException
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1080 {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1081 // warnings generated during querying
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1082 SQLWarning warn;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1083 long startTime = (showTiming ? System.currentTimeMillis() : 0);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1084 long finishTime = 0;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1085
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1086 // execute the query, let the driver decide what type it is
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1087 int aff = -1;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1088 boolean nextRslt = stmt.execute(query, Statement.RETURN_GENERATED_KEYS);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1089 if (!nextRslt)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1090 aff = stmt.getUpdateCount();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1091 do {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1092 if (nextRslt) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1093 // we have a ResultSet, print it
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1094 final ResultSet rs = stmt.getResultSet();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1095
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1096 exporter.dumpResultSet(rs);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1097 if (showTiming) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1098 finishTime = System.currentTimeMillis();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1099 out.println("Elapsed Time: " + (finishTime - startTime) + " ms");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1100 startTime = finishTime;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1101 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1102
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1103 // if there were warnings for this result,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1104 // show them!
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1105 warn = rs.getWarnings();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1106 if (warn != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1107 // force stdout to be written so the
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1108 // warning appears below it
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1109 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1110 do {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1111 System.err.println("ResultSet warning: " +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1112 warn.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1113 warn = warn.getNextWarning();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1114 } while (warn != null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1115 rs.clearWarnings();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1116 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1117 rs.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1118 } else if (aff != -1) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1119 String timingoutput = "";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1120 if (showTiming) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1121 finishTime = System.currentTimeMillis();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1122 timingoutput = ". Elapsed Time: " + (finishTime - startTime) + " ms";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1123 startTime = finishTime;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1124 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1125
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1126 if (aff == Statement.SUCCESS_NO_INFO) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1127 out.println("Operation successful" + timingoutput);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1128 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1129 // we have an update count
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1130 // see if a key was generated
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1131 final ResultSet rs = stmt.getGeneratedKeys();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1132 final boolean hasGeneratedKeyData = rs.next();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1133 out.println(aff + " affected row" + (aff != 1 ? "s" : "") +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1134 (hasGeneratedKeyData ? ", last generated key: " + rs.getString(1) : "") +
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1135 timingoutput);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1136 rs.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1137 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1138 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1139
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1140 out.flush();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1141 } while ((nextRslt = stmt.getMoreResults()) ||
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1142 (aff = stmt.getUpdateCount()) != -1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1143
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1144 // if there were warnings for this statement show them!
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1145 warn = stmt.getWarnings();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1146 while (warn != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1147 System.err.println("Statement warning: " + warn.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1148 warn = warn.getNextWarning();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1149 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1150 stmt.clearWarnings();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1151
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1152 // if there were warnings for this connection show them!
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1153 warn = con.getWarnings();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1154 while (warn != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1155 // suppress warning when issueing a "set schema xyz;" command
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1156 // if ( !(warn.getMessage()).equals("Server enabled auto commit mode while local state already was auto commit.") )
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1157 System.err.println("Connection warning: " + warn.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1158 warn = warn.getNextWarning();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1159 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1160 con.clearWarnings();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1161 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1162
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1163 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1164 * Starts a processing loop optimized for processing (large) chunks of
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1165 * continuous data, such as input from a file. Unlike in the interactive
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1166 * loop above, queries are sent only to the database if a certain batch
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1167 * amount is reached. No client side query checks are made, but everything
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1168 * is sent to the server as-is.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1169 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1170 * @param batchSize the number of items to store in the batch before
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1171 * sending them to the database for execution.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1172 * @throws IOException if an IO exception occurs.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1173 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1174 private static void processBatch(final int batchSize) throws IOException {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1175 final StringBuilder query = new StringBuilder(2048);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1176 int i = 0;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1177 try {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1178 String curLine;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1179 // the main loop
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1180 for (i = 1; (curLine = in.readLine()) != null; i++) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1181 query.append(curLine);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1182 if (curLine.endsWith(";")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1183 // lousy check for end of statement, but in batch mode it
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1184 // is not very important to catch all end of statements...
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1185 stmt.addBatch(query.toString());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1186 query.setLength(0); // clear the buffer
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1187 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1188 query.append('\n');
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1189 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1190 if (batchSize > 0 && i % batchSize == 0) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1191 stmt.executeBatch();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1192 // stmt.clearBatch(); // this is no longer needed after call executeBatch(), see https://www.monetdb.org/bugzilla/show_bug.cgi?id=6953
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1193 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1194 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1195 stmt.addBatch(query.toString());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1196 stmt.executeBatch();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1197 // stmt.clearBatch(); // this is no longer needed after call executeBatch(), see https://www.monetdb.org/bugzilla/show_bug.cgi?id=6953
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1198 } catch (SQLException e) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1199 do {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1200 System.err.println("Error at line " + i + ": [" + e.getSQLState() + "] " + e.getMessage());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1201 // print all error messages in the chain (if any)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1202 } while ((e = e.getNextException()) != null);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1203 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1204 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1205
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1206 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1207 * Wrapper method that decides to dump SQL or XML. In the latter case,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1208 * this method does the XML data generation.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1209 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1210 * @param out a Writer to write the data to
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1211 * @param table the table to dump
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1212 * @throws SQLException if a database related error occurs
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1213 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1214 private static void doDump(final PrintWriter out, final Table table) throws SQLException {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1215 final String tableType = table.getType();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1216
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1217 // dump CREATE definition of this table/view
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1218 exporter.dumpSchema(dbmd, tableType, table.getSchem(), table.getName());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1219 out.println();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1220
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1221 // only dump data from real tables, not from VIEWs / MERGE / REMOTE / REPLICA / STREAM tables
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1222 if (tableType.contains("TABLE")
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1223 && !tableType.equals("MERGE TABLE")
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1224 && !tableType.equals("REMOTE TABLE")
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1225 && !tableType.equals("REPLICA TABLE")
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1226 && !tableType.equals("STREAM TABLE")) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1227 final ResultSet rs = stmt.executeQuery("SELECT * FROM " + table.getFqnameQ());
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1228 if (rs != null) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1229 exporter.dumpResultSet(rs);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1230 rs.close();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1231 out.println();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1232 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1233 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1234 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1235
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1236 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1237 * Simple helper method that generates a prompt.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1238 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1239 * @param stack the current SQLStack
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1240 * @param compl whether the statement is complete
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1241 * @return a prompt which consist of "sql" plus the top of the stack
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1242 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1243 private static String getPrompt(final SQLStack stack, final boolean compl) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1244 return (compl ? "sql" : "more") + (stack.empty() ? ">" : stack.peek()) + " ";
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1245 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1246
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1247 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1248 * Scans the given string and tries to discover if it is a complete query
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1249 * or that there needs something to be added. If a string doesn't end with
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1250 * a ; it is considered not to be complete. SQL string quotation using ' and
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1251 * SQL identifier quotation using " is taken into account when scanning a
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1252 * string this way.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1253 * Additionally, this method removes comments from the SQL statements,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1254 * identified by -- and removes white space where appropriate.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1255 *
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1256 * @param query the query to parse
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1257 * @param stack query stack to work with
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1258 * @param scolonterm whether a ';' makes this query part complete
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1259 * @return a QueryPart object containing the results of this parse
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1260 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1261 private static QueryPart scanQuery(
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1262 final String query,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1263 final SQLStack stack,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1264 final boolean scolonterm)
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1265 {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1266 // examine string, char for char
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1267 final boolean wasInString = (stack.peek() == '\'');
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1268 final boolean wasInIdentifier = (stack.peek() == '"');
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1269 boolean escaped = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1270 int len = query.length();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1271 for (int i = 0; i < len; i++) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1272 switch(query.charAt(i)) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1273 case '\\':
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1274 escaped = !escaped;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1275 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1276 default:
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1277 escaped = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1278 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1279 case '\'':
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1280 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1281 * We can not be in a string if we are in an identifier. So
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1282 * If we find a ' and are not in an identifier, and not in
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1283 * a string we can safely assume we will be now in a string.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1284 * If we are in a string already, we should stop being in a
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1285 * string if we find a quote which is not prefixed by a \,
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1286 * for that would be an escaped quote. However, a nasty
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1287 * situation can occur where the string is like 'test \\'.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1288 * As obvious, a test for a \ in front of a ' doesn't hold
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1289 * here. Because 'test \\\'' can exist as well, we need to
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1290 * know if a quote is prefixed by an escaping slash or not.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1291 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1292 if (!escaped && stack.peek() != '"') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1293 if (stack.peek() != '\'') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1294 // although it makes no sense to escape a quote
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1295 // outside a string, it is escaped, thus not meant
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1296 // as quote for us, apparently
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1297 stack.push('\'');
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1298 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1299 stack.pop();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1300 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1301 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1302 // reset escaped flag
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1303 escaped = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1304 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1305 case '"':
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1306 if (!escaped && stack.peek() != '\'') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1307 if (stack.peek() != '"') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1308 stack.push('"');
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1309 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1310 stack.pop();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1311 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1312 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1313 // reset escaped flag
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1314 escaped = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1315 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1316 case '-':
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1317 if (!escaped && stack.peek() != '\'' && stack.peek() != '"' && i + 1 < len && query.charAt(i + 1) == '-') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1318 len = i;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1319 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1320 escaped = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1321 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1322 case '(':
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1323 if (!escaped && stack.peek() != '\'' && stack.peek() != '"') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1324 stack.push('(');
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1325 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1326 escaped = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1327 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1328 case ')':
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1329 if (!escaped && stack.peek() == '(') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1330 stack.pop();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1331 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1332 escaped = false;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1333 break;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1334 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1335 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1336
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1337 int start = 0;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1338 if (!wasInString && !wasInIdentifier && len > 0) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1339 // trim spaces at the start of the string
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1340 for (; start < len && Character.isWhitespace(query.charAt(start)); start++);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1341 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1342 int stop = len - 1;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1343 if (stack.peek() != '\'' && !wasInIdentifier && stop > start) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1344 // trim spaces at the end of the string
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1345 for (; stop >= start && Character.isWhitespace(query.charAt(stop)); stop--);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1346 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1347 stop++;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1348
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1349 if (start == stop) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1350 // we have an empty string
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1351 return new QueryPart(false, null, stack.peek() == '\'' || stack.peek() == '"');
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1352 } else if (stack.peek() == '\'' || stack.peek() == '"') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1353 // we have an open quote
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1354 return new QueryPart(false, query.substring(start, stop), true);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1355 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1356 // see if the string is complete
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1357 if (scolonterm && query.charAt(stop - 1) == ';') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1358 return new QueryPart(true, query.substring(start, stop), false);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1359 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1360 return new QueryPart(false, query.substring(start, stop), false);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1361 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1362 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1363 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1364 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1365
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1366 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1367 * A QueryPart is (a part of) a SQL query. In the QueryPart object information
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1368 * like the actual SQL query string, whether it has an open quote and the like
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1369 * is stored.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1370 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1371 final class QueryPart {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1372 private final boolean complete;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1373 private final String query;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1374 private final boolean open;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1375
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1376 QueryPart(final boolean complete, final String query, final boolean open) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1377 this.complete = complete;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1378 this.query = query;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1379 this.open = open;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1380 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1381
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1382 boolean isEmpty() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1383 return query == null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1384 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1385
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1386 boolean isComplete() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1387 return complete;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1388 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1389
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1390 String getQuery() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1391 return query;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1392 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1393
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1394 boolean hasOpenQuote() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1395 return open;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1396 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1397 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1398
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1399 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1400 * An SQLStack is a simple stack that keeps track of open brackets and
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1401 * (single and double) quotes in an SQL query.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1402 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1403 final class SQLStack {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1404 final StringBuilder stack = new StringBuilder();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1405
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1406 char peek() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1407 if (empty()) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1408 return '\0';
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1409 } else {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1410 return stack.charAt(stack.length() - 1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1411 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1412 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1413
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1414 char pop() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1415 final char tmp = peek();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1416 if (tmp != '\0') {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1417 stack.setLength(stack.length() - 1);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1418 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1419 return tmp;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1420 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1421
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1422 char push(char item) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1423 stack.append(item);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1424 return item;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1425 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1426
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1427 boolean empty() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1428 return stack.length() == 0;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1429 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1430 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1431
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1432 /**
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1433 * A Table represents an SQL table. All data required to
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1434 * generate a fully qualified name is stored, as well as dependency
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1435 * data.
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1436 */
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1437 final class Table {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1438 final String schem;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1439 final String name;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1440 final String type;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1441 final String fqname;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1442 final ArrayList<Table> needs = new ArrayList<Table>();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1443
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1444 Table(final String schem, final String name, final String type) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1445 this.schem = schem;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1446 this.name = name;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1447 this.type = type;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1448 this.fqname = schem + "." + name;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1449 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1450
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1451 void addDependency(final Table dependsOn) throws Exception {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1452 if (this.fqname.equals(dependsOn.fqname))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1453 throw new Exception("Cyclic dependency graphs are not supported (foreign key relation references self)");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1454
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1455 if (dependsOn.needs.contains(this))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1456 throw new Exception("Cyclic dependency graphs are not supported (foreign key relation a->b and b->a)");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1457
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1458 if (!needs.contains(dependsOn))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1459 needs.add(dependsOn);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1460 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1461
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1462 List<Table> requires(final List<Table> existingTables) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1463 if (existingTables == null || existingTables.isEmpty())
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1464 return new ArrayList<Table>(needs);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1465
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1466 final ArrayList<Table> req = new ArrayList<Table>();
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1467 for (Table n : needs) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1468 if (!existingTables.contains(n))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1469 req.add(n);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1470 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1471
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1472 return req;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1473 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1474
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1475 final String getSchem() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1476 return schem;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1477 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1478
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1479 final String getName() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1480 return name;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1481 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1482
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1483 final String getType() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1484 return type;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1485 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1486
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1487 final String getFqname() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1488 return fqname;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1489 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1490
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1491 final String getFqnameQ() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1492 return Exporter.dq(schem) + "." + Exporter.dq(name);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1493 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1494
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1495 public final String toString() {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1496 return fqname;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1497 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1498
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1499 static final Table findTable(final String schname, final String tblname, final List<Table> list) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1500 for (Table t : list) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1501 if (t.schem.equals(schname) && t.name.equals(tblname))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1502 return t;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1503 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1504 // not found
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1505 return null;
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1506 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1507
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1508 static final void checkForLoop(final Table table, final List<Table> parents) throws Exception {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1509 parents.add(table);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1510 for (int i = 0; i < table.needs.size(); i++) {
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1511 Table child = table.needs.get(i);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1512 if (parents.contains(child))
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1513 throw new Exception("Cyclic dependency graphs are not supported (cycle detected for " + child.fqname + ")");
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1514 checkForLoop(child, parents);
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1515 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1516 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1517 }
844139b33cdd Remove carriage returns (\r) from files.
Sjoerd Mullender <sjoerd@acm.org>
parents: 628
diff changeset
1518