DatabaseFullPrunedBlockStore.smali

.class public abstract Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;
.super Ljava/lang/Object;
.source "DatabaseFullPrunedBlockStore.java"

# interfaces
.implements Lorg/bitcoinj/store/FullPrunedBlockStore;


# static fields
.field private static final CHAIN_HEAD_SETTING:Ljava/lang/String; = "chainhead"

.field private static final DELETE_OPENOUTPUTS_SQL:Ljava/lang/String; = "DELETE FROM openoutputs WHERE hash = ? AND index = ?"

.field private static final DELETE_UNDOABLEBLOCKS_SQL:Ljava/lang/String; = "DELETE FROM undoableblocks WHERE height <= ?"

.field private static final DROP_HEADERS_TABLE:Ljava/lang/String; = "DROP TABLE headers"

.field private static final DROP_OPEN_OUTPUT_TABLE:Ljava/lang/String; = "DROP TABLE openoutputs"

.field private static final DROP_SETTINGS_TABLE:Ljava/lang/String; = "DROP TABLE settings"

.field private static final DROP_UNDOABLE_TABLE:Ljava/lang/String; = "DROP TABLE undoableblocks"

.field private static final INSERT_HEADERS_SQL:Ljava/lang/String; = "INSERT INTO headers(hash, chainwork, height, header, wasundoable) VALUES(?, ?, ?, ?, ?)"

.field private static final INSERT_OPENOUTPUTS_SQL:Ljava/lang/String; = "INSERT INTO openoutputs (hash, index, height, value, scriptbytes, toaddress, addresstargetable, coinbase) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"

.field private static final INSERT_SETTINGS_SQL:Ljava/lang/String; = "INSERT INTO settings(name, value) VALUES(?, ?)"

.field private static final INSERT_UNDOABLEBLOCKS_SQL:Ljava/lang/String; = "INSERT INTO undoableblocks(hash, height, txoutchanges, transactions) VALUES(?, ?, ?, ?)"

.field private static final SELECT_BALANCE_SQL:Ljava/lang/String; = "select sum(value) from openoutputs where toaddress = ?"

.field private static final SELECT_CHECK_TABLES_EXIST_SQL:Ljava/lang/String; = "SELECT * FROM settings WHERE 1 = 2"

.field private static final SELECT_COMPATIBILITY_COINBASE_SQL:Ljava/lang/String; = "SELECT coinbase FROM openoutputs WHERE 1 = 2"

.field private static final SELECT_DUMP_HEADERS_SQL:Ljava/lang/String; = "SELECT chainwork, header FROM headers"

.field private static final SELECT_DUMP_OPENOUTPUTS_SQL:Ljava/lang/String; = "SELECT value, scriptbytes FROM openoutputs"

.field private static final SELECT_DUMP_SETTINGS_SQL:Ljava/lang/String; = "SELECT name, value FROM settings"

.field private static final SELECT_DUMP_UNDOABLEBLOCKS_SQL:Ljava/lang/String; = "SELECT txoutchanges, transactions FROM undoableblocks"

.field private static final SELECT_HEADERS_SQL:Ljava/lang/String; = "SELECT chainwork, height, header, wasundoable FROM headers WHERE hash = ?"

.field private static final SELECT_OPENOUTPUTS_COUNT_SQL:Ljava/lang/String; = "SELECT COUNT(*) FROM openoutputs WHERE hash = ?"

.field private static final SELECT_OPENOUTPUTS_SQL:Ljava/lang/String; = "SELECT height, value, scriptbytes, coinbase, toaddress, addresstargetable FROM openoutputs WHERE hash = ? AND index = ?"

.field private static final SELECT_SETTINGS_SQL:Ljava/lang/String; = "SELECT value FROM settings WHERE name = ?"

.field private static final SELECT_TRANSACTION_OUTPUTS_SQL:Ljava/lang/String; = "SELECT hash, value, scriptbytes, height, index, coinbase, toaddress, addresstargetable FROM openoutputs where toaddress = ?"

.field private static final SELECT_UNDOABLEBLOCKS_SQL:Ljava/lang/String; = "SELECT txoutchanges, transactions FROM undoableblocks WHERE hash = ?"

.field private static final UPDATE_HEADERS_SQL:Ljava/lang/String; = "UPDATE headers SET wasundoable=? WHERE hash=?"

.field private static final UPDATE_SETTINGS_SQL:Ljava/lang/String; = "UPDATE settings SET value = ? WHERE name = ?"

.field private static final UPDATE_UNDOABLEBLOCKS_SQL:Ljava/lang/String; = "UPDATE undoableblocks SET txoutchanges=?, transactions=? WHERE hash = ?"

.field private static final VERIFIED_CHAIN_HEAD_SETTING:Ljava/lang/String; = "verifiedchainhead"

.field private static final VERSION_SETTING:Ljava/lang/String; = "version"

.field private static final log:Lorg/slf4j/Logger;


# instance fields
.field protected allConnections:Ljava/util/List;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/util/List",
            "<",
            "Ljava/sql/Connection;",
            ">;"
        }
    .end annotation
.end field

.field protected chainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

.field protected chainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

.field protected conn:Ljava/lang/ThreadLocal;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/lang/ThreadLocal",
            "<",
            "Ljava/sql/Connection;",
            ">;"
        }
    .end annotation
.end field

.field protected connectionURL:Ljava/lang/String;

.field protected fullStoreDepth:I

.field protected params:Lorg/bitcoinj/core/NetworkParameters;

.field protected password:Ljava/lang/String;

.field protected schemaName:Ljava/lang/String;

.field protected username:Ljava/lang/String;

.field protected verifiedChainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

.field protected verifiedChainHeadHash:Lorg/bitcoinj/core/Sha256Hash;


# direct methods
.method static constructor <clinit>()V
    .registers 1

    .prologue
    .line 90
    const-class v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;

    invoke-static {v0}, Lorg/slf4j/LoggerFactory;->getLogger(Ljava/lang/Class;)Lorg/slf4j/Logger;

    move-result-object v0

    sput-object v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    return-void
.end method

