package com.basic.security.manager.erlang; import android.database.SQLException; import com.basic.security.manager.DatabaseManager; import com.basic.security.utils.Constants; import com.basic.security.utils.DateUtil; import com.ericsson.otp.erlang.OtpConnection; import com.ericsson.otp.erlang.OtpErlangList; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangString; import com.ericsson.otp.erlang.OtpErlangTuple; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; public class SqliteManager { public static List> queryFromSync(OtpConnection connection, String sql) { return query(connection, sql, Constants.syncDatabasePath); } public static void executeInSync(OtpConnection connection, String sql) { execute(connection, sql, Constants.syncDatabasePath); } public static List> queryFromCache(OtpConnection connection, String sql) { return query(connection, sql, Constants.cacheDatabasePath); } public static void executeInCache(OtpConnection connection, String sql) { String sqlCacheInsertSql = "INSERT INTO SqlCache " + "(uuid, func, sql, create_by,create_time) " + "values (\"" + UUID.randomUUID().toString() + "\",\"test\" ,\"" + sql + "\",\"" + Constants.erlangLocalNode + "\",\"" + DateUtil.getDateTimeStrFull() + "\");"; execute(connection, sqlCacheInsertSql, Constants.cacheDatabasePath); } public static void executeConfirmInCache(OtpConnection connection, String sql) { execute(connection, sql, Constants.cacheDatabasePath); } public static void execute(OtpConnection connection, String sql, String databaseName) { if (ErlangProcess.erlangProcessCanStart) { try { if (connection != null && connection.isConnected()) { connection.sendRPC("sqlite", "execute", new OtpErlangObject[]{ new OtpErlangString(sql), new OtpErlangString(databaseName), new OtpErlangString(UUID.randomUUID().toString()) }); OtpErlangObject oeo = connection.receive(); // System.out.println("SqliteManager execute " + oeo); } } catch (Exception e) { e.printStackTrace(); } } else { try { DatabaseManager.getDatabase(databaseName).execSQL(sql); } catch (SQLException e) { e.printStackTrace(); } } } private static List> query(OtpConnection connection, String sql, String databaseName) { List> dataRowList = new ArrayList<>(); try { if (connection != null && connection.isConnected()) { connection.sendRPC("sqlite", "query", new OtpErlangObject[]{ new OtpErlangString(sql), new OtpErlangString(databaseName) }); OtpErlangObject oeo = connection.receive(); if (oeo instanceof OtpErlangTuple) { OtpErlangTuple oet = (OtpErlangTuple) oeo; OtpErlangObject[] elems = oet.elements(); if (elems.length == 2 && elems[1] instanceof OtpErlangList) { OtpErlangList oel = (OtpErlangList) elems[1]; OtpErlangObject[] rows = oel.elements(); for (OtpErlangObject row : rows) { Map dataRow = new HashMap<>(); if (row instanceof OtpErlangList) { OtpErlangObject[] columns = ((OtpErlangList) row).elements(); for (OtpErlangObject column : columns) { if (column instanceof OtpErlangTuple) { OtpErlangObject[] theColumn = ((OtpErlangTuple) column).elements(); if (theColumn.length == 2 && theColumn[0] instanceof OtpErlangString && theColumn[1] instanceof OtpErlangString) { String key = ((OtpErlangString) theColumn[0]).stringValue(); String value = ((OtpErlangString) theColumn[1]).stringValue(); dataRow.put(key, value); } } } } if (dataRow.size() > 0) { dataRowList.add(dataRow); } } } } } } catch (Exception e) { e.printStackTrace(); } return dataRowList; } }