/*
* ConexionTXT.java
*
*
* Created on 2004
* Created by Arsenio Molinero
* Copyright (C) 2004, 2005 Arsenio Molinero
*
* GestDB - a Java multi database client
*
* This file is part of GestDB.
*
* GestDB is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* GestDB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GestDB; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.GestDB.sql;
import java.util.*;
import java.io.*;
import java.sql.*;
import com.GestDB.convert.wizarExportarDatosTXT;
import com.GestDB.convert.ImportarTXT;
import com.GestDB.*;
import com.GestDB.general.Trackbug;
import com.utils.*;
/**
*
* @author amolinero
*/
public class ConexionTXT {
public static void main(String args[]) {
new ConexionTXT(args).start();
}
/** Creates a new instance of ConexionTXT */
public ConexionTXT(String args[]) {
this.args = args;
try {
if(args.length > 2)
{
if(args[1].toLowerCase().equals("-out"))
{
// saca la salida estandar a un archivo
System.setOut(new java.io.PrintStream(new java.io.FileOutputStream(args[2]),true));
System.setErr(new java.io.PrintStream(new java.io.FileOutputStream(args[2]+"_err.txt"),true));
if(args.length > 4 && args[3].toLowerCase().equals("-in"))
{
// saca la salida estandar a un archivo
System.setIn(new java.io.FileInputStream(args[4]));
}
}
if(args[1].toLowerCase().equals("-in"))
{
// saca la salida estandar a un archivo
System.setIn(new java.io.FileInputStream(args[2]));
if(args.length > 4 && args[3].toLowerCase().equals("-out"))
{
// saca la salida estandar a un archivo
System.setOut(new java.io.PrintStream(new java.io.FileOutputStream(args[4]),true));
System.setErr(new java.io.PrintStream(new java.io.FileOutputStream(args[4]+"_err.txt"),true));
}
}
}
try {
// cargar las librerias dinamicamente.
Gestor.CargarLibrerias(this.getClass());
}catch(IOException ioe)
{
Trackbug.error(ioe, ioe.getMessage());
}
}catch(FileNotFoundException fne)
{
System.out.println(Gestor.GetLiteral("gestor.error_1","Error") + ": " + fne.getMessage());
}
}
public void start()
{
String buffer = "";
String stemp = "";
char comando = 0;
boolean finrun = false;
// carga las propiedades
Gestor.CargaPropiedades(this.getClass());
// carga las conexiones
pConexiones = Gestor.CargaConexiones(this.getClass());
if(Gestor.propiedades.containsKey("gestor.language"))
Gestor.CargaIdioma(this.getClass(),(String)Gestor.propiedades.get("gestor.language"));
else
Gestor.CargaIdioma(this.getClass(),"spanish");
System.out.println("--------------------------------------------------------------------------------");
System.out.println("GestDB " + Gestor.Version + " " + Gestor.GetLiteral("conexiontxt.title","modo linea de comandos"));
System.out.println("--------------------------------------------------------------------------------");
// se le pide al usuario que seleccione la conexi�n
SelectConexionTXT sc = new SelectConexionTXT();
sc.run();
System.out.println("--------------------------------------------------------------------------------");
System.out.println(Gestor.GetLiteral("conexiontxt.user","Usuario") + " " + sc.nombre );
while(!finrun)
{
System.out.println("--------------------------------------------------------------------------------");
System.out.println(Gestor.GetLiteral("conexiontxt.comand1","Query. '-T' Tablas. '-E' Exportar. '-I' Importar. '-C' Configurar. '-S' Salir."));
System.out.println("--------------------------------------------------------------------------------");
buffer = LeeLinea();
if(buffer.length() > 0)
{
if(buffer.charAt(0) == '-')
comando = buffer.charAt(1);
else
comando = 'Q';
switch(comando)
{
case 'S':
case 's':
System.exit(0);
break;
case 'Q':
String query = buffer;
LanzaQuery(query);
break;
case 't':
case 'T':
Tablas();
break;
case 'c':
case 'C':
System.out.println("-------------");
System.out.println(Gestor.GetLiteral("conexiontxt.config","Configuracion2"));
System.out.println("-------------");
System.out.println(Gestor.GetLiteral("conexiontxt.config_h1","Esta opcion le permite indicar los registros que se veran en cada pantallazo."));
System.out.println(Gestor.GetLiteral("conexiontxt.config_h2","Tambien le permite indicar cuantos caracteres de ancho tiene la pantalla, este dato hara que se corten los resultados cuando sean mas anchos que el ancho indicado."));
do {
System.out.print(Gestor.GetLiteral("conexiontxt.reg_screen","Registros por pantalla") + " (" + numPaginacion + "): ");
buffer = LeeLinea();
if(buffer.length() > 0)
{
try {
numPaginacion = Integer.parseInt(buffer);
} catch(java.lang.NumberFormatException nu)
{
System.out.print((char)7);
continue;
}
}
} while(numPaginacion < 1);
do {
System.out.print(Gestor.GetLiteral("conexiontxt.width_screen","Ancho de pantalla") + " (" + numAncho + "): ");
buffer = LeeLinea();
if(buffer.length() > 0)
{
try {
numAncho = Integer.parseInt(buffer);
} catch(java.lang.NumberFormatException nu)
{
System.out.print((char)7);
continue;
}
}
} while(numAncho < 1);
break;
case 'e':
case 'E':
wizarExportarDatosTXT wz = new wizarExportarDatosTXT();
wz.run();
break;
case 'i':
case 'I':
ImportarTXT imp = new ImportarTXT();
imp.run();
break;
}
}
} // fin while(!finrun)
}
private void LanzaQuery(String query)
{
if ( query == null || query.length() == 0 )
{
System.out.println(Gestor.GetLiteral("conexiontxt.error_1","Error: Tiene que introducir una sentencia SQL correcta."));
return;
}
try
{
Statement statement = null;
ResultSet resultSet = null;
ResultSetMetaData metaData;
boolean Actualizable = false;
String columnNames = "";
Class[] columnTypes = {};
if(connection == null)
{
//get connection
Class.forName(SelectConexionTXT.jdbcDriverClass);
if(SelectConexionTXT.user != null && SelectConexionTXT.user.trim().length() != 0)
connection = DriverManager.getConnection(SelectConexionTXT.jdbcDriverURL, SelectConexionTXT.user, SelectConexionTXT.password);
else
connection = DriverManager.getConnection(SelectConexionTXT.jdbcDriverURL);
}
// hay que asegurarse que el comando es una select
String query2 = new String(query);
query2 = query2.toUpperCase();
String stemp = "";
if( query2.indexOf("SELECT ") != -1 && query2.indexOf("INSERT ") == -1 && query2.indexOf("UPDATE ") == -1 && query2.indexOf("DELETE ") == -1)
{
statement = connection.createStatement();
resultSet = statement.executeQuery(query);
metaData = resultSet.getMetaData();
int numberOfColumns = metaData.getColumnCount();
columnTypes = new Class[numberOfColumns];
String guiones = "";
columnNames = "";
for(int column = 0; column < numberOfColumns; column++)
{
stemp = metaData.getColumnLabel(column+1);
columnNames += stemp + "|";
guiones += utilidades.AddCadena("",stemp.length(),"-") + " ";
columnTypes[column] = columnTypeToColumnClass(metaData.getColumnType(column+1),SelectConexionTXT.jdbcDriverURL);
}
System.out.println(utilidades.AddCadena(guiones,numAncho," "));
System.out.println(utilidades.AddCadena(columnNames,numAncho," "));
System.out.println(utilidades.AddCadena(guiones,numAncho," "));
Object obj = null;
try {
long nActualizar = 0;
while (resultSet.next())
{
nActualizar++;
if(nActualizar%numPaginacion == 0)
{
// se hace una pausa.
System.out.println((nActualizar-numPaginacion) + " " +
Gestor.GetLiteral("conexiontxt.run_query_to","al") + " " + (nActualizar-1) +
Gestor.GetLiteral("conexiontxt.run_query_intro_1","[intro] ver mas registros. Cualquier tecla y intro cancelar consulta."));
String buffer = LeeLinea();
if(buffer.length() > 0)
return;
else
{
System.out.println(utilidades.AddCadena(guiones,numAncho," "));
System.out.println(utilidades.AddCadena(columnNames,numAncho," "));
System.out.println(utilidades.AddCadena(guiones,numAncho," "));
}
}
stemp = "";
for (int i = 1; i <=numberOfColumns; i++)
{
if(stemp.length() > numAncho)
break;
obj = resultSet.getObject(i);
if(obj != null)
stemp += "[" + obj.toString() + "]";
else
stemp += "[null]";
}
System.out.println(utilidades.AddCadena(stemp,numAncho," "));
}
System.out.println("" + nActualizar + " " + Gestor.GetLiteral("conexiontxt.run_query_reg_showing","registros visualizados"));
} catch(Exception emen)
{
System.out.println(Gestor.GetLiteral("conexiontxt.run_query_fatal","A pasado") + ": " + emen.toString());
}
resultSet.close();
statement.close();
}
else // es una sentencia que no retorna registros
{
statement = connection.createStatement();
int resultado = statement.executeUpdate(query);
System.out.println(Gestor.GetLiteral("conexiontxt.run_query_result","Resultado") + ": " + resultado);
statement.close();
}
}
catch (ClassNotFoundException ex)
{
System.err.println(Gestor.GetLiteral("conexiontxt.error_2","No se encuentran las clases correspondientes al driver jdbc se la base de datos."));
}
catch (SQLException ex)
{
System.err.println(Gestor.GetLiteral("gestor.error_1","Error") + ": " + ex.getMessage());
}
}
public static Class columnTypeToColumnClass(int type, String jdbcDriverURL)
{
switch(type)
{
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
return String.class;
case Types.BIT:
return Boolean.class;
case Types.SMALLINT:
if(jdbcDriverURL.substring(5,5+"adabasd".length()).equals("adabasd"))
return Short.class;
else if(jdbcDriverURL.substring(5,5+"odbc".length()).equals("odbc"))
return Integer.class;
else
return Integer.class;
case Types.TINYINT:
case Types.INTEGER:
return Integer.class;
case Types.DECIMAL:
return Number.class;
case Types.NUMERIC:
return java.math.BigDecimal.class;
case Types.BIGINT:
return Long.class;
case Types.FLOAT:
case Types.REAL:
case Types.DOUBLE:
return Double.class;
case Types.DATE:
return java.sql.Date.class;
case Types.TIME:
return java.sql.Time.class;
case Types.TIMESTAMP:
return java.sql.Timestamp.class;
case Types.OTHER:
return Object.class;
default:
return Object.class;
}
}
public static String LeeLinea()
{
byte buffer[] = new byte[4086];
int pos = 0;
String resultado = "";
buffer[pos] = 0;
int leido = 0;
while(leido != -1 && leido != 13 && leido != 10)
{
try {
leido = System.in.read();
} catch(java.io.IOException ioe)
{
System.err.println(Gestor.GetLiteral("gestor.error_1","Error") + ": " + ioe.getMessage());
leido = -1;
}
if(leido != -1 && leido != 10 && leido != 13)
{
buffer[pos++] = (byte)leido;
}
if(leido == 13)
{
// hay que leer el 10
try {
leido = System.in.read();
} catch(java.io.IOException ioe)
{
System.err.println(Gestor.GetLiteral("gestor.error_1","Error") + ": " + ioe.getMessage());
leido = -1;
}
if(leido == -1 || leido != 10)
{
System.out.println(Gestor.GetLiteral("conexiontxt.error_3","Los intros de la entrada estandar tienen que ser de dos caracteres el chr(13) y chr(10)."));
System.exit(0);
}
}
}
if(pos > 0)
resultado = new String(buffer,0,pos);
return resultado.trim();
}
public static String LeeLineaOLD()
{
byte buffer[] = new byte[4086];
int leido = 0;
String resultado = "";
try {
leido = System.in.read(buffer);
} catch(java.io.IOException ioe)
{
System.err.println(Gestor.GetLiteral("gestor.error_1","Error") + ": " + ioe.getMessage());
}
if(leido > 0 && buffer[0] != 10 && buffer[0] != 13)
{
resultado = new String(buffer,0,leido);
// quita el intro
int pos = resultado.indexOf((char)13);
if(pos != -1)
resultado = resultado.substring(0,pos);
pos = resultado.indexOf((char)10);
if(pos != -1)
resultado = resultado.substring(0,pos);
}
return resultado.trim();
}
private void Tablas()
{
boolean fintablas = false;
HashMap hm = new HashMap();
try
{
if(connection == null)
{
//get connection
Class.forName(SelectConexionTXT.jdbcDriverClass);
if(SelectConexionTXT.user != null && SelectConexionTXT.user.trim().length() != 0)
connection = DriverManager.getConnection(SelectConexionTXT.jdbcDriverURL, SelectConexionTXT.user, SelectConexionTXT.password);
else
connection = DriverManager.getConnection(SelectConexionTXT.jdbcDriverURL);
}
DatabaseMetaData dbmd = connection.getMetaData();
String tabla = null;
String tipotabla = null;
String tiposdetabla[] = new String[1];
int numTiposTablas = 1;
tiposdetabla[0] = "TABLE";
ResultSet r2 = null;
while(!fintablas)
{
System.out.println("---------");
System.out.println(Gestor.GetLiteral("conexiontxt.tables","Tablas"));
System.out.println("---------");
r2 = dbmd.getTables(null, null, null,tiposdetabla);
int contador = 0;
int contador2 = 0;
hm.clear();
int caracteresColumna = (numAncho / 19);
while (r2.next())
{
contador++;
if(contador2 != 0 && contador2%numPaginacion == 0 && (contador-1)%caracteresColumna == 0)
{
// se hace una pausa.
if(contador < (numPaginacion*caracteresColumna))
System.out.println("\n1 " + Gestor.GetLiteral("conexiontxt.run_query_to","al") + " " + (contador-1) + " " + Gestor.GetLiteral("conexiontxt.run_query_intro_1","[intro] ver mas registros. Cualquier tecla y intro cancelar consulta."));
else
System.out.println("\n" + (contador-(numPaginacion*caracteresColumna)) + " " + Gestor.GetLiteral("conexiontxt.run_query_to","al") + " " + (contador-1) + " " + Gestor.GetLiteral("conexiontxt.run_query_intro_1","[intro] ver mas registros. Cualquier tecla y intro cancelar consulta."));
String buffer = LeeLinea();
if(buffer.length() > 0)
return;
}
tabla = r2.getString("TABLE_NAME");
hm.put(String.valueOf(contador), tabla);
System.out.print(utilidades.AddCadena("" + contador + " - " + tabla,18," ") + " ");
if(contador%caracteresColumna == 0)
{
System.out.println();
contador2++;
}
}
if(contador == 0)
{
System.out.println(Gestor.GetLiteral("conexiontxt.tables_not_found","No hay tablas"));
System.out.println("--------------------------------------------------------------------------------");
System.out.println(Gestor.GetLiteral("conexiontxt.comand2","'-V' Volver."));
System.out.println("--------------------------------------------------------------------------------");
}
else
{
System.out.println();
System.out.println("--------------------------------------------------------------------------------");
System.out.println(Gestor.GetLiteral("conexiontxt.comand3","'-T' Ver tablas '-V' Volver."));
System.out.println("--------------------------------------------------------------------------------");
}
r2.close();
String buffer = LeeLinea();
if(buffer == null || buffer.length() == 0 || buffer.toLowerCase().equals("-v"))
fintablas = true;
}
} catch(Exception e)
{
System.out.println(Gestor.GetLiteral("gestor.error_1","Error") + ": " + e.getMessage());
e.printStackTrace();
}
}
public static Properties pConexiones = null;
public static Connection connection = null;
public static int numPaginacion = 21;
public static int numAncho = 80;
private String args[] = null;
}