/*
This program 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 3 of the License, or
(at your option) any later version.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
Copyright 2015 Jose A. Gonzalez Cervera
Copyright 2015 Juan A. Fernández Sánchez
*/
package butterflydevs.brainstudio.extras;
import android.content.Context;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class ConexionServidor {
private List<String> ranking;
private List<Jugador> rankingJugadores;
public ConexionServidor(){
System.out.println("START CLIENT");
this.ranking=new ArrayList();
this.rankingJugadores=new ArrayList();
}
public String recorteNombre(String nombre){
//Esto siempre dependerá de nuestra base de datos.
if(nombre.length()>10) {
return nombre.substring(0, 9);
}else{
return nombre;
}
}
String alias, pais;
int puntos;
String idUser;
/*
1. Crear usuario en la BD.
*/
public void crearUsuarioBD(String alias, int puntos, String pais, String idUser){
this.alias=alias;
this.puntos=puntos;
this.idUser=idUser;
this.pais=pais;
//Lanzamos la conexión a la base de datos y la petición de los datos en una hebra (debe de ser así para que funcione):
sqlThreadaddUser.start();
//Forzamos a que la ejecución de la hebra termine antes de continuar:
try {
sqlThreadaddUser.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/*
4. actualizar.
*/
public void actualizarNombre(String nuevoNombre, String idUser){
alias=nuevoNombre;
this.idUser=idUser;
//Lanzamos la conexión a la base de datos y la petición de los datos en una hebra (debe de ser así para que funcione):
sqlThreadactualizarNombre.start();
//Forzamos a que la ejecución de la hebra termine antes de continuar:
try {
sqlThreadactualizarNombre.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private boolean existe=true;
/*
2. Comprueba usuario.
*/
public boolean existeUsuario(String idUser){
this.idUser=idUser;
//Lanzamos la conexión a la base de datos y la petición de los datos en una hebra (debe de ser así para que funcione):
sqlThreadexisteUsuario.start();
//Forzamos a que la ejecución de la hebra termine antes de continuar:
try {
sqlThreadexisteUsuario.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
return existe;
}
/*
5. Perdir ranking.
*/
public List<Jugador> pedirRankingNueva(){
//Lanzamos la conexión a la base de datos y la petición de los datos en una hebra (debe de ser así para que funcione):
sqlThreadpedirRanking.start();
//Forzamos a que la ejecución de la hebra termine antes de continuar:
try {
sqlThreadpedirRanking.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//Devolvemos el ranking que es una variable privada de clase
if(rankingJugadores.isEmpty())
return null;
else
return rankingJugadores;
}
/**
* 3.
* Actualiza los puntos de un jugador en la BD usando nueva puntuacion y el id de su
* dispositivo.
* @param nuevaPuntuacion Nueva puntuacion con la que actualizar la actual.
* @param idUser Identificado con el que distinguir unívocamente al user en la BD.
*/
public void actualizarPuntuacionEnBD(int nuevaPuntuacion, String idUser){
this.puntos=nuevaPuntuacion;
this.idUser=idUser;
//Lanzamos la conexión a la base de datos y la petición de los datos en una hebra (debe de ser así para que funcione):
sqlThreadactualizarPuntuacionENBD.start();
//Forzamos a que la ejecución de la hebra termine antes de continuar:
try {
sqlThreadactualizarPuntuacionENBD.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Thread sqlThreadactualizarPuntuacionENBD = new Thread() {
public void run() {
try{
Context mContext;
//Registramos el driver:
System.out.println(Class.forName("org.postgresql.Driver"));
System.out.println("Cargado driver de la base de datos!!");
}
catch(java.lang.ClassNotFoundException e){
System.err.println("Imposible encontrar driver del motor: ");
e.printStackTrace();
}
String url=Claves.url;
String username=Claves.username;
String password=Claves.password;
try{
System.out.println("Ejecutando la conexión");
//Establecemos la conexión:
Connection db = DriverManager.getConnection(url, username, password);
Statement st = db.createStatement();
//Para insertar una columna que sea id_user
String modificacion1="UPDATE puntuaciones SET puntuacion = '"+puntos+"' WHERE id_user= '"+idUser+"';";
/*Si usamos executeQuery aunque la operación se realice bien nos dará un error por que la
consulta no reotorna nigún resultado.
*/
st.executeUpdate(modificacion1);
st.close();
db.close();
System.out.println("Conexión terminada");
}catch (java.sql.SQLException e) {
System.out.println(e.getMessage()+e.getErrorCode()+e);
}
}
};
//Hebra que se ejecuta realizando una acción en pararlelo a la ejecución normal del programa.
Thread sqlThreadpedirRanking = new Thread() {
public void run() {
try{
Context mContext;
//Registramos el driver:
System.out.println(Class.forName("org.postgresql.Driver"));
System.out.println("Cargado driver de la base de datos!!");
}
catch(java.lang.ClassNotFoundException e){
System.err.println("Imposible encontrar driver del motor: ");
e.printStackTrace();
}
String url=Claves.url;
String username=Claves.username;
String password=Claves.password;
try{
System.out.println("Ejecutando la conexión");
//Establecemos la conexión:
Connection db = DriverManager.getConnection(url, username, password);
Statement st = db.createStatement();
//Creamos la tabla
//String orden="CREATE TABLE puntuaciones (nombre varchar(10), puntuacion integer)";
//Introducimos datos
//ResultSet rs = st.executeQuery("INSERT INTO puntuaciones VALUES ( 'pepe', 47857)");
ResultSet rs = st.executeQuery("SELECT * FROM puntuaciones ORDER BY puntuacion DESC");
while (rs.next()) {
//Mostramos por terminal
System.out.print("Nombre: ");
System.out.println(rs.getString(1));
System.out.print("Puntuacion: ");
System.out.println(rs.getString(2));
//Cargamos los datos que obtenemos en la variable ranking propia del objeto que luego devolveremos:
// ranking.add(rs.getString(1)+" "+rs.getString(2));
//Probamos una nueva forma
rankingJugadores.add(new Jugador(rs.getString(1), rs.getInt(2), rs.getString(3)));
}
System.out.println("añadidos "+ranking.size()+" elementos a ranking");
rs.close();
st.close();
db.close();
System.out.println("Conexión terminada");
}catch (java.sql.SQLException e) {
System.out.println(e.getMessage()+e.getErrorCode()+e);
}
}
};
//Hebra que se ejecuta realizando una acción en pararlelo a la ejecución normal del programa.
Thread sqlThreadaddUser = new Thread() {
public void run() {
System.out.println("Usuario nuevo en la base de datos");
try{
Context mContext;
//Registramos el driver:
System.out.println(Class.forName("org.postgresql.Driver"));
System.out.println("Cargado driver de la base de datos!!");
}
catch(java.lang.ClassNotFoundException e){
System.err.println("Imposible encontrar driver del motor: ");
e.printStackTrace();
}
String url=Claves.url;
String username=Claves.username;
String password=Claves.password;
try{
System.out.println("Ejecutando la conexión");
//Establecemos la conexión:
Connection db = DriverManager.getConnection(url, username, password);
Statement st = db.createStatement();
//Para insertar un usuario en la BD.
//String query="INSERT INTO puntuaciones VALUES ('"+alias+"','"+puntos+"','"+pais+"','"+idUser+"')";
//String query="INSERT INTO puntuaciones VALUES ('prueba','200','UGR','8848873626')";
String query="INSERT INTO puntuaciones VALUES ('"+alias+"','"+puntos+"','"+pais+"','"+idUser+"')";
/*Si usamos executeQuery aunque la operación se realice bien nos dará un error por que la
consulta no reotorna nigún resultado.
*/
st.executeUpdate(query);
st.close();
db.close();
System.out.println("Conexión terminada");
}catch (java.sql.SQLException e) {
System.out.println(e.getMessage()+e.getErrorCode()+e);
}
}
};
//Hebra que se ejecuta realizando una acción en pararlelo a la ejecución normal del programa.
Thread sqlThreadactualizarNombre = new Thread() {
public void run() {
try{
Context mContext;
//Registramos el driver:
System.out.println(Class.forName("org.postgresql.Driver"));
System.out.println("Cargado driver de la base de datos!!");
}
catch(java.lang.ClassNotFoundException e){
System.err.println("Imposible encontrar driver del motor: ");
e.printStackTrace();
}
String url=Claves.url;
String username=Claves.username;
String password=Claves.password;
try{
System.out.println("Ejecutando la conexión");
//Establecemos la conexión:
Connection db = DriverManager.getConnection(url, username, password);
Statement st = db.createStatement();
//Para insertar una columna que sea id_user
String query="UPDATE puntuaciones SET nombre = '"+alias+"' WHERE id_user= '"+idUser+"';";
System.out.println(query);
/*Si usamos executeQuery aunque la operación se realice bien nos dará un error por que la
consulta no reotorna nigún resultado.
*/
st.executeUpdate(query);
st.close();
db.close();
System.out.println("Conexión terminada");
}catch (java.sql.SQLException e) {
System.out.println(e.getMessage()+e.getErrorCode()+e);
}
}
};
Thread sqlThreadexisteUsuario = new Thread() {
public void run() {
try{
//Registramos el driver:
System.out.println(Class.forName("org.postgresql.Driver"));
System.out.println("Cargado driver de la base de datos!!");
}
catch(java.lang.ClassNotFoundException e){
System.err.println("Imposible encontrar driver del motor: ");
e.printStackTrace();
}
String url=Claves.url;
String username=Claves.username;
String password=Claves.password;
try{
Connection db = DriverManager.getConnection(url, username, password);
Statement st = db.createStatement();
//Establecemos la query que vamos a usar.
String query2="SELECT * FROM puntuaciones WHERE id_user="+idUser;
System.out.println(query2);
//String query="INSERT INTO puntuaciones VALUES ( '"+nombre+"', '"+puntuacion+"', '"+pais+"', '"+idUser+"')";
//Ejecutamos la consulta y guardamos los datos en rs
ResultSet rs = st.executeQuery(query2);
if(!rs.isBeforeFirst())
existe=false;
//Cerramos todos los objetos que lo necesitan.
st.close();
db.close();
}catch (java.sql.SQLException e) {
System.out.println(e.getMessage()+e.getErrorCode()+e);
}
}
};
}