/* Copyright 2011-2016 Google Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package com.google.security.zynamics.binnavi.Database.NodeParser; import com.google.security.zynamics.binnavi.Database.PostgreSQL.PostgreSQLHelpers; import com.google.security.zynamics.binnavi.disassembly.CReference; import com.google.security.zynamics.zylib.disassembly.IAddress; import com.google.security.zynamics.zylib.disassembly.ReferenceType; import java.sql.Array; import java.sql.ResultSet; import java.sql.SQLException; /** * Provides instruction data from a database. */ public final class SqlCodeNodeProvider implements ICodeNodeProvider { /** * The result set of the query that requested the instruction data. */ private final ResultSet m_resultSet; /** * Creates a new SQL provider object. * * @param resultSet The result set of the query that requested the instruction data. */ public SqlCodeNodeProvider(final ResultSet resultSet) { m_resultSet = resultSet; } @Override public IAddress getInstructionAddress() throws ParserException { try { return PostgreSQLHelpers.loadAddress(m_resultSet, "instruction_address"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public String getInstructionArchitecture() throws ParserException { try { return PostgreSQLHelpers.readString(m_resultSet, "architecture"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getBorderColor() throws ParserException { try { return m_resultSet.getInt("bordercolor"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getColor() throws ParserException { try { return m_resultSet.getInt("color"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public byte[] getData() throws ParserException { try { return m_resultSet.getBytes("instruction_data"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getExpressionTreeId() throws ParserException { try { return m_resultSet.getInt("expression_tree_id"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getExpressionTreeType() throws ParserException { try { return m_resultSet.getInt("expression_tree_type"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public IAddress getFunctionAddress() throws ParserException { try { return PostgreSQLHelpers.loadAddress(m_resultSet, "function_address"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public Integer getGlobalInstructionCommentId() throws ParserException { try { final int instructionCommentId = m_resultSet.getInt("global_instruction_comment"); if (m_resultSet.wasNull()) { return null; } return instructionCommentId; } catch (final SQLException e) { throw new ParserException(e); } } @Override public Integer getLocalInstructionCommentId() throws ParserException { try { final int localInstructionCommentId = m_resultSet.getInt("local_instruction_comment"); if (m_resultSet.wasNull()) { return null; } return localInstructionCommentId; } catch (final SQLException e) { throw new ParserException(e); } } @Override public Integer getGlobalNodeCommentId() throws ParserException { try { final int globalCodeNodeCommentId = m_resultSet.getInt("global_code_node_comment"); if (m_resultSet.wasNull()) { return null; } return globalCodeNodeCommentId; } catch (final SQLException e) { throw new ParserException(e); } } @Override public Integer getLocalNodeCommentId() throws ParserException { try { final int localCommentId = m_resultSet.getInt("local_code_node_comment"); if (m_resultSet.wasNull()) { return null; } return localCommentId; } catch (final SQLException exception) { throw new ParserException(exception); } } @Override public double getHeight() throws ParserException { try { return m_resultSet.getDouble("height"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public String getImmediate() throws ParserException { try { return PostgreSQLHelpers.readString(m_resultSet, "immediate"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public String getMnemonic() throws ParserException { try { return PostgreSQLHelpers.readString(m_resultSet, "mnemonic"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getModule() throws ParserException { try { return m_resultSet.getInt("module_id"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getNodeId() throws ParserException { try { return m_resultSet.getInt("node_id"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public Integer getOperandPosition() throws ParserException { try { final int position = m_resultSet.getInt("operand_position"); return m_resultSet.wasNull() ? null : position; } catch (final SQLException e) { throw new ParserException(e); } } @Override public IAddress getParentFunction() throws ParserException { try { return PostgreSQLHelpers.loadAddress(m_resultSet, "parent_function"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getParentId() throws ParserException { try { return m_resultSet.getInt("expression_tree_parent_id"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public CReference getReference() throws ParserException { try { final IAddress address = PostgreSQLHelpers.loadAddress(m_resultSet, "target"); if (address != null) { return new CReference(PostgreSQLHelpers.loadAddress(m_resultSet, "target"), ReferenceType.valueOf(m_resultSet.getString("address_references_type").toUpperCase())); } else { return null; } } catch (final SQLException e) { throw new ParserException(e); } } @Override public String getReplacement() throws ParserException { try { return PostgreSQLHelpers.readString(m_resultSet, "replacement"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getSubstitutionOffset() throws ParserException { try { return m_resultSet.getInt("expression_types_offset"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public int getSubstitutionPosition() throws ParserException { try { return m_resultSet.getInt("expression_types_position"); } catch (final SQLException exception) { throw new ParserException(exception); } } @Override public Integer getSubstitutionTypeId() throws ParserException { try { final Integer typeId = m_resultSet.getInt("expression_types_type"); if (m_resultSet.wasNull()) { return null; } else { return typeId; } } catch (final SQLException e) { throw new ParserException(e); } } @Override public String getSymbol() throws ParserException { try { return PostgreSQLHelpers.readString(m_resultSet, "symbol"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public Integer getTypeInstanceId() throws ParserException { try { final Integer typeInstanceId = m_resultSet.getInt("type_instance_id"); if (m_resultSet.wasNull()) { return null; } else { return typeInstanceId; } } catch (final SQLException exception) { throw new ParserException(exception); } } @Override public double getWidth() throws ParserException { try { return m_resultSet.getDouble("width"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public double getX() throws ParserException { try { return m_resultSet.getDouble("x"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public double getY() throws ParserException { try { return m_resultSet.getDouble("y"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public boolean isAfterLast() throws ParserException { try { return m_resultSet.isAfterLast(); } catch (final SQLException e) { throw new ParserException(e); } } @Override public boolean isSelected() throws ParserException { try { return m_resultSet.getBoolean("selected"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public boolean isVisible() throws ParserException { try { return m_resultSet.getBoolean("visible"); } catch (final SQLException e) { throw new ParserException(e); } } @Override public boolean next() throws ParserException { try { return m_resultSet.next(); } catch (final SQLException e) { throw new ParserException(e); } } @Override public boolean prev() throws ParserException { try { return m_resultSet.previous(); } catch (final SQLException e) { throw new ParserException(e); } } @Override public Integer[] getSubstitutionPath() throws ParserException { try { final Array array = m_resultSet.getArray("expression_types_path"); if (m_resultSet.wasNull()) { return new Integer[0]; } else { return (Integer[]) array.getArray(); } } catch (final SQLException exception) { throw new ParserException(exception); } } }