1
0
mirror of https://github.com/fabianonline/telegram_backup.git synced 2024-11-23 01:06:17 +00:00

New entries are saved with their JSON equivalent.

This commit is contained in:
Fabian Schlenz 2017-02-22 06:51:09 +01:00
parent fa53f4b4b5
commit 9f89c2ea91
8 changed files with 103 additions and 53 deletions

View File

@ -18,6 +18,7 @@ package de.fabianonline.telegram_backup;
import de.fabianonline.telegram_backup.TelegramUpdateHandler; import de.fabianonline.telegram_backup.TelegramUpdateHandler;
import de.fabianonline.telegram_backup.exporter.HTMLExporter; import de.fabianonline.telegram_backup.exporter.HTMLExporter;
import de.fabianonline.telegram_backup.models.Message;
import com.github.badoualy.telegram.api.Kotlogram; import com.github.badoualy.telegram.api.Kotlogram;
import com.github.badoualy.telegram.api.TelegramApp; import com.github.badoualy.telegram.api.TelegramApp;
@ -90,16 +91,7 @@ public class CommandLineController {
} }
} }
if (CommandLineOptions.val_test != null) {
if (CommandLineOptions.val_test == 1) {
TestFeatures.test1();
} else if (CommandLineOptions.val_test == 2) {
TestFeatures.test2(user, client);
} else {
System.out.println("Unknown test " + CommandLineOptions.val_test);
}
System.exit(1);
}
logger.debug("CommandLineOptions.val_export: {}", CommandLineOptions.val_export); logger.debug("CommandLineOptions.val_export: {}", CommandLineOptions.val_export);
if (CommandLineOptions.val_export != null) { if (CommandLineOptions.val_export != null) {
@ -126,6 +118,20 @@ public class CommandLineController {
logger.info("Initializing Download Manager"); logger.info("Initializing Download Manager");
DownloadManager d = new DownloadManager(user, client, new CommandLineDownloadProgress()); DownloadManager d = new DownloadManager(user, client, new CommandLineDownloadProgress());
if (CommandLineOptions.val_test != null) {
if (CommandLineOptions.val_test == 1) {
TestFeatures.test1();
} else if (CommandLineOptions.val_test == 2) {
TestFeatures.test2(user, client);
} else if (CommandLineOptions.val_test == 3) {
logger.debug(Message.get(39925).getMessage());
} else {
System.out.println("Unknown test " + CommandLineOptions.val_test);
}
System.exit(1);
}
logger.debug("Calling DownloadManager.downloadMessages with limit {}", CommandLineOptions.val_limit_messages); logger.debug("Calling DownloadManager.downloadMessages with limit {}", CommandLineOptions.val_limit_messages);
d.downloadMessages(CommandLineOptions.val_limit_messages); d.downloadMessages(CommandLineOptions.val_limit_messages);

View File

@ -21,6 +21,7 @@ import com.github.badoualy.telegram.tl.core.TLVector;
import com.github.badoualy.telegram.api.TelegramClient; import com.github.badoualy.telegram.api.TelegramClient;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import com.google.gson.Gson;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
@ -166,16 +167,16 @@ public class Database {
} }
} }
public synchronized void saveMessages(TLVector<TLAbsMessage> all, Integer api_layer) { public synchronized void saveMessages(TLVector<TLAbsMessage> all, Integer api_layer, Gson gson) {
try { try {
//"(id, dialog_id, from_id, from_type, text, time, has_media, data, sticker, type) " + //"(id, dialog_id, from_id, from_type, text, time, has_media, data, sticker, type) " +
//"VALUES " + //"VALUES " +
//"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); //"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
String columns = String columns =
"(id, message_type, dialog_id, chat_id, sender_id, fwd_from_id, text, time, has_media, media_type, media_file, media_size, data, api_layer) "+ "(id, message_type, dialog_id, chat_id, sender_id, fwd_from_id, text, time, has_media, media_type, media_file, media_size, data, api_layer, json) "+
"VALUES " + "VALUES " +
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 //1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
PreparedStatement ps = conn.prepareStatement("INSERT OR REPLACE INTO messages " + columns); PreparedStatement ps = conn.prepareStatement("INSERT OR REPLACE INTO messages " + columns);
PreparedStatement ps_insert_or_ignore = conn.prepareStatement("INSERT OR IGNORE INTO messages " + columns); PreparedStatement ps_insert_or_ignore = conn.prepareStatement("INSERT OR IGNORE INTO messages " + columns);
@ -232,6 +233,7 @@ public class Database {
msg.serializeBody(stream); msg.serializeBody(stream);
ps.setBytes(13, stream.toByteArray()); ps.setBytes(13, stream.toByteArray());
ps.setInt(14, api_layer); ps.setInt(14, api_layer);
ps.setString(15, gson.toJson(msg));
ps.addBatch(); ps.addBatch();
} else if (abs instanceof TLMessageService) { } else if (abs instanceof TLMessageService) {
ps_insert_or_ignore.setInt(1, abs.getId()); ps_insert_or_ignore.setInt(1, abs.getId());
@ -248,6 +250,7 @@ public class Database {
ps_insert_or_ignore.setNull(12, Types.INTEGER); ps_insert_or_ignore.setNull(12, Types.INTEGER);
ps_insert_or_ignore.setNull(13, Types.BLOB); ps_insert_or_ignore.setNull(13, Types.BLOB);
ps_insert_or_ignore.setInt(14, api_layer); ps_insert_or_ignore.setInt(14, api_layer);
ps_insert_or_ignore.setString(15, gson.toJson((TLMessageService)abs));
ps_insert_or_ignore.addBatch(); ps_insert_or_ignore.addBatch();
} else if (abs instanceof TLMessageEmpty) { } else if (abs instanceof TLMessageEmpty) {
ps_insert_or_ignore.setInt(1, abs.getId()); ps_insert_or_ignore.setInt(1, abs.getId());
@ -264,6 +267,7 @@ public class Database {
ps_insert_or_ignore.setNull(12, Types.INTEGER); ps_insert_or_ignore.setNull(12, Types.INTEGER);
ps_insert_or_ignore.setNull(13, Types.BLOB); ps_insert_or_ignore.setNull(13, Types.BLOB);
ps_insert_or_ignore.setInt(14, api_layer); ps_insert_or_ignore.setInt(14, api_layer);
ps_insert_or_ignore.setString(15, gson.toJson((TLMessageEmpty)abs));
ps_insert_or_ignore.addBatch(); ps_insert_or_ignore.addBatch();
} else { } else {
throw new RuntimeException("Unexpected Message type: " + abs.getClass().getName()); throw new RuntimeException("Unexpected Message type: " + abs.getClass().getName());
@ -282,18 +286,18 @@ public class Database {
} }
} }
public synchronized void saveChats(TLVector<TLAbsChat> all) { public synchronized void saveChats(TLVector<TLAbsChat> all, Gson gson) {
try { try {
PreparedStatement ps_insert_or_replace = conn.prepareStatement( PreparedStatement ps_insert_or_replace = conn.prepareStatement(
"INSERT OR REPLACE INTO chats " + "INSERT OR REPLACE INTO chats " +
"(id, name, type) "+ "(id, name, type, json) "+
"VALUES " + "VALUES " +
"(?, ?, ?)"); "(?, ?, ?, ?)");
PreparedStatement ps_insert_or_ignore = conn.prepareStatement( PreparedStatement ps_insert_or_ignore = conn.prepareStatement(
"INSERT OR IGNORE INTO chats " + "INSERT OR IGNORE INTO chats " +
"(id, name, type) "+ "(id, name, type, json) "+
"VALUES " + "VALUES " +
"(?, ?, ?)"); "(?, ?, ?, ?)");
for(TLAbsChat abs : all) { for(TLAbsChat abs : all) {
ps_insert_or_replace.setInt(1, abs.getId()); ps_insert_or_replace.setInt(1, abs.getId());
@ -301,22 +305,27 @@ public class Database {
if (abs instanceof TLChatEmpty) { if (abs instanceof TLChatEmpty) {
ps_insert_or_ignore.setNull(2, Types.VARCHAR); ps_insert_or_ignore.setNull(2, Types.VARCHAR);
ps_insert_or_ignore.setString(3, "empty_chat"); ps_insert_or_ignore.setString(3, "empty_chat");
ps_insert_or_ignore.setString(4, gson.toJson((TLChatEmpty)abs));
ps_insert_or_ignore.addBatch(); ps_insert_or_ignore.addBatch();
} else if (abs instanceof TLChatForbidden) { } else if (abs instanceof TLChatForbidden) {
ps_insert_or_replace.setString(2, ((TLChatForbidden)abs).getTitle()); ps_insert_or_replace.setString(2, ((TLChatForbidden)abs).getTitle());
ps_insert_or_replace.setString(3, "chat"); ps_insert_or_replace.setString(3, "chat");
ps_insert_or_replace.setString(4, gson.toJson((TLChatForbidden)abs));
ps_insert_or_replace.addBatch(); ps_insert_or_replace.addBatch();
} else if (abs instanceof TLChannelForbidden) { } else if (abs instanceof TLChannelForbidden) {
ps_insert_or_replace.setString(2, ((TLChannelForbidden)abs).getTitle()); ps_insert_or_replace.setString(2, ((TLChannelForbidden)abs).getTitle());
ps_insert_or_replace.setString(3, "channel"); ps_insert_or_replace.setString(3, "channel");
ps_insert_or_replace.setString(4, gson.toJson((TLChannelForbidden)abs));
ps_insert_or_replace.addBatch(); ps_insert_or_replace.addBatch();
} else if (abs instanceof TLChat) { } else if (abs instanceof TLChat) {
ps_insert_or_replace.setString(2, ((TLChat) abs).getTitle()); ps_insert_or_replace.setString(2, ((TLChat) abs).getTitle());
ps_insert_or_replace.setString(3, "chat"); ps_insert_or_replace.setString(3, "chat");
ps_insert_or_replace.setString(4, gson.toJson((TLChat) abs));
ps_insert_or_replace.addBatch(); ps_insert_or_replace.addBatch();
} else if (abs instanceof TLChannel) { } else if (abs instanceof TLChannel) {
ps_insert_or_replace.setString(2, ((TLChannel)abs).getTitle()); ps_insert_or_replace.setString(2, ((TLChannel)abs).getTitle());
ps_insert_or_replace.setString(3, "channel"); ps_insert_or_replace.setString(3, "channel");
ps_insert_or_replace.setString(4, gson.toJson((TLChannel)abs));
ps_insert_or_replace.addBatch(); ps_insert_or_replace.addBatch();
} else { } else {
throw new RuntimeException("Unexpected " + abs.getClass().getName()); throw new RuntimeException("Unexpected " + abs.getClass().getName());
@ -335,18 +344,18 @@ public class Database {
} }
} }
public synchronized void saveUsers(TLVector<TLAbsUser> all) { public synchronized void saveUsers(TLVector<TLAbsUser> all, Gson gson) {
try { try {
PreparedStatement ps_insert_or_replace = conn.prepareStatement( PreparedStatement ps_insert_or_replace = conn.prepareStatement(
"INSERT OR REPLACE INTO users " + "INSERT OR REPLACE INTO users " +
"(id, first_name, last_name, username, type, phone) " + "(id, first_name, last_name, username, type, phone, json) " +
"VALUES " + "VALUES " +
"(?, ?, ?, ?, ?, ?)"); "(?, ?, ?, ?, ?, ?, ?)");
PreparedStatement ps_insert_or_ignore = conn.prepareStatement( PreparedStatement ps_insert_or_ignore = conn.prepareStatement(
"INSERT OR IGNORE INTO users " + "INSERT OR IGNORE INTO users " +
"(id, first_name, last_name, username, type, phone) " + "(id, first_name, last_name, username, type, phone, json) " +
"VALUES " + "VALUES " +
"(?, ?, ?, ?, ?, ?)"); "(?, ?, ?, ?, ?, ?, ?)");
for (TLAbsUser abs : all) { for (TLAbsUser abs : all) {
if (abs instanceof TLUser) { if (abs instanceof TLUser) {
TLUser user = (TLUser)abs; TLUser user = (TLUser)abs;
@ -356,6 +365,7 @@ public class Database {
ps_insert_or_replace.setString(4, user.getUsername()); ps_insert_or_replace.setString(4, user.getUsername());
ps_insert_or_replace.setString(5, "user"); ps_insert_or_replace.setString(5, "user");
ps_insert_or_replace.setString(6, user.getPhone()); ps_insert_or_replace.setString(6, user.getPhone());
ps_insert_or_replace.setString(7, gson.toJson(user));
ps_insert_or_replace.addBatch(); ps_insert_or_replace.addBatch();
} else if (abs instanceof TLUserEmpty) { } else if (abs instanceof TLUserEmpty) {
ps_insert_or_ignore.setInt(1, abs.getId()); ps_insert_or_ignore.setInt(1, abs.getId());
@ -364,6 +374,7 @@ public class Database {
ps_insert_or_ignore.setNull(4, Types.VARCHAR); ps_insert_or_ignore.setNull(4, Types.VARCHAR);
ps_insert_or_ignore.setString(5, "empty_user"); ps_insert_or_ignore.setString(5, "empty_user");
ps_insert_or_ignore.setNull(6, Types.VARCHAR); ps_insert_or_ignore.setNull(6, Types.VARCHAR);
ps_insert_or_replace.setString(7, gson.toJson((TLUserEmpty)abs));
ps_insert_or_ignore.addBatch(); ps_insert_or_ignore.addBatch();
} else { } else {
throw new RuntimeException("Unexpected " + abs.getClass().getName()); throw new RuntimeException("Unexpected " + abs.getClass().getName());
@ -397,6 +408,19 @@ public class Database {
} }
} }
public String queryString(String query) {
String result = null;
try {
ResultSet rs = stmt.executeQuery(query);
rs.next();
result = rs.getString(1);
rs.close();
} catch (Exception e) {
logger.warn("Exception happened in queryString:", e);
}
return result;
}
public int getMessagesFromUserCount() { public int getMessagesFromUserCount() {
try { try {
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM messages WHERE sender_id=" + user_manager.getUser().getId()); ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM messages WHERE sender_id=" + user_manager.getUser().getId());

View File

@ -32,6 +32,7 @@ public class DatabaseUpdates {
register(new DB_Update_5(conn, db)); register(new DB_Update_5(conn, db));
register(new DB_Update_6(conn, db)); register(new DB_Update_6(conn, db));
register(new DB_Update_7(conn, db)); register(new DB_Update_7(conn, db));
register(new DB_Update_8(conn, db));
} }
public void doUpdates() { public void doUpdates() {
@ -301,3 +302,14 @@ class DB_Update_7 extends DatabaseUpdate {
stmt.executeUpdate("UPDATE messages SET api_layer=51"); stmt.executeUpdate("UPDATE messages SET api_layer=51");
} }
} }
class DB_Update_8 extends DatabaseUpdate {
public int getVersion() { return 8; }
public DB_Update_8(Connection conn, Database db) { super(conn, db); }
protected void _doUpdate() throws SQLException {
stmt.executeUpdate("ALTER TABLE messages ADD COLUMN json TEXT");
stmt.executeUpdate("ALTER TABLE chats ADD COLUMN json TEXT");
stmt.executeUpdate("ALTER TABLE users ADD COLUMN json TEXT");
}
}

View File

@ -212,14 +212,11 @@ public class DownloadManager {
//ObjectMapper om = new ObjectMapper(); //ObjectMapper om = new ObjectMapper();
//String json = om.writerWithDefaultPrettyPrinter().writeValueAsString(response.getMessages().get(1)); //String json = om.writerWithDefaultPrettyPrinter().writeValueAsString(response.getMessages().get(1));
Gson gson = Utils.getGson(); Gson gson = Utils.getGson();
String json = gson.toJson(response.getMessages());
System.out.println(json);
//System.exit(1);
prog.onMessageDownloaded(response.getMessages().size()); prog.onMessageDownloaded(response.getMessages().size());
//db.saveMessages(response.getMessages(), Kotlogram.API_LAYER); db.saveMessages(response.getMessages(), Kotlogram.API_LAYER, gson);
//db.saveChats(response.getChats()); db.saveChats(response.getChats(), gson);
//db.saveUsers(response.getUsers()); db.saveUsers(response.getUsers(), gson);
logger.trace("Sleeping"); logger.trace("Sleeping");
try { try {
TimeUnit.MILLISECONDS.sleep(Config.DELAY_AFTER_GET_MESSAGES); TimeUnit.MILLISECONDS.sleep(Config.DELAY_AFTER_GET_MESSAGES);

View File

@ -22,7 +22,10 @@ import com.github.badoualy.telegram.api.Kotlogram;
import com.github.badoualy.telegram.tl.api.*; import com.github.badoualy.telegram.tl.api.*;
import com.github.badoualy.telegram.tl.core.TLVector; import com.github.badoualy.telegram.tl.core.TLVector;
import com.google.gson.Gson;
import de.fabianonline.telegram_backup.Database; import de.fabianonline.telegram_backup.Database;
import de.fabianonline.telegram_backup.Utils;
import de.fabianonline.telegram_backup.UserManager; import de.fabianonline.telegram_backup.UserManager;
import de.fabianonline.telegram_backup.mediafilemanager.AbstractMediaFileManager; import de.fabianonline.telegram_backup.mediafilemanager.AbstractMediaFileManager;
import de.fabianonline.telegram_backup.mediafilemanager.FileManagerFactory; import de.fabianonline.telegram_backup.mediafilemanager.FileManagerFactory;
@ -31,6 +34,7 @@ class TelegramUpdateHandler implements UpdateCallback {
private UserManager user = null; private UserManager user = null;
private Database db = null; private Database db = null;
public boolean debug = false; public boolean debug = false;
private Gson gson = Utils.getGson();
public void setUser(UserManager user, TelegramClient client) { this.user = user; this.db = new Database(user, client, false);} public void setUser(UserManager user, TelegramClient client) { this.user = user; this.db = new Database(user, client, false);}
@ -41,8 +45,8 @@ class TelegramUpdateHandler implements UpdateCallback {
processUpdate(update, c); processUpdate(update, c);
if (debug) System.out.println(" " + update.getClass().getName()); if (debug) System.out.println(" " + update.getClass().getName());
} }
db.saveUsers(u.getUsers()); db.saveUsers(u.getUsers(), gson);
db.saveChats(u.getChats()); db.saveChats(u.getChats(), gson);
} }
public void onUpdatesCombined(TelegramClient c, TLUpdatesCombined u) { public void onUpdatesCombined(TelegramClient c, TLUpdatesCombined u) {
@ -51,8 +55,8 @@ class TelegramUpdateHandler implements UpdateCallback {
for(TLAbsUpdate update : u.getUpdates()) { for(TLAbsUpdate update : u.getUpdates()) {
processUpdate(update, c); processUpdate(update, c);
} }
db.saveUsers(u.getUsers()); db.saveUsers(u.getUsers(), gson);
db.saveChats(u.getChats()); db.saveChats(u.getChats(), gson);
} }
public void onUpdateShort(TelegramClient c, TLUpdateShort u) { public void onUpdateShort(TelegramClient c, TLUpdateShort u) {
@ -86,7 +90,7 @@ class TelegramUpdateHandler implements UpdateCallback {
null); null);
TLVector<TLAbsMessage> vector = new TLVector<TLAbsMessage>(TLAbsMessage.class); TLVector<TLAbsMessage> vector = new TLVector<TLAbsMessage>(TLAbsMessage.class);
vector.add(msg); vector.add(msg);
db.saveMessages(vector, Kotlogram.API_LAYER); db.saveMessages(vector, Kotlogram.API_LAYER, gson);
System.out.print('.'); System.out.print('.');
} }
@ -122,7 +126,7 @@ class TelegramUpdateHandler implements UpdateCallback {
null); null);
TLVector<TLAbsMessage> vector = new TLVector<TLAbsMessage>(TLAbsMessage.class); TLVector<TLAbsMessage> vector = new TLVector<TLAbsMessage>(TLAbsMessage.class);
vector.add(msg); vector.add(msg);
db.saveMessages(vector, Kotlogram.API_LAYER); db.saveMessages(vector, Kotlogram.API_LAYER, gson);
System.out.print('.'); System.out.print('.');
} }
@ -134,7 +138,7 @@ class TelegramUpdateHandler implements UpdateCallback {
TLAbsMessage abs_msg = ((TLUpdateNewMessage)update).getMessage(); TLAbsMessage abs_msg = ((TLUpdateNewMessage)update).getMessage();
TLVector<TLAbsMessage> vector = new TLVector<TLAbsMessage>(TLAbsMessage.class); TLVector<TLAbsMessage> vector = new TLVector<TLAbsMessage>(TLAbsMessage.class);
vector.add(abs_msg); vector.add(abs_msg);
db.saveMessages(vector, Kotlogram.API_LAYER); db.saveMessages(vector, Kotlogram.API_LAYER, gson);
System.out.print('.'); System.out.print('.');
if (abs_msg instanceof TLMessage) { if (abs_msg instanceof TLMessage) {
AbstractMediaFileManager fm = FileManagerFactory.getFileManager((TLMessage)abs_msg, user, client); AbstractMediaFileManager fm = FileManagerFactory.getFileManager((TLMessage)abs_msg, user, client);

View File

@ -180,7 +180,6 @@ public class Utils {
public static Gson getGson() { public static Gson getGson() {
return new GsonBuilder() return new GsonBuilder()
.registerTypeAdapter(TLBytes.class, new TLBytesSerializer()) .registerTypeAdapter(TLBytes.class, new TLBytesSerializer())
.setPrettyPrinting()
.create(); .create();
} }
} }

View File

@ -0,0 +1,23 @@
package de.fabianonline.telegram_backup.models;
import de.fabianonline.telegram_backup.Database;
import com.google.gson.JsonParser;
import com.google.gson.JsonObject;
public class Message {
protected static String tableName = "messages";
private JsonObject json;
public Message(String json) {
this.json = new JsonParser().parse(json).getAsJsonObject();
}
public static Message get(int id) {
String json = Database.getInstance().queryString("SELECT json FROM " + tableName + " WHERE id=" + id);
return new Message(json);
}
public String getMessage() {
return json.getAsJsonPrimitive("message").getAsString();
}
}

View File

@ -1,15 +0,0 @@
public class Message_c09be45f {
int flags;
boolean out;
boolean mentioned;
boolean mediaUnread;
boolean silent;
boolean post;
int fromId;
Peer toId;
String _constructor;
int date;
String message;
int id;
JsonElement media;
}