.method public constructor <init>(Lorg/bitcoinj/core/NetworkParameters;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    .registers 10

    .prologue
    .line 164
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 165
    iput-object p1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->params:Lorg/bitcoinj/core/NetworkParameters;

    .line 166
    iput p3, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->fullStoreDepth:I

    .line 167
    iput-object p2, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->connectionURL:Ljava/lang/String;

    .line 168
    iput-object p6, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->schemaName:Ljava/lang/String;

    .line 169
    iput-object p4, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->username:Ljava/lang/String;

    .line 170
    iput-object p5, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->password:Ljava/lang/String;

    .line 171
    new-instance v0, Ljava/lang/ThreadLocal;

    invoke-direct {v0}, Ljava/lang/ThreadLocal;-><init>()V

    iput-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    .line 172
    new-instance v0, Ljava/util/LinkedList;

    invoke-direct {v0}, Ljava/util/LinkedList;-><init>()V

    iput-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->allConnections:Ljava/util/List;

    .line 175
    :try_start_1d
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getDatabaseDriverClass()Ljava/lang/String;

    move-result-object v0

    invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;

    .line 176
    sget-object v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getDatabaseDriverClass()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    const-string v2, " loaded. "

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V
    :try_end_40
    .catch Ljava/lang/ClassNotFoundException; {:try_start_1d .. :try_end_40} :catch_50

    .line 181
    :goto_40
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 185
    :try_start_43
    invoke-direct {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->tablesExists()Z

    move-result v0

    if-nez v0, :cond_59

    .line 186
    invoke-direct {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->createTables()V

    .line 190
    :goto_4c
    invoke-direct {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->initFromDatabase()V
    :try_end_4f
    .catch Ljava/sql/SQLException; {:try_start_43 .. :try_end_4f} :catch_5d

    .line 193
    return-void

    .line 177
    :catch_50
    move-exception v0

    .line 178
    sget-object v1, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    const-string v2, "check CLASSPATH for database driver jar "

    invoke-interface {v1, v2, v0}, Lorg/slf4j/Logger;->error(Ljava/lang/String;Ljava/lang/Throwable;)V

    goto :goto_40

    .line 188
    :cond_59
    :try_start_59
    invoke-direct {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->checkCompatibility()V
    :try_end_5c
    .catch Ljava/sql/SQLException; {:try_start_59 .. :try_end_5c} :catch_5d

    goto :goto_4c

    .line 191
    :catch_5d
    move-exception v0

    .line 192
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method private checkCompatibility()V
    .registers 6

    .prologue
    .line 501
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getCompatibilitySQL()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v3

    :cond_8
    :goto_8
    invoke-interface {v3}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_5c

    invoke-interface {v3}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/lang/String;

    .line 502
    const/4 v2, 0x0

    .line 504
    :try_start_15
    iget-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v1}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Ljava/sql/Connection;

    invoke-interface {v1, v0}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;
    :try_end_20
    .catch Ljava/sql/SQLException; {:try_start_15 .. :try_end_20} :catch_34
    .catchall {:try_start_15 .. :try_end_20} :catchall_5d

    move-result-object v1

    .line 505
    :try_start_21
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v0

    .line 506
    invoke-interface {v0}, Ljava/sql/ResultSet;->close()V
    :try_end_28
    .catch Ljava/sql/SQLException; {:try_start_21 .. :try_end_28} :catch_60
    .catchall {:try_start_21 .. :try_end_28} :catchall_4f

    .line 511
    if-eqz v1, :cond_8

    invoke-interface {v1}, Ljava/sql/PreparedStatement;->isClosed()Z

    move-result v0

    if-nez v0, :cond_8

    .line 512
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V

    goto :goto_8

    .line 507
    :catch_34
    move-exception v0

    move-object v1, v2

    .line 508
    :goto_36
    :try_start_36
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    new-instance v3, Ljava/lang/StringBuilder;

    const-string v4, "Database block store is not compatible with the current release.  See bitcoinj release notes for further information: "

    invoke-direct {v3, v4}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    .line 509
    invoke-virtual {v0}, Ljava/sql/SQLException;->getMessage()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v2
    :try_end_4f
    .catchall {:try_start_36 .. :try_end_4f} :catchall_4f

    .line 511
    :catchall_4f
    move-exception v0

    :goto_50
    if-eqz v1, :cond_5b

    invoke-interface {v1}, Ljava/sql/PreparedStatement;->isClosed()Z

    move-result v2

    if-nez v2, :cond_5b

    .line 512
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V

    :cond_5b
    throw v0

    .line 516
    :cond_5c
    return-void

    .line 511
    :catchall_5d
    move-exception v0

    move-object v1, v2

    goto :goto_50

    .line 507
    :catch_60
    move-exception v0

    goto :goto_36
.end method

.method private createNewStore(Lorg/bitcoinj/core/NetworkParameters;)V
    .registers 6

    .prologue
    .line 565
    :try_start_0
    new-instance v0, Lorg/bitcoinj/core/StoredBlock;

    invoke-virtual {p1}, Lorg/bitcoinj/core/NetworkParameters;->getGenesisBlock()Lorg/bitcoinj/core/Block;

    move-result-object v1

    invoke-virtual {v1}, Lorg/bitcoinj/core/Block;->cloneAsHeader()Lorg/bitcoinj/core/Block;

    move-result-object v1

    invoke-virtual {p1}, Lorg/bitcoinj/core/NetworkParameters;->getGenesisBlock()Lorg/bitcoinj/core/Block;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Block;->getWork()Ljava/math/BigInteger;

    move-result-object v2

    const/4 v3, 0x0

    invoke-direct {v0, v1, v2, v3}, Lorg/bitcoinj/core/StoredBlock;-><init>(Lorg/bitcoinj/core/Block;Ljava/math/BigInteger;I)V

    .line 2232
    new-instance v1, Ljava/util/LinkedList;

    invoke-direct {v1}, Ljava/util/LinkedList;-><init>()V

    .line 569
    new-instance v2, Lorg/bitcoinj/core/StoredUndoableBlock;

    invoke-virtual {p1}, Lorg/bitcoinj/core/NetworkParameters;->getGenesisBlock()Lorg/bitcoinj/core/Block;

    move-result-object v3

    invoke-virtual {v3}, Lorg/bitcoinj/core/Block;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v3

    invoke-direct {v2, v3, v1}, Lorg/bitcoinj/core/StoredUndoableBlock;-><init>(Lorg/bitcoinj/core/Sha256Hash;Ljava/util/List;)V

    .line 570
    invoke-virtual {p0, v0, v2}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->put(Lorg/bitcoinj/core/StoredBlock;Lorg/bitcoinj/core/StoredUndoableBlock;)V

    .line 571
    invoke-virtual {p0, v0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->setChainHead(Lorg/bitcoinj/core/StoredBlock;)V

    .line 572
    invoke-virtual {p0, v0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->setVerifiedChainHead(Lorg/bitcoinj/core/StoredBlock;)V
    :try_end_31
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_0 .. :try_end_31} :catch_32

    .line 575
    return-void

    .line 573
    :catch_32
    move-exception v0

    .line 574
    new-instance v1, Ljava/lang/RuntimeException;

    invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method private createTables()V
    .registers 9

    .prologue
    const/4 v7, -0x2

    const/4 v6, 0x2

    const/4 v5, 0x1

    .line 524
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-interface {v0}, Ljava/sql/Connection;->createStatement()Ljava/sql/Statement;

    move-result-object v1

    .line 526
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getCreateTablesSQL()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v2

    :goto_17
    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_36

    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/lang/String;

    .line 527
    sget-object v3, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    invoke-interface {v3}, Lorg/slf4j/Logger;->isDebugEnabled()Z

    move-result v3

    if-eqz v3, :cond_32

    .line 528
    sget-object v3, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    const-string v4, "DatabaseFullPrunedBlockStore : CREATE table [SQL= {0}]"

    invoke-interface {v3, v4, v0}, Lorg/slf4j/Logger;->debug(Ljava/lang/String;Ljava/lang/Object;)V

    .line 530
    :cond_32
    invoke-interface {v1, v0}, Ljava/sql/Statement;->executeUpdate(Ljava/lang/String;)I

    goto :goto_17

    .line 533
    :cond_36
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getCreateIndexesSQL()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v2

    :goto_3e
    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_5d

    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/lang/String;

    .line 534
    sget-object v3, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    invoke-interface {v3}, Lorg/slf4j/Logger;->isDebugEnabled()Z

    move-result v3

    if-eqz v3, :cond_59

    .line 535
    sget-object v3, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    const-string v4, "DatabaseFullPrunedBlockStore : CREATE index [SQL= {0}]"

    invoke-interface {v3, v4, v0}, Lorg/slf4j/Logger;->debug(Ljava/lang/String;Ljava/lang/Object;)V

    .line 537
    :cond_59
    invoke-interface {v1, v0}, Ljava/sql/Statement;->executeUpdate(Ljava/lang/String;)I

    goto :goto_3e

    .line 539
    :cond_5d
    invoke-interface {v1}, Ljava/sql/Statement;->close()V

    .line 542
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getInsertSettingsSQL()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 543
    const-string v1, "chainhead"

    invoke-interface {v0, v5, v1}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 544
    invoke-interface {v0, v6, v7}, Ljava/sql/PreparedStatement;->setNull(II)V

    .line 545
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->execute()Z

    .line 546
    const-string v1, "verifiedchainhead"

    invoke-interface {v0, v5, v1}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 547
    invoke-interface {v0, v6, v7}, Ljava/sql/PreparedStatement;->setNull(II)V

    .line 548
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->execute()Z

    .line 549
    const-string v1, "version"

    invoke-interface {v0, v5, v1}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 550
    const-string v1, "03"

    invoke-virtual {v1}, Ljava/lang/String;->getBytes()[B

    move-result-object v1

    invoke-interface {v0, v6, v1}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 551
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->execute()Z

    .line 552
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V

    .line 553
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->params:Lorg/bitcoinj/core/NetworkParameters;

    invoke-direct {p0, v0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->createNewStore(Lorg/bitcoinj/core/NetworkParameters;)V

    .line 554
    return-void
.end method

.method private initFromDatabase()V
    .registers 5

    .prologue
    const/4 v3, 0x1

    .line 584
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectSettingsSQL()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 586
    const-string v1, "chainhead"

    invoke-interface {v0, v3, v1}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 587
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v1

    .line 588
    invoke-interface {v1}, Ljava/sql/ResultSet;->next()Z

    move-result v2

    if-nez v2, :cond_28

    .line 589
    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "corrupt database block store - no chain head pointer"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 591
    :cond_28
    invoke-interface {v1, v3}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v2

    invoke-static {v2}, Lorg/bitcoinj/core/Sha256Hash;->wrap([B)Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v2

    .line 592
    invoke-interface {v1}, Ljava/sql/ResultSet;->close()V

    .line 593
    invoke-virtual {p0, v2}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->get(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/core/StoredBlock;

    move-result-object v1

    iput-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    .line 594
    iput-object v2, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

    .line 595
    iget-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    if-nez v1, :cond_47

    .line 596
    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "corrupt database block store - head block not found"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 598
    :cond_47
    const-string v1, "verifiedchainhead"

    invoke-interface {v0, v3, v1}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 599
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v1

    .line 600
    invoke-interface {v1}, Ljava/sql/ResultSet;->next()Z

    move-result v2

    if-nez v2, :cond_5e

    .line 601
    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "corrupt database block store - no verified chain head pointer"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 603
    :cond_5e
    invoke-interface {v1, v3}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v2

    invoke-static {v2}, Lorg/bitcoinj/core/Sha256Hash;->wrap([B)Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v2

    .line 604
    invoke-interface {v1}, Ljava/sql/ResultSet;->close()V

    .line 605
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V

    .line 606
    invoke-virtual {p0, v2}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->get(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/core/StoredBlock;

    move-result-object v0

    iput-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    .line 607
    iput-object v2, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

    .line 608
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    if-nez v0, :cond_80

    .line 609
    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "corrupt databse block store - verified head block not found"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 611
    :cond_80
    return-void
.end method

.method private removeUndoableBlocksWhereHeightIsLessThan(I)V
    .registers 6

    .prologue
    .line 902
    :try_start_0
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    .line 903
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getDeleteUndoableBlocksSQL()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 904
    const/4 v1, 0x1

    invoke-interface {v0, v1, p1}, Ljava/sql/PreparedStatement;->setInt(II)V

    .line 905
    sget-object v1, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    invoke-interface {v1}, Lorg/slf4j/Logger;->isDebugEnabled()Z

    move-result v1

    if-eqz v1, :cond_30

    .line 906
    sget-object v1, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    new-instance v2, Ljava/lang/StringBuilder;

    const-string v3, "Deleting undoable undoable block with height <= "

    invoke-direct {v2, v3}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v2, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v1, v2}, Lorg/slf4j/Logger;->debug(Ljava/lang/String;)V

    .line 907
    :cond_30
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 908
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V
    :try_end_36
    .catch Ljava/sql/SQLException; {:try_start_0 .. :try_end_36} :catch_37

    .line 911
    return-void

    .line 909
    :catch_37
    move-exception v0

    .line 910
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method private tablesExists()Z
    .registers 5

    .prologue
    .line 481
    const/4 v1, 0x0

    .line 483
    :try_start_1
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getTablesExistSQL()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v2}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;
    :try_end_10
    .catch Ljava/sql/SQLException; {:try_start_1 .. :try_end_10} :catch_25
    .catchall {:try_start_1 .. :try_end_10} :catchall_34

    move-result-object v0

    .line 484
    :try_start_11
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v1

    .line 485
    invoke-interface {v1}, Ljava/sql/ResultSet;->close()V
    :try_end_18
    .catch Ljava/sql/SQLException; {:try_start_11 .. :try_end_18} :catch_46
    .catchall {:try_start_11 .. :try_end_18} :catchall_41

    .line 490
    if-eqz v0, :cond_23

    invoke-interface {v0}, Ljava/sql/PreparedStatement;->isClosed()Z

    move-result v1

    if-nez v1, :cond_23

    .line 491
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V

    .line 486
    :cond_23
    const/4 v0, 0x1

    .line 488
    :goto_24
    return v0

    .line 490
    :catch_25
    move-exception v0

    move-object v0, v1

    :goto_27
    if-eqz v0, :cond_32

    invoke-interface {v0}, Ljava/sql/PreparedStatement;->isClosed()Z

    move-result v1

    if-nez v1, :cond_32

    .line 491
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V

    .line 488
    :cond_32
    const/4 v0, 0x0

    goto :goto_24

    .line 490
    :catchall_34
    move-exception v0

    :goto_35
    if-eqz v1, :cond_40

    invoke-interface {v1}, Ljava/sql/PreparedStatement;->isClosed()Z

    move-result v2

    if-nez v2, :cond_40

    .line 491
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V

    :cond_40
    throw v0

    .line 490
    :catchall_41
    move-exception v1

    move-object v3, v1

    move-object v1, v0

    move-object v0, v3

    goto :goto_35

    :catch_46
    move-exception v1

    goto :goto_27
.end method


# virtual methods
.method public abortDatabaseBatchWrite()V
    .registers 4

    .prologue
    .line 1032
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1033
    sget-object v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    invoke-interface {v0}, Lorg/slf4j/Logger;->isDebugEnabled()Z

    move-result v0

    if-eqz v0, :cond_2b

    .line 1034
    sget-object v1, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    new-instance v2, Ljava/lang/StringBuilder;

    const-string v0, "Rollback database batch write with connection: "

    invoke-direct {v2, v0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-interface {v1, v0}, Lorg/slf4j/Logger;->debug(Ljava/lang/String;)V

    .line 1036
    :cond_2b
    :try_start_2b
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-interface {v0}, Ljava/sql/Connection;->getAutoCommit()Z

    move-result v0

    if-nez v0, :cond_51

    .line 1037
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-interface {v0}, Ljava/sql/Connection;->rollback()V

    .line 1038
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    const/4 v1, 0x1

    invoke-interface {v0, v1}, Ljava/sql/Connection;->setAutoCommit(Z)V

    .line 1044
    :goto_50
    return-void

    .line 1040
    :cond_51
    sget-object v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    const-string v1, "Warning: Rollback attempt without transaction"

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->warn(Ljava/lang/String;)V
    :try_end_58
    .catch Ljava/sql/SQLException; {:try_start_2b .. :try_end_58} :catch_59

    goto :goto_50

    .line 1042
    :catch_59
    move-exception v0

    .line 1043
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method public addUnspentTransactionOutput(Lorg/bitcoinj/core/UTXO;)V
    .registers 6

    .prologue
    .line 957
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 958
    const/4 v1, 0x0

    .line 960
    :try_start_4
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getInsertOpenoutputsSQL()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v2}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v1

    .line 961
    const/4 v0, 0x1

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v2

    invoke-interface {v1, v0, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 963
    const/4 v0, 0x2

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getIndex()J

    move-result-wide v2

    long-to-int v2, v2

    invoke-interface {v1, v0, v2}, Ljava/sql/PreparedStatement;->setInt(II)V

    .line 964
    const/4 v0, 0x3

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getHeight()I

    move-result v2

    invoke-interface {v1, v0, v2}, Ljava/sql/PreparedStatement;->setInt(II)V

    .line 965
    const/4 v0, 0x4

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getValue()Lorg/bitcoinj/core/Coin;

    move-result-object v2

    iget-wide v2, v2, Lorg/bitcoinj/core/Coin;->value:J

    invoke-interface {v1, v0, v2, v3}, Ljava/sql/PreparedStatement;->setLong(IJ)V

    .line 966
    const/4 v0, 0x5

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getScript()Lorg/bitcoinj/script/Script;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/script/Script;->getProgram()[B

    move-result-object v2

    invoke-interface {v1, v0, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 967
    const/4 v0, 0x6

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getAddress()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v1, v0, v2}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 968
    const/4 v0, 0x7

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getScript()Lorg/bitcoinj/script/Script;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/script/Script;->getScriptType()Lorg/bitcoinj/script/Script$ScriptType;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/script/Script$ScriptType;->ordinal()I

    move-result v2

    invoke-interface {v1, v0, v2}, Ljava/sql/PreparedStatement;->setInt(II)V

    .line 969
    const/16 v0, 0x8

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->isCoinbase()Z

    move-result v2

    invoke-interface {v1, v0, v2}, Ljava/sql/PreparedStatement;->setBoolean(IZ)V

    .line 970
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 971
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_6e
    .catch Ljava/sql/SQLException; {:try_start_4 .. :try_end_6e} :catch_7b
    .catchall {:try_start_4 .. :try_end_6e} :catchall_90

    .line 976
    if-eqz v1, :cond_73

    .line 978
    :try_start_70
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_73
    .catch Ljava/sql/SQLException; {:try_start_70 .. :try_end_73} :catch_74

    .line 984
    :cond_73
    :goto_73
    return-void

    .line 979
    :catch_74
    move-exception v0

    .line 980
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1

    .line 972
    :catch_7b
    move-exception v0

    .line 973
    :try_start_7c
    invoke-virtual {v0}, Ljava/sql/SQLException;->getSQLState()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getDuplicateKeyErrorCode()Ljava/lang/String;

    move-result-object v3

    invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v2

    if-nez v2, :cond_97

    .line 974
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2
    :try_end_90
    .catchall {:try_start_7c .. :try_end_90} :catchall_90

    .line 976
    :catchall_90
    move-exception v0

    if-eqz v1, :cond_96

    .line 978
    :try_start_93
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_96
    .catch Ljava/sql/SQLException; {:try_start_93 .. :try_end_96} :catch_a4

    .line 980
    :cond_96
    throw v0

    .line 976
    :cond_97
    if-eqz v1, :cond_73

    .line 978
    :try_start_99
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_9c
    .catch Ljava/sql/SQLException; {:try_start_99 .. :try_end_9c} :catch_9d

    goto :goto_73

    .line 979
    :catch_9d
    move-exception v0

    .line 980
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1

    .line 979
    :catch_a4
    move-exception v0

    .line 980
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method public beginDatabaseBatchWrite()V
    .registers 4

    .prologue
    .line 1007
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1008
    sget-object v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    invoke-interface {v0}, Lorg/slf4j/Logger;->isDebugEnabled()Z

    move-result v0

    if-eqz v0, :cond_2b

    .line 1009
    sget-object v1, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    new-instance v2, Ljava/lang/StringBuilder;

    const-string v0, "Starting database batch write with connection: "

    invoke-direct {v2, v0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-interface {v1, v0}, Lorg/slf4j/Logger;->debug(Ljava/lang/String;)V

    .line 1011
    :cond_2b
    :try_start_2b
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    const/4 v1, 0x0

    invoke-interface {v0, v1}, Ljava/sql/Connection;->setAutoCommit(Z)V
    :try_end_37
    .catch Ljava/sql/SQLException; {:try_start_2b .. :try_end_37} :catch_38

    .line 1014
    return-void

    .line 1012
    :catch_38
    move-exception v0

    .line 1013
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method public calculateBalanceForAddress(Lorg/bitcoinj/core/Address;)Ljava/math/BigInteger;
    .registers 6

    .prologue
    .line 1134
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1135
    const/4 v1, 0x0

    .line 1137
    :try_start_4
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getBalanceSelectSQL()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v2}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v1

    .line 1138
    const/4 v0, 0x1

    invoke-virtual {p1}, Lorg/bitcoinj/core/Address;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v1, v0, v2}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 1139
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v2

    .line 1140
    sget-object v0, Ljava/math/BigInteger;->ZERO:Ljava/math/BigInteger;

    .line 1141
    invoke-interface {v2}, Ljava/sql/ResultSet;->next()Z

    move-result v3

    if-eqz v3, :cond_40

    .line 1142
    const/4 v0, 0x1

    invoke-interface {v2, v0}, Ljava/sql/ResultSet;->getLong(I)J

    move-result-wide v2

    invoke-static {v2, v3}, Ljava/math/BigInteger;->valueOf(J)Ljava/math/BigInteger;
    :try_end_30
    .catch Ljava/sql/SQLException; {:try_start_4 .. :try_end_30} :catch_4f
    .catchall {:try_start_4 .. :try_end_30} :catchall_56

    move-result-object v0

    .line 1148
    if-eqz v1, :cond_36

    .line 1150
    :try_start_33
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_36
    .catch Ljava/sql/SQLException; {:try_start_33 .. :try_end_36} :catch_37

    .line 1144
    :cond_36
    :goto_36
    return-object v0

    .line 1152
    :catch_37
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Could not close statement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 1148
    :cond_40
    if-eqz v1, :cond_36

    .line 1150
    :try_start_42
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_45
    .catch Ljava/sql/SQLException; {:try_start_42 .. :try_end_45} :catch_46

    goto :goto_36

    .line 1152
    :catch_46
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Could not close statement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 1145
    :catch_4f
    move-exception v0

    .line 1146
    :try_start_50
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2
    :try_end_56
    .catchall {:try_start_50 .. :try_end_56} :catchall_56

    .line 1148
    :catchall_56
    move-exception v0

    if-eqz v1, :cond_5c

    .line 1150
    :try_start_59
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_5c
    .catch Ljava/sql/SQLException; {:try_start_59 .. :try_end_5c} :catch_5d

    .line 1152
    :cond_5c
    throw v0

    :catch_5d
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Could not close statement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0
.end method

.method public declared-synchronized close()V
    .registers 4

    .prologue
    .line 454
    monitor-enter p0

    :try_start_1
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->allConnections:Ljava/util/List;

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v1

    :cond_7
    :goto_7
    invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_38

    invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;
    :try_end_13
    .catchall {:try_start_1 .. :try_end_13} :catchall_35

    .line 456
    :try_start_13
    invoke-interface {v0}, Ljava/sql/Connection;->getAutoCommit()Z

    move-result v2

    if-nez v2, :cond_1c

    .line 457
    invoke-interface {v0}, Ljava/sql/Connection;->rollback()V

    .line 459
    :cond_1c
    invoke-interface {v0}, Ljava/sql/Connection;->close()V

    .line 460
    iget-object v2, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v2}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v2

    if-ne v0, v2, :cond_7

    .line 461
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    const/4 v2, 0x0

    invoke-virtual {v0, v2}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V
    :try_end_2d
    .catch Ljava/sql/SQLException; {:try_start_13 .. :try_end_2d} :catch_2e
    .catchall {:try_start_13 .. :try_end_2d} :catchall_35

    goto :goto_7

    .line 463
    :catch_2e
    move-exception v0

    .line 464
    :try_start_2f
    new-instance v1, Ljava/lang/RuntimeException;

    invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V

    throw v1
    :try_end_35
    .catchall {:try_start_2f .. :try_end_35} :catchall_35

    .line 454
    :catchall_35
    move-exception v0

    monitor-exit p0

    throw v0

    .line 467
    :cond_38
    :try_start_38
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->allConnections:Ljava/util/List;

    invoke-interface {v0}, Ljava/util/List;->clear()V
    :try_end_3d
    .catchall {:try_start_38 .. :try_end_3d} :catchall_35

    .line 468
    monitor-exit p0

    return-void
.end method

.method public commitDatabaseBatchWrite()V
    .registers 4

    .prologue
    .line 1019
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1020
    sget-object v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    invoke-interface {v0}, Lorg/slf4j/Logger;->isDebugEnabled()Z

    move-result v0

    if-eqz v0, :cond_2b

    .line 1021
    sget-object v1, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    new-instance v2, Ljava/lang/StringBuilder;

    const-string v0, "Committing database batch write with connection: "

    invoke-direct {v2, v0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-interface {v1, v0}, Lorg/slf4j/Logger;->debug(Ljava/lang/String;)V

    .line 1023
    :cond_2b
    :try_start_2b
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-interface {v0}, Ljava/sql/Connection;->commit()V

    .line 1024
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    const/4 v1, 0x1

    invoke-interface {v0, v1}, Ljava/sql/Connection;->setAutoCommit(Z)V
    :try_end_42
    .catch Ljava/sql/SQLException; {:try_start_2b .. :try_end_42} :catch_43

    .line 1027
    return-void

    .line 1025
    :catch_43
    move-exception v0

    .line 1026
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method public deleteStore()V
    .registers 4

    .prologue
    .line 1107
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1109
    :try_start_3
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-interface {v0}, Ljava/sql/Connection;->createStatement()Ljava/sql/Statement;

    move-result-object v1

    .line 1110
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getDropTablesSQL()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v2

    :goto_17
    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_2e

    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/lang/String;

    .line 1111
    invoke-interface {v1, v0}, Ljava/sql/Statement;->execute(Ljava/lang/String;)Z
    :try_end_26
    .catch Ljava/sql/SQLException; {:try_start_3 .. :try_end_26} :catch_27

    goto :goto_17

    .line 1114
    :catch_27
    move-exception v0

    .line 1115
    new-instance v1, Ljava/lang/RuntimeException;

    invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V

    throw v1

    .line 1113
    :cond_2e
    :try_start_2e
    invoke-interface {v1}, Ljava/sql/Statement;->close()V
    :try_end_31
    .catch Ljava/sql/SQLException; {:try_start_2e .. :try_end_31} :catch_27

    .line 1116
    return-void
.end method

.method public dumpSizes()V
    .registers 21

    .prologue
    .line 1207
    invoke-virtual/range {p0 .. p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1208
    move-object/from16 v0, p0

    iget-object v2, v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v2}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v2

    check-cast v2, Ljava/sql/Connection;

    invoke-interface {v2}, Ljava/sql/Connection;->createStatement()Ljava/sql/Statement;

    move-result-object v8

    .line 1209
    const-wide/16 v4, 0x0

    .line 1211
    const/4 v2, 0x0

    .line 1212
    invoke-virtual/range {p0 .. p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectSettingsDumpSQL()Ljava/lang/String;

    move-result-object v3

    invoke-interface {v8, v3}, Ljava/sql/Statement;->executeQuery(Ljava/lang/String;)Ljava/sql/ResultSet;

    move-result-object v3

    .line 1213
    :goto_1c
    invoke-interface {v3}, Ljava/sql/ResultSet;->next()Z

    move-result v6

    if-eqz v6, :cond_38

    .line 1214
    const/4 v6, 0x1

    invoke-interface {v3, v6}, Ljava/sql/ResultSet;->getString(I)Ljava/lang/String;

    move-result-object v6

    invoke-virtual {v6}, Ljava/lang/String;->length()I

    move-result v6

    int-to-long v6, v6

    add-long/2addr v4, v6

    .line 1215
    const/4 v6, 0x2

    invoke-interface {v3, v6}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v6

    array-length v6, v6

    int-to-long v6, v6

    add-long/2addr v4, v6

    .line 1216
    add-int/lit8 v2, v2, 0x1

    goto :goto_1c

    .line 1218
    :cond_38
    invoke-interface {v3}, Ljava/sql/ResultSet;->close()V

    .line 1219
    sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;

    sget-object v6, Ljava/util/Locale;->US:Ljava/util/Locale;

    const-string v7, "Settings size: %d, count: %d, average size: %f%n"

    const/4 v9, 0x3

    new-array v9, v9, [Ljava/lang/Object;

    const/4 v10, 0x0

    invoke-static {v4, v5}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;

    move-result-object v11

    aput-object v11, v9, v10

    const/4 v10, 0x1

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v11

    aput-object v11, v9, v10

    const/4 v10, 0x2

    long-to-double v12, v4

    int-to-double v14, v2

    div-double/2addr v12, v14

    invoke-static {v12, v13}, Ljava/lang/Double;->valueOf(D)Ljava/lang/Double;

    move-result-object v2

    aput-object v2, v9, v10

    invoke-virtual {v3, v6, v7, v9}, Ljava/io/PrintStream;->printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;

    .line 1221
    const-wide/16 v6, 0x0

    const/4 v2, 0x0

    .line 1222
    invoke-virtual/range {p0 .. p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectHeadersDumpSQL()Ljava/lang/String;

    move-result-object v3

    invoke-interface {v8, v3}, Ljava/sql/Statement;->executeQuery(Ljava/lang/String;)Ljava/sql/ResultSet;

    move-result-object v3

    .line 1223
    :goto_6a
    invoke-interface {v3}, Ljava/sql/ResultSet;->next()Z

    move-result v9

    if-eqz v9, :cond_89

    .line 1224
    const-wide/16 v10, 0x1c

    add-long/2addr v6, v10

    .line 1225
    const/4 v9, 0x1

    invoke-interface {v3, v9}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v9

    array-length v9, v9

    int-to-long v10, v9

    add-long/2addr v6, v10

    .line 1226
    const-wide/16 v10, 0x4

    add-long/2addr v6, v10

    .line 1227
    const/4 v9, 0x2

    invoke-interface {v3, v9}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v9

    array-length v9, v9

    int-to-long v10, v9

    add-long/2addr v6, v10

    .line 1228
    add-int/lit8 v2, v2, 0x1

    goto :goto_6a

    .line 1230
    :cond_89
    invoke-interface {v3}, Ljava/sql/ResultSet;->close()V

    .line 1231
    sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;

    sget-object v9, Ljava/util/Locale;->US:Ljava/util/Locale;

    const-string v10, "Headers size: %d, count: %d, average size: %f%n"

    const/4 v11, 0x3

    new-array v11, v11, [Ljava/lang/Object;

    const/4 v12, 0x0

    invoke-static {v6, v7}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;

    move-result-object v13

    aput-object v13, v11, v12

    const/4 v12, 0x1

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v13

    aput-object v13, v11, v12

    const/4 v12, 0x2

    long-to-double v14, v6

    int-to-double v0, v2

    move-wide/from16 v16, v0

    div-double v14, v14, v16

    invoke-static {v14, v15}, Ljava/lang/Double;->valueOf(D)Ljava/lang/Double;

    move-result-object v2

    aput-object v2, v11, v12

    invoke-virtual {v3, v9, v10, v11}, Ljava/io/PrintStream;->printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;

    .line 1233
    add-long/2addr v6, v4

    const-wide/16 v4, 0x0

    const/4 v2, 0x0

    .line 1234
    invoke-virtual/range {p0 .. p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectUndoableblocksDumpSQL()Ljava/lang/String;

    move-result-object v3

    invoke-interface {v8, v3}, Ljava/sql/Statement;->executeQuery(Ljava/lang/String;)Ljava/sql/ResultSet;

    move-result-object v3

    .line 1235
    :goto_bf
    invoke-interface {v3}, Ljava/sql/ResultSet;->next()Z

    move-result v9

    if-eqz v9, :cond_e1

    .line 1236
    const-wide/16 v10, 0x1c

    add-long/2addr v4, v10

    .line 1237
    const-wide/16 v10, 0x4

    add-long/2addr v4, v10

    .line 1238
    const/4 v9, 0x1

    invoke-interface {v3, v9}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v9

    .line 1239
    const/4 v10, 0x2

    invoke-interface {v3, v10}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v10

    .line 1240
    if-nez v9, :cond_dd

    .line 1241
    array-length v9, v10

    int-to-long v10, v9

    add-long/2addr v4, v10

    .line 1245
    :goto_da
    add-int/lit8 v2, v2, 0x1

    .line 1246
    goto :goto_bf

    .line 1243
    :cond_dd
    array-length v9, v9

    int-to-long v10, v9

    add-long/2addr v4, v10

    goto :goto_da

    .line 1247
    :cond_e1
    invoke-interface {v3}, Ljava/sql/ResultSet;->close()V

    .line 1248
    sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;

    sget-object v9, Ljava/util/Locale;->US:Ljava/util/Locale;

    const-string v10, "Undoable Blocks size: %d, count: %d, average size: %f%n"

    const/4 v11, 0x3

    new-array v11, v11, [Ljava/lang/Object;

    const/4 v12, 0x0

    invoke-static {v4, v5}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;

    move-result-object v13

    aput-object v13, v11, v12

    const/4 v12, 0x1

    invoke-static {v2}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v13

    aput-object v13, v11, v12

    const/4 v12, 0x2

    long-to-double v14, v4

    int-to-double v0, v2

    move-wide/from16 v16, v0

    div-double v14, v14, v16

    invoke-static {v14, v15}, Ljava/lang/Double;->valueOf(D)Ljava/lang/Double;

    move-result-object v2

    aput-object v2, v11, v12

    invoke-virtual {v3, v9, v10, v11}, Ljava/io/PrintStream;->printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;

    .line 1250
    add-long v10, v6, v4

    const-wide/16 v6, 0x0

    const/4 v4, 0x0

    .line 1251
    const-wide/16 v2, 0x0

    .line 1252
    invoke-virtual/range {p0 .. p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectopenoutputsDumpSQL()Ljava/lang/String;

    move-result-object v5

    invoke-interface {v8, v5}, Ljava/sql/Statement;->executeQuery(Ljava/lang/String;)Ljava/sql/ResultSet;

    move-result-object v5

    .line 1253
    :goto_11a
    invoke-interface {v5}, Ljava/sql/ResultSet;->next()Z

    move-result v9

    if-eqz v9, :cond_144

    .line 1254
    const-wide/16 v12, 0x20

    add-long/2addr v6, v12

    .line 1255
    const-wide/16 v12, 0x4

    add-long/2addr v6, v12

    .line 1256
    const-wide/16 v12, 0x4

    add-long/2addr v6, v12

    .line 1257
    const/4 v9, 0x1

    invoke-interface {v5, v9}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v9

    array-length v9, v9

    int-to-long v12, v9

    add-long/2addr v6, v12

    .line 1258
    const/4 v9, 0x2

    invoke-interface {v5, v9}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v9

    array-length v9, v9

    int-to-long v12, v9

    add-long/2addr v6, v12

    .line 1259
    const/4 v9, 0x2

    invoke-interface {v5, v9}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v9

    array-length v9, v9

    int-to-long v12, v9

    add-long/2addr v2, v12

    .line 1260
    add-int/lit8 v4, v4, 0x1

    goto :goto_11a

    .line 1262
    :cond_144
    invoke-interface {v5}, Ljava/sql/ResultSet;->close()V

    .line 1263
    sget-object v5, Ljava/lang/System;->out:Ljava/io/PrintStream;

    sget-object v9, Ljava/util/Locale;->US:Ljava/util/Locale;

    const-string v12, "Open Outputs size: %d, count: %d, average size: %f, average script size: %f (%d in id indexes)%n"

    const/4 v13, 0x5

    new-array v13, v13, [Ljava/lang/Object;

    const/4 v14, 0x0

    .line 1264
    invoke-static {v6, v7}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;

    move-result-object v15

    aput-object v15, v13, v14

    const/4 v14, 0x1

    invoke-static {v4}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v15

    aput-object v15, v13, v14

    const/4 v14, 0x2

    long-to-double v0, v6

    move-wide/from16 v16, v0

    int-to-double v0, v4

    move-wide/from16 v18, v0

    div-double v16, v16, v18

    invoke-static/range {v16 .. v17}, Ljava/lang/Double;->valueOf(D)Ljava/lang/Double;

    move-result-object v15

    aput-object v15, v13, v14

    const/4 v14, 0x3

    long-to-double v2, v2

    int-to-double v0, v4

    move-wide/from16 v16, v0

    div-double v2, v2, v16

    invoke-static {v2, v3}, Ljava/lang/Double;->valueOf(D)Ljava/lang/Double;

    move-result-object v2

    aput-object v2, v13, v14

    const/4 v2, 0x4

    shl-int/lit8 v3, v4, 0x3

    invoke-static {v3}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v3

    aput-object v3, v13, v2

    .line 1263
    invoke-virtual {v5, v9, v12, v13}, Ljava/io/PrintStream;->printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;

    .line 1266
    add-long v2, v10, v6

    .line 1267
    sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream;

    new-instance v5, Ljava/lang/StringBuilder;

    const-string v6, "Total Size: "

    invoke-direct {v5, v6}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v5, v2, v3}, Ljava/lang/StringBuilder;->append(J)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v4, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 1269
    invoke-interface {v8}, Ljava/sql/Statement;->close()V

    .line 1270
    return-void
.end method

.method public get(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/core/StoredBlock;
    .registers 3

    .prologue
    .line 779
    const/4 v0, 0x0

    invoke-virtual {p0, p1, v0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->get(Lorg/bitcoinj/core/Sha256Hash;Z)Lorg/bitcoinj/core/StoredBlock;

    move-result-object v0

    return-object v0
.end method

.method public get(Lorg/bitcoinj/core/Sha256Hash;Z)Lorg/bitcoinj/core/StoredBlock;
    .registers 10

    .prologue
    const/4 v1, 0x0

    .line 729
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

    if-eqz v0, :cond_10

    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

    invoke-virtual {v0, p1}, Lorg/bitcoinj/core/Sha256Hash;->equals(Ljava/lang/Object;)Z

    move-result v0

    if-eqz v0, :cond_10

    .line 730
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    .line 756
    :cond_f
    :goto_f
    return-object v0

    .line 731
    :cond_10
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

    if-eqz v0, :cond_1f

    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

    invoke-virtual {v0, p1}, Lorg/bitcoinj/core/Sha256Hash;->equals(Ljava/lang/Object;)Z

    move-result v0

    if-eqz v0, :cond_1f

    .line 732
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    goto :goto_f

    .line 733
    :cond_1f
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 736
    :try_start_22
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    .line 737
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectHeadersSQL()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v2}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;
    :try_end_31
    .catch Ljava/sql/SQLException; {:try_start_22 .. :try_end_31} :catch_ae
    .catch Lorg/bitcoinj/core/ProtocolException; {:try_start_22 .. :try_end_31} :catch_bd
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_22 .. :try_end_31} :catch_c7
    .catchall {:try_start_22 .. :try_end_31} :catchall_d8

    move-result-object v2

    .line 739
    const/16 v0, 0x1c

    :try_start_34
    new-array v0, v0, [B

    .line 740
    invoke-virtual {p1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v3

    const/4 v4, 0x4

    const/4 v5, 0x0

    const/16 v6, 0x1c

    invoke-static {v3, v4, v0, v5, v6}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 741
    const/4 v3, 0x1

    invoke-interface {v2, v3, v0}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 742
    invoke-interface {v2}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v0

    .line 743
    invoke-interface {v0}, Ljava/sql/ResultSet;->next()Z
    :try_end_4c
    .catch Ljava/sql/SQLException; {:try_start_34 .. :try_end_4c} :catch_df
    .catch Lorg/bitcoinj/core/ProtocolException; {:try_start_34 .. :try_end_4c} :catch_dd
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_34 .. :try_end_4c} :catch_db
    .catchall {:try_start_34 .. :try_end_4c} :catchall_c5

    move-result v3

    if-nez v3, :cond_5f

    .line 767
    if-eqz v2, :cond_54

    .line 769
    :try_start_51
    invoke-interface {v2}, Ljava/sql/PreparedStatement;->close()V
    :try_end_54
    .catch Ljava/sql/SQLException; {:try_start_51 .. :try_end_54} :catch_56

    :cond_54
    move-object v0, v1

    .line 744
    goto :goto_f

    .line 771
    :catch_56
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 748
    :cond_5f
    if-eqz p2, :cond_78

    const/4 v3, 0x4

    :try_start_62
    invoke-interface {v0, v3}, Ljava/sql/ResultSet;->getBoolean(I)Z
    :try_end_65
    .catch Ljava/sql/SQLException; {:try_start_62 .. :try_end_65} :catch_df
    .catch Lorg/bitcoinj/core/ProtocolException; {:try_start_62 .. :try_end_65} :catch_dd
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_62 .. :try_end_65} :catch_db
    .catchall {:try_start_62 .. :try_end_65} :catchall_c5

    move-result v3

    if-nez v3, :cond_78

    .line 767
    if-eqz v2, :cond_6d

    .line 769
    :try_start_6a
    invoke-interface {v2}, Ljava/sql/PreparedStatement;->close()V
    :try_end_6d
    .catch Ljava/sql/SQLException; {:try_start_6a .. :try_end_6d} :catch_6f

    :cond_6d
    move-object v0, v1

    .line 749
    goto :goto_f

    .line 771
    :catch_6f
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 751
    :cond_78
    :try_start_78
    new-instance v1, Ljava/math/BigInteger;

    const/4 v3, 0x1

    invoke-interface {v0, v3}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v3

    invoke-direct {v1, v3}, Ljava/math/BigInteger;-><init>([B)V

    .line 752
    const/4 v3, 0x2

    invoke-interface {v0, v3}, Ljava/sql/ResultSet;->getInt(I)I

    move-result v3

    .line 753
    iget-object v4, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->params:Lorg/bitcoinj/core/NetworkParameters;

    invoke-virtual {v4}, Lorg/bitcoinj/core/NetworkParameters;->getDefaultSerializer()Lorg/bitcoinj/core/MessageSerializer;

    move-result-object v4

    const/4 v5, 0x3

    invoke-interface {v0, v5}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v0

    invoke-virtual {v4, v0}, Lorg/bitcoinj/core/MessageSerializer;->makeBlock([B)Lorg/bitcoinj/core/Block;

    move-result-object v4

    .line 754
    invoke-virtual {v4}, Lorg/bitcoinj/core/Block;->verifyHeader()V

    .line 755
    new-instance v0, Lorg/bitcoinj/core/StoredBlock;

    invoke-direct {v0, v4, v1, v3}, Lorg/bitcoinj/core/StoredBlock;-><init>(Lorg/bitcoinj/core/Block;Ljava/math/BigInteger;I)V
    :try_end_9e
    .catch Ljava/sql/SQLException; {:try_start_78 .. :try_end_9e} :catch_df
    .catch Lorg/bitcoinj/core/ProtocolException; {:try_start_78 .. :try_end_9e} :catch_dd
    .catch Lorg/bitcoinj/core/VerificationException; {:try_start_78 .. :try_end_9e} :catch_db
    .catchall {:try_start_78 .. :try_end_9e} :catchall_c5

    .line 767
    if-eqz v2, :cond_f

    .line 769
    :try_start_a0
    invoke-interface {v2}, Ljava/sql/PreparedStatement;->close()V
    :try_end_a3
    .catch Ljava/sql/SQLException; {:try_start_a0 .. :try_end_a3} :catch_a5

    goto/16 :goto_f

    .line 771
    :catch_a5
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 757
    :catch_ae
    move-exception v0

    .line 758
    :goto_af
    :try_start_af
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2
    :try_end_b5
    .catchall {:try_start_af .. :try_end_b5} :catchall_b5

    .line 767
    :catchall_b5
    move-exception v0

    move-object v2, v1

    :goto_b7
    if-eqz v2, :cond_bc

    .line 769
    :try_start_b9
    invoke-interface {v2}, Ljava/sql/PreparedStatement;->close()V
    :try_end_bc
    .catch Ljava/sql/SQLException; {:try_start_b9 .. :try_end_bc} :catch_cf

    .line 771
    :cond_bc
    throw v0

    .line 759
    :catch_bd
    move-exception v0

    move-object v2, v1

    .line 761
    :goto_bf
    :try_start_bf
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1

    .line 767
    :catchall_c5
    move-exception v0

    goto :goto_b7

    .line 762
    :catch_c7
    move-exception v0

    move-object v2, v1

    .line 765
    :goto_c9
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
    :try_end_cf
    .catchall {:try_start_bf .. :try_end_cf} :catchall_c5

    .line 771
    :catch_cf
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 767
    :catchall_d8
    move-exception v0

    move-object v2, v1

    goto :goto_b7

    .line 762
    :catch_db
    move-exception v0

    goto :goto_c9

    .line 759
    :catch_dd
    move-exception v0

    goto :goto_bf

    .line 757
    :catch_df
    move-exception v0

    move-object v1, v2

    goto :goto_af
.end method

.method protected getBalanceSelectSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 233
    const-string v0, "select sum(value) from openoutputs where toaddress = ?"

    return-object v0
.end method

.method public getChainHead()Lorg/bitcoinj/core/StoredBlock;
    .registers 2

    .prologue
    .line 853
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    return-object v0
.end method

.method public getChainHeadHeight()I
    .registers 3

    .prologue
    .line 1081
    :try_start_0
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getVerifiedChainHead()Lorg/bitcoinj/core/StoredBlock;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/StoredBlock;->getHeight()I
    :try_end_7
    .catch Lorg/bitcoinj/store/BlockStoreException; {:try_start_0 .. :try_end_7} :catch_9

    move-result v0

    return v0

    .line 1082
    :catch_9
    move-exception v0

    .line 1083
    new-instance v1, Lorg/bitcoinj/core/UTXOProviderException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/core/UTXOProviderException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method protected getCompatibilitySQL()Ljava/util/List;
    .registers 3
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "()",
            "Ljava/util/List",
            "<",
            "Ljava/lang/String;",
            ">;"
        }
    .end annotation

    .prologue
    .line 249
    new-instance v0, Ljava/util/ArrayList;

    invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V

    .line 250
    const-string v1, "SELECT coinbase FROM openoutputs WHERE 1 = 2"

    invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 251
    return-object v0
.end method

.method protected abstract getCreateIndexesSQL()Ljava/util/List;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "()",
            "Ljava/util/List",
            "<",
            "Ljava/lang/String;",
            ">;"
        }
    .end annotation
.end method

.method protected abstract getCreateSchemeSQL()Ljava/util/List;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "()",
            "Ljava/util/List",
            "<",
            "Ljava/lang/String;",
            ">;"
        }
    .end annotation
.end method

.method protected abstract getCreateTablesSQL()Ljava/util/List;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "()",
            "Ljava/util/List",
            "<",
            "Ljava/lang/String;",
            ">;"
        }
    .end annotation
.end method

.method protected abstract getDatabaseDriverClass()Ljava/lang/String;
.end method

.method protected getDeleteOpenoutputsSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 384
    const-string v0, "DELETE FROM openoutputs WHERE hash = ? AND index = ?"

    return-object v0
.end method

.method protected getDeleteUndoableBlocksSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 352
    const-string v0, "DELETE FROM undoableblocks WHERE height <= ?"

    return-object v0
.end method

.method protected getDropTablesSQL()Ljava/util/List;
    .registers 3
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "()",
            "Ljava/util/List",
            "<",
            "Ljava/lang/String;",
            ">;"
        }
    .end annotation

    .prologue
    .line 267
    new-instance v0, Ljava/util/ArrayList;

    invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V

    .line 268
    const-string v1, "DROP TABLE settings"

    invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 269
    const-string v1, "DROP TABLE headers"

    invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 270
    const-string v1, "DROP TABLE undoableblocks"

    invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 271
    const-string v1, "DROP TABLE openoutputs"

    invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 272
    return-object v0
.end method

.method protected abstract getDuplicateKeyErrorCode()Ljava/lang/String;
.end method

.method protected getInsertHeadersSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 312
    const-string v0, "INSERT INTO headers(hash, chainwork, height, header, wasundoable) VALUES(?, ?, ?, ?, ?)"

    return-object v0
.end method

.method protected getInsertOpenoutputsSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 376
    const-string v0, "INSERT INTO openoutputs (hash, index, height, value, scriptbytes, toaddress, addresstargetable, coinbase) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"

    return-object v0
.end method

.method protected getInsertSettingsSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 288
    const-string v0, "INSERT INTO settings(name, value) VALUES(?, ?)"

    return-object v0
.end method

.method protected getInsertUndoableBlocksSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 336
    const-string v0, "INSERT INTO undoableblocks(hash, height, txoutchanges, transactions) VALUES(?, ?, ?, ?)"

    return-object v0
.end method

.method public getOnceUndoableStoredBlock(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/core/StoredBlock;
    .registers 3

    .prologue
    .line 784
    const/4 v0, 0x1

    invoke-virtual {p0, p1, v0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->get(Lorg/bitcoinj/core/Sha256Hash;Z)Lorg/bitcoinj/core/StoredBlock;

    move-result-object v0

    return-object v0
.end method

.method public getOpenTransactionOutputs(Ljava/util/List;)Ljava/util/List;
    .registers 16
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Ljava/util/List",
            "<",
            "Lorg/bitcoinj/core/Address;",
            ">;)",
            "Ljava/util/List",
            "<",
            "Lorg/bitcoinj/core/UTXO;",
            ">;"
        }
    .end annotation

    .prologue
    .line 1160
    const/4 v1, 0x0

    .line 1161
    new-instance v10, Ljava/util/ArrayList;

    invoke-direct {v10}, Ljava/util/ArrayList;-><init>()V

    .line 1163
    :try_start_6
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1164
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getTrasactionOutputSelectSQL()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v2}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;
    :try_end_18
    .catch Ljava/sql/SQLException; {:try_start_6 .. :try_end_18} :catch_ac
    .catch Lorg/bitcoinj/store/BlockStoreException; {:try_start_6 .. :try_end_18} :catch_94
    .catchall {:try_start_6 .. :try_end_18} :catchall_a7

    move-result-object v9

    .line 1165
    :try_start_19
    invoke-interface {p1}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v11

    :cond_1d
    invoke-interface {v11}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_85

    invoke-interface {v11}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/core/Address;

    .line 1166
    const/4 v1, 0x1

    invoke-virtual {v0}, Lorg/bitcoinj/core/Address;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-interface {v9, v1, v0}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 1167
    invoke-interface {v9}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v12

    .line 1168
    :goto_35
    invoke-interface {v12}, Ljava/sql/ResultSet;->next()Z

    move-result v0

    if-eqz v0, :cond_1d

    .line 1169
    const/4 v0, 0x1

    invoke-interface {v12, v0}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v0

    invoke-static {v0}, Lorg/bitcoinj/core/Sha256Hash;->wrap([B)Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v1

    .line 1170
    const/4 v0, 0x2

    invoke-interface {v12, v0}, Ljava/sql/ResultSet;->getLong(I)J

    move-result-wide v2

    invoke-static {v2, v3}, Lorg/bitcoinj/core/Coin;->valueOf(J)Lorg/bitcoinj/core/Coin;

    move-result-object v4

    .line 1171
    const/4 v0, 0x3

    invoke-interface {v12, v0}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v13

    .line 1172
    const/4 v0, 0x4

    invoke-interface {v12, v0}, Ljava/sql/ResultSet;->getInt(I)I

    move-result v5

    .line 1173
    const/4 v0, 0x5

    invoke-interface {v12, v0}, Ljava/sql/ResultSet;->getInt(I)I

    move-result v2

    .line 1174
    const/4 v0, 0x6

    invoke-interface {v12, v0}, Ljava/sql/ResultSet;->getBoolean(I)Z

    move-result v6

    .line 1175
    const/4 v0, 0x7

    invoke-interface {v12, v0}, Ljava/sql/ResultSet;->getString(I)Ljava/lang/String;

    move-result-object v8

    .line 1176
    new-instance v0, Lorg/bitcoinj/core/UTXO;

    int-to-long v2, v2

    new-instance v7, Lorg/bitcoinj/script/Script;

    invoke-direct {v7, v13}, Lorg/bitcoinj/script/Script;-><init>([B)V

    invoke-direct/range {v0 .. v8}, Lorg/bitcoinj/core/UTXO;-><init>(Lorg/bitcoinj/core/Sha256Hash;JLorg/bitcoinj/core/Coin;IZLorg/bitcoinj/script/Script;Ljava/lang/String;)V

    .line 1183
    invoke-interface {v10, v0}, Ljava/util/List;->add(Ljava/lang/Object;)Z
    :try_end_74
    .catch Ljava/sql/SQLException; {:try_start_19 .. :try_end_74} :catch_75
    .catch Lorg/bitcoinj/store/BlockStoreException; {:try_start_19 .. :try_end_74} :catch_aa
    .catchall {:try_start_19 .. :try_end_74} :catchall_9c

    goto :goto_35

    .line 1187
    :catch_75
    move-exception v0

    move-object v1, v9

    .line 1188
    :goto_77
    :try_start_77
    new-instance v2, Lorg/bitcoinj/core/UTXOProviderException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/core/UTXOProviderException;-><init>(Ljava/lang/Throwable;)V

    throw v2
    :try_end_7d
    .catchall {:try_start_77 .. :try_end_7d} :catchall_7d

    .line 1192
    :catchall_7d
    move-exception v0

    move-object v9, v1

    :goto_7f
    if-eqz v9, :cond_84

    .line 1194
    :try_start_81
    invoke-interface {v9}, Ljava/sql/PreparedStatement;->close()V
    :try_end_84
    .catch Ljava/sql/SQLException; {:try_start_81 .. :try_end_84} :catch_9e

    .line 1196
    :cond_84
    throw v0

    .line 1192
    :cond_85
    if-eqz v9, :cond_8a

    .line 1194
    :try_start_87
    invoke-interface {v9}, Ljava/sql/PreparedStatement;->close()V
    :try_end_8a
    .catch Ljava/sql/SQLException; {:try_start_87 .. :try_end_8a} :catch_8b

    .line 1186
    :cond_8a
    return-object v10

    .line 1195
    :catch_8b
    move-exception v0

    .line 1196
    new-instance v1, Lorg/bitcoinj/core/UTXOProviderException;

    const-string v2, "Could not close statement"

    invoke-direct {v1, v2, v0}, Lorg/bitcoinj/core/UTXOProviderException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V

    throw v1

    .line 1189
    :catch_94
    move-exception v0

    move-object v9, v1

    .line 1190
    :goto_96
    :try_start_96
    new-instance v1, Lorg/bitcoinj/core/UTXOProviderException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/core/UTXOProviderException;-><init>(Ljava/lang/Throwable;)V

    throw v1
    :try_end_9c
    .catchall {:try_start_96 .. :try_end_9c} :catchall_9c

    .line 1192
    :catchall_9c
    move-exception v0

    goto :goto_7f

    .line 1195
    :catch_9e
    move-exception v0

    .line 1196
    new-instance v1, Lorg/bitcoinj/core/UTXOProviderException;

    const-string v2, "Could not close statement"

    invoke-direct {v1, v2, v0}, Lorg/bitcoinj/core/UTXOProviderException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V

    throw v1

    .line 1192
    :catchall_a7
    move-exception v0

    move-object v9, v1

    goto :goto_7f

    .line 1189
    :catch_aa
    move-exception v0

    goto :goto_96

    .line 1187
    :catch_ac
    move-exception v0

    goto :goto_77
.end method

.method public getParams()Lorg/bitcoinj/core/NetworkParameters;
    .registers 2

    .prologue
    .line 1075
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->params:Lorg/bitcoinj/core/NetworkParameters;

    return-object v0
.end method

.method protected getSelectHeadersDumpSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 400
    const-string v0, "SELECT chainwork, header FROM headers"

    return-object v0
.end method

.method protected getSelectHeadersSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 304
    const-string v0, "SELECT chainwork, height, header, wasundoable FROM headers WHERE hash = ?"

    return-object v0
.end method

.method protected getSelectOpenoutputsCountSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 368
    const-string v0, "SELECT COUNT(*) FROM openoutputs WHERE hash = ?"

    return-object v0
.end method

.method protected getSelectOpenoutputsSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 360
    const-string v0, "SELECT height, value, scriptbytes, coinbase, toaddress, addresstargetable FROM openoutputs WHERE hash = ? AND index = ?"

    return-object v0
.end method

.method protected getSelectSettingsDumpSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 392
    const-string v0, "SELECT name, value FROM settings"

    return-object v0
.end method

.method protected getSelectSettingsSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 280
    const-string v0, "SELECT value FROM settings WHERE name = ?"

    return-object v0
.end method

.method protected getSelectUndoableBlocksSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 328
    const-string v0, "SELECT txoutchanges, transactions FROM undoableblocks WHERE hash = ?"

    return-object v0
.end method

.method protected getSelectUndoableblocksDumpSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 408
    const-string v0, "SELECT txoutchanges, transactions FROM undoableblocks"

    return-object v0
.end method

.method protected getSelectopenoutputsDumpSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 416
    const-string v0, "SELECT value, scriptbytes FROM openoutputs"

    return-object v0
.end method

.method protected getTablesExistSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 241
    const-string v0, "SELECT * FROM settings WHERE 1 = 2"

    return-object v0
.end method

.method public getTransactionOutput(Lorg/bitcoinj/core/Sha256Hash;J)Lorg/bitcoinj/core/UTXO;
    .registers 14

    .prologue
    const/4 v1, 0x0

    .line 916
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 919
    :try_start_4
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    .line 920
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectOpenoutputsSQL()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v2}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;
    :try_end_13
    .catch Ljava/sql/SQLException; {:try_start_4 .. :try_end_13} :catch_73
    .catchall {:try_start_4 .. :try_end_13} :catchall_8b

    move-result-object v9

    .line 921
    const/4 v0, 0x1

    :try_start_15
    invoke-virtual {p1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v2

    invoke-interface {v9, v0, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 923
    const/4 v0, 0x2

    long-to-int v2, p2

    invoke-interface {v9, v0, v2}, Ljava/sql/PreparedStatement;->setInt(II)V

    .line 924
    invoke-interface {v9}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v0

    .line 925
    invoke-interface {v0}, Ljava/sql/ResultSet;->next()Z
    :try_end_28
    .catch Ljava/sql/SQLException; {:try_start_15 .. :try_end_28} :catch_90
    .catchall {:try_start_15 .. :try_end_28} :catchall_8e

    move-result v2

    if-nez v2, :cond_3b

    .line 945
    if-eqz v9, :cond_30

    .line 947
    :try_start_2d
    invoke-interface {v9}, Ljava/sql/PreparedStatement;->close()V
    :try_end_30
    .catch Ljava/sql/SQLException; {:try_start_2d .. :try_end_30} :catch_32

    :cond_30
    move-object v0, v1

    .line 941
    :cond_31
    :goto_31
    return-object v0

    .line 949
    :catch_32
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 929
    :cond_3b
    const/4 v1, 0x1

    :try_start_3c
    invoke-interface {v0, v1}, Ljava/sql/ResultSet;->getInt(I)I

    move-result v5

    .line 930
    const/4 v1, 0x2

    invoke-interface {v0, v1}, Ljava/sql/ResultSet;->getLong(I)J

    move-result-wide v2

    invoke-static {v2, v3}, Lorg/bitcoinj/core/Coin;->valueOf(J)Lorg/bitcoinj/core/Coin;

    move-result-object v4

    .line 931
    const/4 v1, 0x3

    invoke-interface {v0, v1}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v1

    .line 932
    const/4 v2, 0x4

    invoke-interface {v0, v2}, Ljava/sql/ResultSet;->getBoolean(I)Z

    move-result v6

    .line 933
    const/4 v2, 0x5

    invoke-interface {v0, v2}, Ljava/sql/ResultSet;->getString(I)Ljava/lang/String;

    move-result-object v8

    .line 934
    new-instance v0, Lorg/bitcoinj/core/UTXO;

    new-instance v7, Lorg/bitcoinj/script/Script;

    invoke-direct {v7, v1}, Lorg/bitcoinj/script/Script;-><init>([B)V

    move-object v1, p1

    move-wide v2, p2

    invoke-direct/range {v0 .. v8}, Lorg/bitcoinj/core/UTXO;-><init>(Lorg/bitcoinj/core/Sha256Hash;JLorg/bitcoinj/core/Coin;IZLorg/bitcoinj/script/Script;Ljava/lang/String;)V
    :try_end_64
    .catch Ljava/sql/SQLException; {:try_start_3c .. :try_end_64} :catch_90
    .catchall {:try_start_3c .. :try_end_64} :catchall_8e

    .line 945
    if-eqz v9, :cond_31

    .line 947
    :try_start_66
    invoke-interface {v9}, Ljava/sql/PreparedStatement;->close()V
    :try_end_69
    .catch Ljava/sql/SQLException; {:try_start_66 .. :try_end_69} :catch_6a

    goto :goto_31

    .line 949
    :catch_6a
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 942
    :catch_73
    move-exception v0

    .line 943
    :goto_74
    :try_start_74
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2
    :try_end_7a
    .catchall {:try_start_74 .. :try_end_7a} :catchall_7a

    .line 945
    :catchall_7a
    move-exception v0

    move-object v9, v1

    :goto_7c
    if-eqz v9, :cond_81

    .line 947
    :try_start_7e
    invoke-interface {v9}, Ljava/sql/PreparedStatement;->close()V
    :try_end_81
    .catch Ljava/sql/SQLException; {:try_start_7e .. :try_end_81} :catch_82

    .line 949
    :cond_81
    throw v0

    :catch_82
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 945
    :catchall_8b
    move-exception v0

    move-object v9, v1

    goto :goto_7c

    :catchall_8e
    move-exception v0

    goto :goto_7c

    .line 942
    :catch_90
    move-exception v0

    move-object v1, v9

    goto :goto_74
.end method

.method protected getTrasactionOutputSelectSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 259
    const-string v0, "SELECT hash, value, scriptbytes, height, index, coinbase, toaddress, addresstargetable FROM openoutputs where toaddress = ?"

    return-object v0
.end method

.method public getUndoBlock(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/core/StoredUndoableBlock;
    .registers 10

    .prologue
    const/4 v3, 0x4

    const/4 v2, 0x0

    .line 789
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 790
    const/4 v1, 0x0

    .line 792
    :try_start_6
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    .line 793
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectUndoableBlocksSQL()Ljava/lang/String;

    move-result-object v4

    invoke-interface {v0, v4}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v1

    .line 796
    const/16 v0, 0x1c

    new-array v0, v0, [B

    .line 797
    invoke-virtual {p1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v4

    const/4 v5, 0x4

    const/4 v6, 0x0

    const/16 v7, 0x1c

    invoke-static {v4, v5, v0, v6, v7}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 798
    const/4 v4, 0x1

    invoke-interface {v1, v4, v0}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 799
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v0

    .line 800
    invoke-interface {v0}, Ljava/sql/ResultSet;->next()Z
    :try_end_30
    .catch Ljava/sql/SQLException; {:try_start_6 .. :try_end_30} :catch_ae
    .catch Ljava/lang/NullPointerException; {:try_start_6 .. :try_end_30} :catch_bc
    .catch Ljava/lang/ClassCastException; {:try_start_6 .. :try_end_30} :catch_c3
    .catch Lorg/bitcoinj/core/ProtocolException; {:try_start_6 .. :try_end_30} :catch_ca
    .catch Ljava/io/IOException; {:try_start_6 .. :try_end_30} :catch_d1
    .catchall {:try_start_6 .. :try_end_30} :catchall_b5

    move-result v4

    if-nez v4, :cond_43

    .line 841
    if-eqz v1, :cond_38

    .line 843
    :try_start_35
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_38
    .catch Ljava/sql/SQLException; {:try_start_35 .. :try_end_38} :catch_3a

    .line 801
    :cond_38
    const/4 v0, 0x0

    .line 825
    :cond_39
    :goto_39
    return-object v0

    .line 845
    :catch_3a
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 804
    :cond_43
    const/4 v4, 0x1

    :try_start_44
    invoke-interface {v0, v4}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v4

    .line 805
    const/4 v5, 0x2

    invoke-interface {v0, v5}, Ljava/sql/ResultSet;->getBytes(I)[B

    move-result-object v5

    .line 807
    if-nez v4, :cond_9e

    .line 809
    const/4 v0, 0x0

    aget-byte v0, v5, v0

    and-int/lit16 v0, v0, 0xff

    const/4 v4, 0x1

    aget-byte v4, v5, v4

    and-int/lit16 v4, v4, 0xff

    shl-int/lit8 v4, v4, 0x8

    or-int/2addr v0, v4

    const/4 v4, 0x2

    aget-byte v4, v5, v4

    and-int/lit16 v4, v4, 0xff

    shl-int/lit8 v4, v4, 0x10

    or-int/2addr v0, v4

    const/4 v4, 0x3

    aget-byte v4, v5, v4

    and-int/lit16 v4, v4, 0xff

    shl-int/lit8 v4, v4, 0x18

    or-int/2addr v4, v0

    .line 813
    new-instance v6, Ljava/util/LinkedList;

    invoke-direct {v6}, Ljava/util/LinkedList;-><init>()V

    move v0, v2

    move v2, v3

    .line 814
    :goto_73
    if-ge v0, v4, :cond_8a

    .line 815
    iget-object v3, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->params:Lorg/bitcoinj/core/NetworkParameters;

    invoke-virtual {v3}, Lorg/bitcoinj/core/NetworkParameters;->getDefaultSerializer()Lorg/bitcoinj/core/MessageSerializer;

    move-result-object v3

    invoke-virtual {v3, v5, v2}, Lorg/bitcoinj/core/MessageSerializer;->makeTransaction([BI)Lorg/bitcoinj/core/Transaction;

    move-result-object v3

    .line 816
    invoke-interface {v6, v3}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 817
    invoke-virtual {v3}, Lorg/bitcoinj/core/Transaction;->getMessageSize()I

    move-result v3

    add-int/2addr v2, v3

    .line 814
    add-int/lit8 v0, v0, 0x1

    goto :goto_73

    .line 819
    :cond_8a
    new-instance v0, Lorg/bitcoinj/core/StoredUndoableBlock;

    invoke-direct {v0, p1, v6}, Lorg/bitcoinj/core/StoredUndoableBlock;-><init>(Lorg/bitcoinj/core/Sha256Hash;Ljava/util/List;)V
    :try_end_8f
    .catch Ljava/sql/SQLException; {:try_start_44 .. :try_end_8f} :catch_ae
    .catch Ljava/lang/NullPointerException; {:try_start_44 .. :try_end_8f} :catch_bc
    .catch Ljava/lang/ClassCastException; {:try_start_44 .. :try_end_8f} :catch_c3
    .catch Lorg/bitcoinj/core/ProtocolException; {:try_start_44 .. :try_end_8f} :catch_ca
    .catch Ljava/io/IOException; {:try_start_44 .. :try_end_8f} :catch_d1
    .catchall {:try_start_44 .. :try_end_8f} :catchall_b5

    .line 841
    :goto_8f
    if-eqz v1, :cond_39

    .line 843
    :try_start_91
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_94
    .catch Ljava/sql/SQLException; {:try_start_91 .. :try_end_94} :catch_95

    goto :goto_39

    .line 845
    :catch_95
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 821
    :cond_9e
    :try_start_9e
    new-instance v2, Lorg/bitcoinj/core/TransactionOutputChanges;

    new-instance v0, Ljava/io/ByteArrayInputStream;

    invoke-direct {v0, v4}, Ljava/io/ByteArrayInputStream;-><init>([B)V

    invoke-direct {v2, v0}, Lorg/bitcoinj/core/TransactionOutputChanges;-><init>(Ljava/io/InputStream;)V

    .line 823
    new-instance v0, Lorg/bitcoinj/core/StoredUndoableBlock;

    invoke-direct {v0, p1, v2}, Lorg/bitcoinj/core/StoredUndoableBlock;-><init>(Lorg/bitcoinj/core/Sha256Hash;Lorg/bitcoinj/core/TransactionOutputChanges;)V
    :try_end_ad
    .catch Ljava/sql/SQLException; {:try_start_9e .. :try_end_ad} :catch_ae
    .catch Ljava/lang/NullPointerException; {:try_start_9e .. :try_end_ad} :catch_bc
    .catch Ljava/lang/ClassCastException; {:try_start_9e .. :try_end_ad} :catch_c3
    .catch Lorg/bitcoinj/core/ProtocolException; {:try_start_9e .. :try_end_ad} :catch_ca
    .catch Ljava/io/IOException; {:try_start_9e .. :try_end_ad} :catch_d1
    .catchall {:try_start_9e .. :try_end_ad} :catchall_b5

    goto :goto_8f

    .line 826
    :catch_ae
    move-exception v0

    .line 827
    :try_start_af
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2
    :try_end_b5
    .catchall {:try_start_af .. :try_end_b5} :catchall_b5

    .line 841
    :catchall_b5
    move-exception v0

    if-eqz v1, :cond_bb

    .line 843
    :try_start_b8
    invoke-interface {v1}, Ljava/sql/PreparedStatement;->close()V
    :try_end_bb
    .catch Ljava/sql/SQLException; {:try_start_b8 .. :try_end_bb} :catch_d8

    .line 845
    :cond_bb
    throw v0

    .line 828
    :catch_bc
    move-exception v0

    .line 830
    :try_start_bd
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2

    .line 831
    :catch_c3
    move-exception v0

    .line 833
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2

    .line 834
    :catch_ca
    move-exception v0

    .line 836
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2

    .line 837
    :catch_d1
    move-exception v0

    .line 839
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2
    :try_end_d8
    .catchall {:try_start_bd .. :try_end_d8} :catchall_b5

    .line 845
    :catch_d8
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0
.end method

.method protected getUpdateHeadersSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 320
    const-string v0, "UPDATE headers SET wasundoable=? WHERE hash=?"

    return-object v0
.end method

.method protected getUpdateSettingsSLQ()Ljava/lang/String;
    .registers 2

    .prologue
    .line 296
    const-string v0, "UPDATE settings SET value = ? WHERE name = ?"

    return-object v0
.end method

.method protected getUpdateUndoableBlocksSQL()Ljava/lang/String;
    .registers 2

    .prologue
    .line 344
    const-string v0, "UPDATE undoableblocks SET txoutchanges=?, transactions=? WHERE hash = ?"

    return-object v0
.end method

.method public getVerifiedChainHead()Lorg/bitcoinj/core/StoredBlock;
    .registers 2

    .prologue
    .line 876
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    return-object v0
.end method

.method public hasUnspentOutputs(Lorg/bitcoinj/core/Sha256Hash;I)Z
    .registers 7

    .prologue
    const/4 v1, 0x1

    .line 1049
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1050
    const/4 v2, 0x0

    .line 1052
    :try_start_5
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getSelectOpenoutputsCountSQL()Ljava/lang/String;

    move-result-object v3

    invoke-interface {v0, v3}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;
    :try_end_14
    .catch Ljava/sql/SQLException; {:try_start_5 .. :try_end_14} :catch_63
    .catchall {:try_start_5 .. :try_end_14} :catchall_61

    move-result-object v2

    .line 1053
    const/4 v0, 0x1

    :try_start_16
    invoke-virtual {p1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v3

    invoke-interface {v2, v0, v3}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 1054
    invoke-interface {v2}, Ljava/sql/PreparedStatement;->executeQuery()Ljava/sql/ResultSet;

    move-result-object v0

    .line 1055
    invoke-interface {v0}, Ljava/sql/ResultSet;->next()Z

    move-result v3

    if-nez v3, :cond_3f

    .line 1056
    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Got no results from a COUNT(*) query"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0
    :try_end_2f
    .catch Ljava/sql/SQLException; {:try_start_16 .. :try_end_2f} :catch_2f
    .catchall {:try_start_16 .. :try_end_2f} :catchall_61

    .line 1060
    :catch_2f
    move-exception v0

    move-object v1, v2

    .line 1061
    :goto_31
    :try_start_31
    new-instance v2, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v2, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v2
    :try_end_37
    .catchall {:try_start_31 .. :try_end_37} :catchall_37

    .line 1063
    :catchall_37
    move-exception v0

    move-object v2, v1

    :goto_39
    if-eqz v2, :cond_3e

    .line 1065
    :try_start_3b
    invoke-interface {v2}, Ljava/sql/PreparedStatement;->close()V
    :try_end_3e
    .catch Ljava/sql/SQLException; {:try_start_3b .. :try_end_3e} :catch_58

    .line 1067
    :cond_3e
    throw v0

    .line 1058
    :cond_3f
    const/4 v3, 0x1

    :try_start_40
    invoke-interface {v0, v3}, Ljava/sql/ResultSet;->getInt(I)I
    :try_end_43
    .catch Ljava/sql/SQLException; {:try_start_40 .. :try_end_43} :catch_2f
    .catchall {:try_start_40 .. :try_end_43} :catchall_61

    move-result v0

    .line 1059
    if-eqz v0, :cond_4d

    move v0, v1

    .line 1063
    :goto_47
    if-eqz v2, :cond_4c

    .line 1065
    :try_start_49
    invoke-interface {v2}, Ljava/sql/PreparedStatement;->close()V
    :try_end_4c
    .catch Ljava/sql/SQLException; {:try_start_49 .. :try_end_4c} :catch_4f

    .line 1059
    :cond_4c
    return v0

    :cond_4d
    const/4 v0, 0x0

    goto :goto_47

    .line 1067
    :catch_4f
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    :catch_58
    move-exception v0

    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Failed to close PreparedStatement"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 1063
    :catchall_61
    move-exception v0

    goto :goto_39

    .line 1060
    :catch_63
    move-exception v0

    move-object v1, v2

    goto :goto_31
.end method

.method protected final declared-synchronized maybeConnect()V
    .registers 4

    .prologue
    .line 426
    monitor-enter p0

    :try_start_1
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    if-eqz v0, :cond_19

    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-interface {v0}, Ljava/sql/Connection;->isClosed()Z
    :try_end_14
    .catch Ljava/sql/SQLException; {:try_start_1 .. :try_end_14} :catch_5f
    .catchall {:try_start_1 .. :try_end_14} :catchall_66

    move-result v0

    if-nez v0, :cond_19

    .line 449
    :goto_17
    monitor-exit p0

    return-void

    .line 429
    :cond_19
    :try_start_19
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->username:Ljava/lang/String;

    if-eqz v0, :cond_21

    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->password:Ljava/lang/String;

    if-nez v0, :cond_69

    .line 430
    :cond_21
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    iget-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->connectionURL:Ljava/lang/String;

    invoke-static {v1}, Ljava/sql/DriverManager;->getConnection(Ljava/lang/String;)Ljava/sql/Connection;

    move-result-object v1

    invoke-virtual {v0, v1}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V

    .line 437
    :goto_2c
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->allConnections:Ljava/util/List;

    iget-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v1}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v1

    invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 438
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    .line 440
    iget-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->schemaName:Ljava/lang/String;

    if-eqz v1, :cond_88

    .line 441
    invoke-interface {v0}, Ljava/sql/Connection;->createStatement()Ljava/sql/Statement;

    move-result-object v1

    .line 442
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getCreateSchemeSQL()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v2

    :goto_4f
    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_88

    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/lang/String;

    .line 443
    invoke-interface {v1, v0}, Ljava/sql/Statement;->execute(Ljava/lang/String;)Z
    :try_end_5e
    .catch Ljava/sql/SQLException; {:try_start_19 .. :try_end_5e} :catch_5f
    .catchall {:try_start_19 .. :try_end_5e} :catchall_66

    goto :goto_4f

    .line 447
    :catch_5f
    move-exception v0

    .line 448
    :try_start_60
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
    :try_end_66
    .catchall {:try_start_60 .. :try_end_66} :catchall_66

    .line 426
    :catchall_66
    move-exception v0

    monitor-exit p0

    throw v0

    .line 432
    :cond_69
    :try_start_69
    new-instance v0, Ljava/util/Properties;

    invoke-direct {v0}, Ljava/util/Properties;-><init>()V

    .line 433
    const-string v1, "user"

    iget-object v2, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->username:Ljava/lang/String;

    invoke-virtual {v0, v1, v2}, Ljava/util/Properties;->setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;

    .line 434
    const-string v1, "password"

    iget-object v2, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->password:Ljava/lang/String;

    invoke-virtual {v0, v1, v2}, Ljava/util/Properties;->setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;

    .line 435
    iget-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    iget-object v2, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->connectionURL:Ljava/lang/String;

    invoke-static {v2, v0}, Ljava/sql/DriverManager;->getConnection(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;

    move-result-object v0

    invoke-virtual {v1, v0}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V

    goto :goto_2c

    .line 446
    :cond_88
    sget-object v0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    new-instance v1, Ljava/lang/StringBuilder;

    const-string v2, "Made a new connection to database "

    invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    iget-object v2, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->connectionURL:Ljava/lang/String;

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Lorg/slf4j/Logger;->info(Ljava/lang/String;)V
    :try_end_9e
    .catch Ljava/sql/SQLException; {:try_start_69 .. :try_end_9e} :catch_5f
    .catchall {:try_start_69 .. :try_end_9e} :catchall_66

    goto/16 :goto_17
.end method

.method public put(Lorg/bitcoinj/core/StoredBlock;)V
    .registers 4

    .prologue
    .line 646
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 648
    const/4 v0, 0x0

    :try_start_4
    invoke-virtual {p0, p1, v0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->putUpdateStoredBlock(Lorg/bitcoinj/core/StoredBlock;Z)V
    :try_end_7
    .catch Ljava/sql/SQLException; {:try_start_4 .. :try_end_7} :catch_8

    .line 651
    return-void

    .line 649
    :catch_8
    move-exception v0

    .line 650
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method public put(Lorg/bitcoinj/core/StoredBlock;Lorg/bitcoinj/core/StoredUndoableBlock;)V
    .registers 9

    .prologue
    const/4 v4, 0x4

    .line 657
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 659
    const/16 v0, 0x1c

    new-array v3, v0, [B

    .line 660
    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeader()Lorg/bitcoinj/core/Block;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/Block;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v0

    const/4 v1, 0x0

    const/16 v2, 0x1c

    invoke-static {v0, v4, v3, v1, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 661
    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeight()I

    move-result v4

    .line 662
    const/4 v2, 0x0

    .line 663
    const/4 v1, 0x0

    .line 665
    :try_start_20
    new-instance v5, Ljava/io/ByteArrayOutputStream;

    invoke-direct {v5}, Ljava/io/ByteArrayOutputStream;-><init>()V

    .line 666
    invoke-virtual {p2}, Lorg/bitcoinj/core/StoredUndoableBlock;->getTxOutChanges()Lorg/bitcoinj/core/TransactionOutputChanges;

    move-result-object v0

    if-eqz v0, :cond_68

    .line 667
    invoke-virtual {p2}, Lorg/bitcoinj/core/StoredUndoableBlock;->getTxOutChanges()Lorg/bitcoinj/core/TransactionOutputChanges;

    move-result-object v0

    invoke-virtual {v0, v5}, Lorg/bitcoinj/core/TransactionOutputChanges;->serializeToStream(Ljava/io/OutputStream;)V

    .line 668
    invoke-virtual {v5}, Ljava/io/ByteArrayOutputStream;->toByteArray()[B

    move-result-object v0

    move-object v1, v0

    .line 679
    :goto_37
    invoke-virtual {v5}, Ljava/io/ByteArrayOutputStream;->close()V
    :try_end_3a
    .catch Ljava/io/IOException; {:try_start_20 .. :try_end_3a} :catch_a2

    .line 686
    :try_start_3a
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    .line 687
    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getInsertUndoableBlocksSQL()Ljava/lang/String;

    move-result-object v5

    invoke-interface {v0, v5}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 688
    const/4 v5, 0x1

    invoke-interface {v0, v5, v3}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 689
    const/4 v5, 0x2

    invoke-interface {v0, v5, v4}, Ljava/sql/PreparedStatement;->setInt(II)V

    .line 690
    if-nez v2, :cond_af

    .line 691
    const/4 v4, 0x3

    invoke-interface {v0, v4, v1}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 692
    const/4 v4, 0x4

    const/4 v5, -0x2

    invoke-interface {v0, v4, v5}, Ljava/sql/PreparedStatement;->setNull(II)V

    .line 697
    :goto_5d
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 698
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V
    :try_end_63
    .catch Ljava/sql/SQLException; {:try_start_3a .. :try_end_63} :catch_b9

    .line 700
    const/4 v0, 0x1

    :try_start_64
    invoke-virtual {p0, p1, v0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->putUpdateStoredBlock(Lorg/bitcoinj/core/StoredBlock;Z)V
    :try_end_67
    .catch Ljava/sql/SQLException; {:try_start_64 .. :try_end_67} :catch_d5

    .line 724
    :goto_67
    return-void

    .line 670
    :cond_68
    :try_start_68
    invoke-virtual {p2}, Lorg/bitcoinj/core/StoredUndoableBlock;->getTransactions()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->size()I

    move-result v0

    .line 671
    and-int/lit16 v2, v0, 0xff

    invoke-virtual {v5, v2}, Ljava/io/ByteArrayOutputStream;->write(I)V

    .line 672
    shr-int/lit8 v2, v0, 0x8

    and-int/lit16 v2, v2, 0xff

    invoke-virtual {v5, v2}, Ljava/io/ByteArrayOutputStream;->write(I)V

    .line 673
    shr-int/lit8 v2, v0, 0x10

    and-int/lit16 v2, v2, 0xff

    invoke-virtual {v5, v2}, Ljava/io/ByteArrayOutputStream;->write(I)V

    .line 674
    shr-int/lit8 v0, v0, 0x18

    and-int/lit16 v0, v0, 0xff

    invoke-virtual {v5, v0}, Ljava/io/ByteArrayOutputStream;->write(I)V

    .line 675
    invoke-virtual {p2}, Lorg/bitcoinj/core/StoredUndoableBlock;->getTransactions()Ljava/util/List;

    move-result-object v0

    invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;

    move-result-object v2

    :goto_92
    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_a9

    invoke-interface {v2}, Ljava/util/Iterator;->next()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/bitcoinj/core/Transaction;

    .line 676
    invoke-virtual {v0, v5}, Lorg/bitcoinj/core/Transaction;->bitcoinSerialize(Ljava/io/OutputStream;)V
    :try_end_a1
    .catch Ljava/io/IOException; {:try_start_68 .. :try_end_a1} :catch_a2

    goto :goto_92

    .line 680
    :catch_a2
    move-exception v0

    .line 681
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1

    .line 677
    :cond_a9
    :try_start_a9
    invoke-virtual {v5}, Ljava/io/ByteArrayOutputStream;->toByteArray()[B
    :try_end_ac
    .catch Ljava/io/IOException; {:try_start_a9 .. :try_end_ac} :catch_a2

    move-result-object v0

    move-object v2, v0

    goto :goto_37

    .line 694
    :cond_af
    const/4 v4, 0x3

    const/4 v5, -0x2

    :try_start_b1
    invoke-interface {v0, v4, v5}, Ljava/sql/PreparedStatement;->setNull(II)V

    .line 695
    const/4 v4, 0x4

    invoke-interface {v0, v4, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V
    :try_end_b8
    .catch Ljava/sql/SQLException; {:try_start_b1 .. :try_end_b8} :catch_b9

    goto :goto_5d

    .line 704
    :catch_b9
    move-exception v0

    .line 705
    :try_start_ba
    invoke-virtual {v0}, Ljava/sql/SQLException;->getSQLState()Ljava/lang/String;

    move-result-object v4

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getDuplicateKeyErrorCode()Ljava/lang/String;

    move-result-object v5

    invoke-virtual {v4, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v4

    if-nez v4, :cond_dc

    .line 706
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
    :try_end_ce
    .catch Ljava/sql/SQLException; {:try_start_ba .. :try_end_ce} :catch_ce

    .line 722
    :catch_ce
    move-exception v0

    .line 723
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1

    .line 701
    :catch_d5
    move-exception v0

    .line 702
    :try_start_d6
    new-instance v4, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v4, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v4
    :try_end_dc
    .catch Ljava/sql/SQLException; {:try_start_d6 .. :try_end_dc} :catch_b9

    .line 709
    :cond_dc
    :try_start_dc
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    .line 710
    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getUpdateUndoableBlocksSQL()Ljava/lang/String;

    move-result-object v4

    invoke-interface {v0, v4}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 711
    const/4 v4, 0x3

    invoke-interface {v0, v4, v3}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 712
    if-nez v2, :cond_103

    .line 713
    const/4 v2, 0x1

    invoke-interface {v0, v2, v1}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 714
    const/4 v1, 0x2

    const/4 v2, -0x2

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setNull(II)V

    .line 719
    :goto_fb
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 720
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V

    goto/16 :goto_67

    .line 716
    :cond_103
    const/4 v1, 0x1

    const/4 v3, -0x2

    invoke-interface {v0, v1, v3}, Ljava/sql/PreparedStatement;->setNull(II)V

    .line 717
    const/4 v1, 0x2

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V
    :try_end_10c
    .catch Ljava/sql/SQLException; {:try_start_dc .. :try_end_10c} :catch_ce

    goto :goto_fb
.end method

.method protected putUpdateStoredBlock(Lorg/bitcoinj/core/StoredBlock;Z)V
    .registers 14

    .prologue
    const/4 v10, 0x2

    const/4 v9, 0x0

    const/4 v8, 0x4

    const/4 v7, 0x1

    const/16 v6, 0x1c

    .line 615
    :try_start_6
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    .line 616
    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getInsertHeadersSQL()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 618
    const/16 v1, 0x1c

    new-array v1, v1, [B

    .line 619
    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeader()Lorg/bitcoinj/core/Block;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Block;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v2

    const/4 v3, 0x4

    const/4 v4, 0x0

    const/16 v5, 0x1c

    invoke-static {v2, v3, v1, v4, v5}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 620
    const/4 v2, 0x1

    invoke-interface {v0, v2, v1}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 621
    const/4 v1, 0x2

    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getChainWork()Ljava/math/BigInteger;

    move-result-object v2

    invoke-virtual {v2}, Ljava/math/BigInteger;->toByteArray()[B

    move-result-object v2

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 622
    const/4 v1, 0x3

    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeight()I

    move-result v2

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setInt(II)V

    .line 623
    const/4 v1, 0x4

    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeader()Lorg/bitcoinj/core/Block;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Block;->cloneAsHeader()Lorg/bitcoinj/core/Block;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Block;->unsafeBitcoinSerialize()[B

    move-result-object v2

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 624
    const/4 v1, 0x5

    invoke-interface {v0, v1, p2}, Ljava/sql/PreparedStatement;->setBoolean(IZ)V

    .line 625
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 626
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V
    :try_end_5f
    .catch Ljava/sql/SQLException; {:try_start_6 .. :try_end_5f} :catch_60

    .line 642
    :goto_5f
    return-void

    .line 627
    :catch_60
    move-exception v0

    .line 630
    invoke-virtual {v0}, Ljava/sql/SQLException;->getSQLState()Ljava/lang/String;

    move-result-object v1

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getDuplicateKeyErrorCode()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v1

    if-eqz v1, :cond_71

    if-nez p2, :cond_72

    .line 631
    :cond_71
    throw v0

    .line 633
    :cond_72
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getUpdateHeadersSQL()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 634
    invoke-interface {v0, v7, v7}, Ljava/sql/PreparedStatement;->setBoolean(IZ)V

    .line 636
    new-array v1, v6, [B

    .line 637
    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeader()Lorg/bitcoinj/core/Block;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Block;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v2

    invoke-static {v2, v8, v1, v9, v6}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    .line 638
    invoke-interface {v0, v10, v1}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 639
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 640
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V

    goto :goto_5f
.end method

.method public removeUnspentTransactionOutput(Lorg/bitcoinj/core/UTXO;)V
    .registers 6

    .prologue
    .line 988
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 990
    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v0

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getIndex()J

    move-result-wide v2

    invoke-virtual {p0, v0, v2, v3}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getTransactionOutput(Lorg/bitcoinj/core/Sha256Hash;J)Lorg/bitcoinj/core/UTXO;

    move-result-object v0

    if-nez v0, :cond_19

    .line 991
    new-instance v0, Lorg/bitcoinj/store/BlockStoreException;

    const-string v1, "Tried to remove a UTXO from DatabaseFullPrunedBlockStore that it didn\'t have!"

    invoke-direct {v0, v1}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 993
    :cond_19
    :try_start_19
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    .line 994
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getDeleteOpenoutputsSQL()Ljava/lang/String;

    move-result-object v1

    invoke-interface {v0, v1}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 995
    const/4 v1, 0x1

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v2

    invoke-virtual {v2}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v2

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 997
    const/4 v1, 0x2

    invoke-virtual {p1}, Lorg/bitcoinj/core/UTXO;->getIndex()J

    move-result-wide v2

    long-to-int v2, v2

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setInt(II)V

    .line 998
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 999
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V
    :try_end_44
    .catch Ljava/sql/SQLException; {:try_start_19 .. :try_end_44} :catch_45

    .line 1002
    return-void

    .line 1000
    :catch_45
    move-exception v0

    .line 1001
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method public resetStore()V
    .registers 3

    .prologue
    .line 1092
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 1094
    :try_start_3
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->deleteStore()V

    .line 1095
    invoke-direct {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->createTables()V

    .line 1096
    invoke-direct {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->initFromDatabase()V
    :try_end_c
    .catch Ljava/sql/SQLException; {:try_start_3 .. :try_end_c} :catch_d

    .line 1099
    return-void

    .line 1097
    :catch_d
    move-exception v0

    .line 1098
    new-instance v1, Ljava/lang/RuntimeException;

    invoke-direct {v1, v0}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method public setChainHead(Lorg/bitcoinj/core/StoredBlock;)V
    .registers 6

    .prologue
    .line 858
    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeader()Lorg/bitcoinj/core/Block;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/Block;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v1

    .line 859
    iput-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

    .line 860
    iput-object p1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    .line 861
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 863
    :try_start_f
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    .line 864
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getUpdateSettingsSLQ()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v2}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 865
    const/4 v2, 0x2

    const-string v3, "chainhead"

    invoke-interface {v0, v2, v3}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 866
    const/4 v2, 0x1

    invoke-virtual {v1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v1

    invoke-interface {v0, v2, v1}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 867
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 868
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V
    :try_end_33
    .catch Ljava/sql/SQLException; {:try_start_f .. :try_end_33} :catch_34

    .line 871
    return-void

    .line 869
    :catch_34
    move-exception v0

    .line 870
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

.method public setVerifiedChainHead(Lorg/bitcoinj/core/StoredBlock;)V
    .registers 6

    .prologue
    .line 881
    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeader()Lorg/bitcoinj/core/Block;

    move-result-object v0

    invoke-virtual {v0}, Lorg/bitcoinj/core/Block;->getHash()Lorg/bitcoinj/core/Sha256Hash;

    move-result-object v1

    .line 882
    iput-object v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadHash:Lorg/bitcoinj/core/Sha256Hash;

    .line 883
    iput-object p1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->verifiedChainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    .line 884
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->maybeConnect()V

    .line 886
    :try_start_f
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/sql/Connection;

    .line 887
    invoke-virtual {p0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->getUpdateSettingsSLQ()Ljava/lang/String;

    move-result-object v2

    invoke-interface {v0, v2}, Ljava/sql/Connection;->prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;

    move-result-object v0

    .line 888
    const/4 v2, 0x2

    const-string v3, "verifiedchainhead"

    invoke-interface {v0, v2, v3}, Ljava/sql/PreparedStatement;->setString(ILjava/lang/String;)V

    .line 889
    const/4 v2, 0x1

    invoke-virtual {v1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B

    move-result-object v1

    invoke-interface {v0, v2, v1}, Ljava/sql/PreparedStatement;->setBytes(I[B)V

    .line 890
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->executeUpdate()I

    .line 891
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V
    :try_end_33
    .catch Ljava/sql/SQLException; {:try_start_f .. :try_end_33} :catch_4d

    .line 895
    iget-object v0, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->chainHeadBlock:Lorg/bitcoinj/core/StoredBlock;

    invoke-virtual {v0}, Lorg/bitcoinj/core/StoredBlock;->getHeight()I

    move-result v0

    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeight()I

    move-result v1

    if-ge v0, v1, :cond_42

    .line 896
    invoke-virtual {p0, p1}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->setChainHead(Lorg/bitcoinj/core/StoredBlock;)V

    .line 897
    :cond_42
    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeight()I

    move-result v0

    iget v1, p0, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->fullStoreDepth:I

    sub-int/2addr v0, v1

    invoke-direct {p0, v0}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;->removeUndoableBlocksWhereHeightIsLessThan(I)V

    .line 898
    return-void

    .line 892
    :catch_4d
    move-exception v0

    .line 893
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

    invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method