PostgresFullPrunedBlockStore.smali

.class public Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;
.super Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;
.source "PostgresFullPrunedBlockStore.java"


# static fields
.field private static final CREATE_HEADERS_TABLE:Ljava/lang/String; = "CREATE TABLE headers (\n    hash bytea NOT NULL,\n    chainwork bytea NOT NULL,\n    height integer NOT NULL,\n    header bytea NOT NULL,\n    wasundoable boolean NOT NULL,\n    CONSTRAINT headers_pk PRIMARY KEY (hash)\n)\n"

.field private static final CREATE_OPEN_OUTPUT_TABLE:Ljava/lang/String; = "CREATE TABLE openoutputs (\n    hash bytea NOT NULL,\n    index integer NOT NULL,\n    height integer NOT NULL,\n    value bigint NOT NULL,\n    scriptbytes bytea NOT NULL,\n    toaddress character varying(35),\n    addresstargetable smallint,\n    coinbase boolean,\n    CONSTRAINT openoutputs_pk PRIMARY KEY (hash,index)\n)\n"

.field private static final CREATE_OUTPUTS_ADDRESSTARGETABLE_INDEX:Ljava/lang/String; = "CREATE INDEX openoutputs_addresstargetable_idx ON openoutputs USING btree (addresstargetable)"

.field private static final CREATE_OUTPUTS_ADDRESS_MULTI_INDEX:Ljava/lang/String; = "CREATE INDEX openoutputs_hash_index_num_height_toaddress_idx ON openoutputs USING btree (hash, index, height, toaddress)"

.field private static final CREATE_OUTPUTS_HASH_INDEX:Ljava/lang/String; = "CREATE INDEX openoutputs_hash_idx ON openoutputs USING btree (hash)"

.field private static final CREATE_OUTPUTS_TOADDRESS_INDEX:Ljava/lang/String; = "CREATE INDEX openoutputs_toaddress_idx ON openoutputs USING btree (toaddress)"

.field private static final CREATE_SETTINGS_TABLE:Ljava/lang/String; = "CREATE TABLE settings (\n    name character varying(32) NOT NULL,\n    value bytea,\n    CONSTRAINT setting_pk PRIMARY KEY (name)\n)\n"

.field private static final CREATE_UNDOABLE_TABLE:Ljava/lang/String; = "CREATE TABLE undoableblocks (\n    hash bytea NOT NULL,\n    height integer NOT NULL,\n    txoutchanges bytea,\n    transactions bytea,\n    CONSTRAINT undoableblocks_pk PRIMARY KEY (hash)\n)\n"

.field private static final CREATE_UNDOABLE_TABLE_INDEX:Ljava/lang/String; = "CREATE INDEX undoableblocks_height_idx ON undoableBlocks USING btree (height)"

.field private static final DATABASE_CONNECTION_URL_PREFIX:Ljava/lang/String; = "jdbc:postgresql://"

.field private static final DATABASE_DRIVER_CLASS:Ljava/lang/String; = "org.postgresql.Driver"

.field private static final POSTGRES_DUPLICATE_KEY_ERROR_CODE:Ljava/lang/String; = "23505"

.field private static final SELECT_UNDOABLEBLOCKS_EXISTS_SQL:Ljava/lang/String; = "select 1 from undoableblocks where hash = ?"

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


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

    .prologue
    .line 41
    const-class v0, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;

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

    move-result-object v0

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

    return-void
