421 lines
11 KiB
Java

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<String> getCampaigns() {
DatabaseCursor cursor = null;
try {
cursor = dbHandler.rawQuery("select desc,date from worlds;");
} catch (SQLiteGdxException e) {
return null;
}
Array<String> returnvalue = new Array<String>();
while (cursor.next())
returnvalue.add(cursor.getString(0));
return returnvalue;
}
public Array<Level> 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<Level>(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<Level> 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<Transmuter> 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<Transmuter>(mc);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public boolean setTransmuters(int user, Array<Transmuter> 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<String> 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<String> returnvalue = new Array<String>();
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;
}
}