package fr.evolving.database; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.sql.Database; import com.badlogic.gdx.sql.DatabaseCursor; import com.badlogic.gdx.sql.DatabaseFactory; import com.badlogic.gdx.sql.SQLiteGdxException; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Base64Coder; import fr.evolving.automata.Grid; import fr.evolving.automata.Level; import fr.evolving.automata.Transmuter; public class LocalBase extends Base { private static Database dbHandler; private String databasename = "base.db"; private String creation; private String param; // Contructeur de la base de donnée public String getParam() { return this.param; } public LocalBase() { } public LocalBase(datatype model, String param) { super(model, param); String[] params = param.split(":"); this.param = param; if (params.length > 1) databasename = params[1]; switch (Gdx.app.getType()) { case Android: try { FileHandle newbase = Gdx.files.absolute("/data/data/fr.evolving.game.android/databases/"+ databasename); if (!newbase.exists()) { Gdx.app.log("Base", "Copie de la base de donnee android"); Gdx.files.internal("bases/" + databasename).copyTo(newbase); } } catch (Exception e1) { Gdx.app.error("Base", "Erreur de copie"); } break; case Desktop: Gdx.app.log("Base", "Copie de la base de donnee desktop"); FileHandle newbase = Gdx.files.local(databasename); try { if (!newbase.exists()) Gdx.files.internal("bases/" + databasename).copyTo(newbase); } catch (Exception e1) { Gdx.app.error("Base", "Erreur de copie"); } break; } if (dbHandler != null) Gdx.app.log("Local", "Reprise de la base '" + databasename + "', table:" + model.toString()); else { Gdx.app.log("Local", "Utilisation de la base '" + databasename + "', table:" + model.toString()); dbHandler = DatabaseFactory.getNewDatabase(databasename, 1, null, null); dbHandler.setupDatabase(); try { dbHandler.openOrCreateDatabase(); } catch (SQLiteGdxException e) { e.printStackTrace(); Gdx.app.log("Local", "Erreur à l'ouverture de la base"); } } try { if (model == datatype.statdata) creation = "create table if not exists stat (id integer)"; else if (model == datatype.userdata) { dbHandler .execSQL("CREATE TABLE if not exists locks(date DATETIME DEFAULT CURRENT_TIMESTAMP, level INTEGER NOT NULL, user INTEGER NOT NULL, PRIMARY KEY(level,user));"); dbHandler .execSQL("CREATE TABLE if not exists grids(date DATETIME DEFAULT CURRENT_TIMESTAMP, level INTEGER NOT NULL, user INTEGER NOT NULL, tag TEXT, object TEXT, PRIMARY KEY(level,user,date));"); dbHandler .execSQL("CREATE TABLE if not exists transmuters(date DATETIME DEFAULT CURRENT_TIMESTAMP, user INTEGER NOT NULL, object TEXT, PRIMARY KEY(user));"); dbHandler .execSQL("CREATE TABLE if not exists research(date DATETIME DEFAULT CURRENT_TIMESTAMP, user INTEGER NOT NULL, value INT, PRIMARY KEY(user));"); } else dbHandler .execSQL("CREATE TABLE if not exists worlds(date DATETIME DEFAULT CURRENT_TIMESTAMP, desc TEXT NOT NULL, object TEXT, PRIMARY KEY(desc));"); } catch (SQLiteGdxException e) { e.printStackTrace(); } } // Gestion model type gamedata public Array getCampaigns() { DatabaseCursor cursor = null; try { cursor = dbHandler.rawQuery("select desc,date from worlds;"); } catch (SQLiteGdxException e) { return null; } Array returnvalue = new Array(); while (cursor.next()) returnvalue.add(cursor.getString(0)); return returnvalue; } public Array getCampaign(String description) { DatabaseCursor cursor = null; try { cursor = dbHandler .rawQuery("select object from worlds where desc='" + description + "';"); } catch (SQLiteGdxException e) { return null; } Level[] mc = null; if (cursor.next()) try { byte[] bytes = Base64Coder.decodeLines(cursor.getString(0)); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ins = new ObjectInputStream(bais); mc = (Level[]) ins.readObject(); ins.close(); return new Array(mc); } catch (Exception e) { e.printStackTrace(); } return null; } public boolean deleteCampaign(String description) { try { dbHandler.rawQuery("delete from worlds where desc='" + description + "';"); } catch (SQLiteGdxException e) { return false; } return true; } public boolean setCampaign(Array world, String description) { String encoded = ""; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(world.toArray()); oos.flush(); oos.close(); bos.close(); byte[] bytes = bos.toByteArray(); encoded = Base64Coder.encodeLines(bytes); dbHandler.rawQuery("replace into worlds (desc,object) values ('" + description + "','" + encoded + "');"); } catch (Exception e) { return false; } return true; } // Gestion de données type userdata public boolean getLevellock(int user, int level) { DatabaseCursor cursor = null; try { cursor = dbHandler.rawQuery("select user from locks where user=" + user + " and level=" + level + ";"); } catch (SQLiteGdxException e) { return false; } if (cursor.next()) return true; else return false; } public boolean setLevelunlock(int user, int level) { try { dbHandler.rawQuery("insert into locks (user,level) values (" + user + "," + level + ");"); } catch (SQLiteGdxException e) { return false; } return true; } public Array getTransmuters(int user) { DatabaseCursor cursor = null; try { cursor = dbHandler .rawQuery("select object from transmuters where user=" + user + ";"); } catch (SQLiteGdxException e) { return null; } Transmuter[] mc = null; if (cursor.next()) try { byte[] bytes = Base64Coder.decodeLines(cursor .getString(0)); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ins = new ObjectInputStream(bais); mc = (Transmuter[]) ins.readObject(); ins.close(); return new Array(mc); } catch (Exception e) { e.printStackTrace(); } return null; } public boolean setTransmuters(int user, Array transmuters) { String encoded = ""; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(transmuters.toArray()); oos.flush(); oos.close(); bos.close(); byte[] bytes = bos.toByteArray(); encoded = Base64Coder.encodeLines(bytes); dbHandler .rawQuery("replace into transmuters (user,object) values (" + user + ",'" + encoded + "');"); } catch (Exception e) { return false; } return true; } public int getResearchpoint(int user) { DatabaseCursor cursor = null; try { cursor = dbHandler .rawQuery("select value from research where user=" + user + ";"); } catch (SQLiteGdxException e) { return 0; } if (cursor.next()) return cursor.getInt(0); else return 0; } public boolean setResearchpoint(int user, int point) { try { dbHandler.rawQuery("replace into research (user,value) values (" + user + "," + point + ");"); } catch (Exception e) { return false; } return true; } public Grid getGrid(int user, int level, int place) { DatabaseCursor cursor = null; try { cursor = dbHandler.rawQuery("select object from grids where user=" + user + " and level=" + level + " and tag is null order by date desc limit " + place + ",1;"); } catch (SQLiteGdxException e) { return null; } Grid mc = null; if (cursor.next()) try { byte[] bytes = Base64Coder.decodeLines(cursor .getString(0)); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ins = new ObjectInputStream(bais); mc = (Grid) ins.readObject(); ins.close(); return mc; } catch (Exception e) { e.printStackTrace(); } return null; } public Grid getGrid(int user, int level, String tag) { DatabaseCursor cursor = null; try { cursor = dbHandler.rawQuery("select object from grids where user=" + user + " and level=" + level + " and tag='" + tag + "' order by date desc limit 1;"); } catch (SQLiteGdxException e) { return null; } Grid mc = null; if (cursor.next()) try { byte[] bytes = Base64Coder.decodeLines(cursor .getString(0)); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ins = new ObjectInputStream(bais); mc = (Grid) ins.readObject(); ins.close(); return mc; } catch (Exception e) { e.printStackTrace(); } return null; } public boolean setGrid(int user, int level, Grid data) { String encoded = ""; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(data); oos.flush(); oos.close(); bos.close(); byte[] bytes = bos.toByteArray(); encoded = Base64Coder.encodeLines(bytes); dbHandler.rawQuery("insert into grids (user,level,object) values (" + user + "," + level + ",'" + encoded + "');"); } catch (Exception e) { return false; } return true; } public boolean setGrid(int user, int level, String tag, Grid data) { String encoded = ""; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(data); oos.flush(); oos.close(); bos.close(); byte[] bytes = bos.toByteArray(); encoded = Base64Coder.encodeLines(bytes); try { dbHandler.rawQuery("delete from grids where user=" + user + " and level=" + level + " and tag='" + tag + "';"); } catch (Exception e) { } dbHandler .rawQuery("insert into grids (user,level,tag,object) values (" + user + "," + level + ",'" + tag + "','" + encoded + "');"); return true; } catch (Exception e) { return false; } } public Array getGrids(int user, int level) { DatabaseCursor cursor = null; try { cursor = dbHandler.rawQuery("select date from grids where level=" + level + " and user=" + user + " and tag is null order by date desc;"); } catch (SQLiteGdxException e) { return null; } Array returnvalue = new Array(); while (cursor.next()) returnvalue.add(cursor.getString(0)); return returnvalue; } // Gestion type Stat // Commun public boolean Eraseall(datatype base) { try { dbHandler.execSQL("drop table if exists stat;"); dbHandler.execSQL("drop table if exists locks;"); dbHandler.execSQL("drop table if exists grids;"); dbHandler.execSQL("drop table if exists global;"); dbHandler.execSQL("drop table if exists worlds;"); return true; } catch (SQLiteGdxException e1) { return false; } } public void Close() { try { if (dbHandler != null) { dbHandler.closeDatabase(); dbHandler = null; } } catch (SQLiteGdxException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String getPrefix() { return "local"; } public static boolean isHandling(datatype base) { return true; } }