.end method

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

    .prologue
    .line 105
    new-instance v0, Ljava/lang/StringBuilder;

    const-string v1, "jdbc:postgresql://"

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

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

    move-result-object v0

    const-string v1, "/"

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

    move-result-object v0

    invoke-virtual {v0, p4}, 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 v2

    const/4 v6, 0x0

    move-object v0, p0

    move-object v1, p1

    move v3, p2

    move-object v4, p5

    move-object v5, p6

    invoke-direct/range {v0 .. v6}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;-><init>(Lorg/bitcoinj/core/NetworkParameters;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V

    .line 106
    return-void
.end method

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

    .prologue
    .line 126
    new-instance v0, Ljava/lang/StringBuilder;

    const-string v1, "jdbc:postgresql://"

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

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

    move-result-object v0

    const-string v1, "/"

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

    move-result-object v0

    invoke-virtual {v0, p4}, 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 v2

    move-object v0, p0

    move-object v1, p1

    move v3, p2

    move-object v4, p5

    move-object v5, p6

    move-object v6, p7

    invoke-direct/range {v0 .. v6}, Lorg/bitcoinj/store/DatabaseFullPrunedBlockStore;-><init>(Lorg/bitcoinj/core/NetworkParameters;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V

    .line 127
    return-void
.end method


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

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

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

    .line 147
    const-string v1, "CREATE INDEX undoableblocks_height_idx ON undoableBlocks USING btree (height)"

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

    .line 148
    const-string v1, "CREATE INDEX openoutputs_hash_index_num_height_toaddress_idx ON openoutputs USING btree (hash, index, height, toaddress)"

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

    .line 149
    const-string v1, "CREATE INDEX openoutputs_addresstargetable_idx ON openoutputs USING btree (addresstargetable)"

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

    .line 150
    const-string v1, "CREATE INDEX openoutputs_hash_idx ON openoutputs USING btree (hash)"

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

    .line 151
    const-string v1, "CREATE INDEX openoutputs_toaddress_idx ON openoutputs USING btree (toaddress)"

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

    .line 152
    return-object v0
.end method

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

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

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

    .line 158
    new-instance v1, Ljava/lang/StringBuilder;

    const-string v2, "CREATE SCHEMA IF NOT EXISTS "

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

    iget-object v2, p0, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->schemaName: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}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 159
    new-instance v1, Ljava/lang/StringBuilder;

    const-string v2, "set search_path to \'"

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

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

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

    move-result-object v1

    const-string v2, "\'"

    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}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 160
    return-object v0
.end method

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

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

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

    .line 137
    const-string v1, "CREATE TABLE settings (\n    name character varying(32) NOT NULL,\n    value bytea,\n    CONSTRAINT setting_pk PRIMARY KEY (name)\n)\n"

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

    .line 138
    const-string v1, "CREATE TABLE headers (\n    hash bytea NOT NULL,\n    chainwork bytea NOT NULL,\n    height integer NOT NULL,\n    header bytea NOT NULL,\n    wasundoable boolean NOT NULL,\n    CONSTRAINT headers_pk PRIMARY KEY (hash)\n)\n"

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

    .line 139
    const-string v1, "CREATE TABLE undoableblocks (\n    hash bytea NOT NULL,\n    height integer NOT NULL,\n    txoutchanges bytea,\n    transactions bytea,\n    CONSTRAINT undoableblocks_pk PRIMARY KEY (hash)\n)\n"

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

    .line 140
    const-string v1, "CREATE TABLE openoutputs (\n    hash bytea NOT NULL,\n    index integer NOT NULL,\n    height integer NOT NULL,\n    value bigint NOT NULL,\n    scriptbytes bytea NOT NULL,\n    toaddress character varying(35),\n    addresstargetable smallint,\n    coinbase boolean,\n    CONSTRAINT openoutputs_pk PRIMARY KEY (hash,index)\n)\n"

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

    .line 141
    return-object v0
.end method

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

    .prologue
    .line 165
    const-string v0, "org.postgresql.Driver"

    return-object v0
.end method

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

    .prologue
    .line 131
    const-string v0, "23505"

    return-object v0
.end method

.method public put(Lorg/bitcoinj/core/StoredBlock;Lorg/bitcoinj/core/StoredUndoableBlock;)V
    .registers 11

    .prologue
    const/4 v4, 0x4

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

    .line 172
    const/16 v0, 0x1c

    new-array v3, v0, [B

    .line 173
    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 174
    invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeight()I

    move-result v4

    .line 175
    const/4 v2, 0x0

    .line 176
    const/4 v1, 0x0

    .line 178
    :try_start_20
    new-instance v5, Ljava/io/ByteArrayOutputStream;

    invoke-direct {v5}, Ljava/io/ByteArrayOutputStream;-><init>()V

    .line 179
    invoke-virtual {p2}, Lorg/bitcoinj/core/StoredUndoableBlock;->getTxOutChanges()Lorg/bitcoinj/core/TransactionOutputChanges;

    move-result-object v0

    if-eqz v0, :cond_c3

    .line 180
    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 181
    invoke-virtual {v5}, Ljava/io/ByteArrayOutputStream;->toByteArray()[B

    move-result-object v0

    move-object v1, v0

    .line 192
    :goto_37
    invoke-virtual {v5}, Ljava/io/ByteArrayOutputStream;->close()V
    :try_end_3a
    .catch Ljava/io/IOException; {:try_start_20 .. :try_end_3a} :catch_fd

    .line 199
    :try_start_3a
    sget-object v0, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

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

    move-result v0

    if-eqz v0, :cond_5c

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

    new-instance v5, Ljava/lang/StringBuilder;

    const-string v6, "Looking for undoable block with hash: "

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

    sget-object v6, Lorg/bitcoinj/core/Utils;->HEX:Lcom/google/common/io/BaseEncoding;

    invoke-virtual {v6, v3}, Lcom/google/common/io/BaseEncoding;->encode([B)Ljava/lang/String;

    move-result-object v6

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

    move-result-object v5

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

    move-result-object v5

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

    .line 202
    :cond_5c
    iget-object v0, p0, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->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-string v5, "select 1 from undoableblocks where hash = ?"

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

    move-result-object v0

    .line 203
    const/4 v5, 0x1

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

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

    move-result-object v5

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

    move-result v5

    if-eqz v5, :cond_128

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

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

    .line 214
    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/PostgresFullPrunedBlockStore;->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 215
    const/4 v4, 0x3

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

    .line 217
    sget-object v4, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

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

    move-result v4

    if-eqz v4, :cond_b1

    .line 218
    sget-object v4, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    new-instance v5, Ljava/lang/StringBuilder;

    const-string v6, "Updating undoable block with hash: "

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

    sget-object v6, Lorg/bitcoinj/core/Utils;->HEX:Lcom/google/common/io/BaseEncoding;

    invoke-virtual {v6, v3}, Lcom/google/common/io/BaseEncoding;->encode([B)Ljava/lang/String;

    move-result-object v3

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

    move-result-object v3

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

    move-result-object v3

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

    .line 220
    :cond_b1
    if-nez v2, :cond_10b

    .line 221
    const/4 v2, 0x1

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

    .line 222
    const/4 v1, 0x2

    const/4 v2, -0x2

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

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

    .line 228
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V
    :try_end_c2
    .catch Ljava/sql/SQLException; {:try_start_3a .. :try_end_c2} :catch_115

    .line 260
    :cond_c2
    :goto_c2
    return-void

    .line 183
    :cond_c3
    :try_start_c3
    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 184
    and-int/lit16 v2, v0, 0xff

    invoke-virtual {v5, v2}, Ljava/io/ByteArrayOutputStream;->write(I)V

    .line 185
    shr-int/lit8 v2, v0, 0x8

    and-int/lit16 v2, v2, 0xff

    invoke-virtual {v5, v2}, Ljava/io/ByteArrayOutputStream;->write(I)V

    .line 186
    shr-int/lit8 v2, v0, 0x10

    and-int/lit16 v2, v2, 0xff

    invoke-virtual {v5, v2}, Ljava/io/ByteArrayOutputStream;->write(I)V

    .line 187
    shr-int/lit8 v0, v0, 0x18

    and-int/lit16 v0, v0, 0xff

    invoke-virtual {v5, v0}, Ljava/io/ByteArrayOutputStream;->write(I)V

    .line 188
    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_ed
    invoke-interface {v2}, Ljava/util/Iterator;->hasNext()Z

    move-result v0

    if-eqz v0, :cond_104

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

    move-result-object v0

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

    .line 189
    invoke-virtual {v0, v5}, Lorg/bitcoinj/core/Transaction;->bitcoinSerialize(Ljava/io/OutputStream;)V
    :try_end_fc
    .catch Ljava/io/IOException; {:try_start_c3 .. :try_end_fc} :catch_fd

    goto :goto_ed

    .line 193
    :catch_fd
    move-exception v0

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

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

    throw v1

    .line 190
    :cond_104
    :try_start_104
    invoke-virtual {v5}, Ljava/io/ByteArrayOutputStream;->toByteArray()[B
    :try_end_107
    .catch Ljava/io/IOException; {:try_start_104 .. :try_end_107} :catch_fd

    move-result-object v0

    move-object v2, v0

    goto/16 :goto_37

    .line 224
    :cond_10b
    const/4 v1, 0x1

    const/4 v3, -0x2

    :try_start_10d
    invoke-interface {v0, v1, v3}, Ljava/sql/PreparedStatement;->setNull(II)V

    .line 225
    const/4 v1, 0x2

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V
    :try_end_114
    .catch Ljava/sql/SQLException; {:try_start_10d .. :try_end_114} :catch_115

    goto :goto_bc

    .line 255
    :catch_115
    move-exception v0

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

    move-result-object v1

    const-string v2, "23505"

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

    move-result v1

    if-nez v1, :cond_c2

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

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

    throw v1

    .line 233
    :cond_128
    :try_start_128
    iget-object v0, p0, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->conn:Ljava/lang/ThreadLocal;

    .line 234
    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/PostgresFullPrunedBlockStore;->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 235
    const/4 v5, 0x1

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

    .line 236
    const/4 v5, 0x2

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

    .line 238
    sget-object v5, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

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

    move-result v5

    if-eqz v5, :cond_16c

    .line 239
    sget-object v5, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->log:Lorg/slf4j/Logger;

    new-instance v6, Ljava/lang/StringBuilder;

    const-string v7, "Inserting undoable block with hash: "

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

    sget-object v7, Lorg/bitcoinj/core/Utils;->HEX:Lcom/google/common/io/BaseEncoding;

    invoke-virtual {v7, v3}, Lcom/google/common/io/BaseEncoding;->encode([B)Ljava/lang/String;

    move-result-object v3

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

    move-result-object v3

    const-string v6, " at height "

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

    move-result-object v3

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

    move-result-object v3

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

    move-result-object v3

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

    .line 241
    :cond_16c
    if-nez v2, :cond_18a

    .line 242
    const/4 v2, 0x3

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

    .line 243
    const/4 v1, 0x4

    const/4 v2, -0x2

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

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

    .line 249
    invoke-interface {v0}, Ljava/sql/PreparedStatement;->close()V
    :try_end_17d
    .catch Ljava/sql/SQLException; {:try_start_128 .. :try_end_17d} :catch_115

    .line 251
    const/4 v0, 0x1

    :try_start_17e
    invoke-virtual {p0, p1, v0}, Lorg/bitcoinj/store/PostgresFullPrunedBlockStore;->putUpdateStoredBlock(Lorg/bitcoinj/core/StoredBlock;Z)V
    :try_end_181
    .catch Ljava/sql/SQLException; {:try_start_17e .. :try_end_181} :catch_183

    goto/16 :goto_c2

    .line 252
    :catch_183
    move-exception v0

    .line 253
    :try_start_184
    new-instance v1, Lorg/bitcoinj/store/BlockStoreException;

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

    throw v1

    .line 245
    :cond_18a
    const/4 v1, 0x3

    const/4 v3, -0x2

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

    .line 246
    const/4 v1, 0x4

    invoke-interface {v0, v1, v2}, Ljava/sql/PreparedStatement;->setBytes(I[B)V
    :try_end_193
    .catch Ljava/sql/SQLException; {:try_start_184 .. :try_end_193} :catch_115

    goto :goto_177
.end method