LevelDBBlockStore.smali
.class public Lorg/bitcoinj/store/LevelDBBlockStore;
.super Ljava/lang/Object;
.source "LevelDBBlockStore.java"
# interfaces
.implements Lorg/bitcoinj/store/BlockStore;
# static fields
.field private static final CHAIN_HEAD_KEY:[B
# instance fields
.field private final buffer:Ljava/nio/ByteBuffer;
.field private final context:Lorg/bitcoinj/core/Context;
.field private db:Lorg/iq80/leveldb/DB;
.field private final path:Ljava/io/File;
# direct methods
.method static constructor <clinit>()V
.registers 1
.prologue
.line 32
const-string v0, "chainhead"
invoke-virtual {v0}, Ljava/lang/String;->getBytes()[B
move-result-object v0
sput-object v0, Lorg/bitcoinj/store/LevelDBBlockStore;->CHAIN_HEAD_KEY:[B
return-void
.end method
.method public constructor <init>(Lorg/bitcoinj/core/Context;Ljava/io/File;)V
.registers 4
.prologue
.line 41
sget-object v0, Lorg/fusesource/leveldbjni/JniDBFactory;->factory:Lorg/fusesource/leveldbjni/JniDBFactory;
invoke-direct {p0, p1, p2, v0}, Lorg/bitcoinj/store/LevelDBBlockStore;-><init>(Lorg/bitcoinj/core/Context;Ljava/io/File;Lorg/iq80/leveldb/DBFactory;)V
.line 42
return-void
.end method
.method public constructor <init>(Lorg/bitcoinj/core/Context;Ljava/io/File;Lorg/iq80/leveldb/DBFactory;)V
.registers 6
.prologue
.line 45
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 36
const/16 v0, 0x60
invoke-static {v0}, Ljava/nio/ByteBuffer;->allocate(I)Ljava/nio/ByteBuffer;
move-result-object v0
iput-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->buffer:Ljava/nio/ByteBuffer;
.line 46
iput-object p1, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->context:Lorg/bitcoinj/core/Context;
.line 47
iput-object p2, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->path:Ljava/io/File;
.line 48
new-instance v0, Lorg/iq80/leveldb/Options;
invoke-direct {v0}, Lorg/iq80/leveldb/Options;-><init>()V
.line 49
invoke-virtual {v0}, Lorg/iq80/leveldb/Options;->createIfMissing()Z
.line 52
:try_start_17
invoke-direct {p0, p2, p3, v0}, Lorg/bitcoinj/store/LevelDBBlockStore;->tryOpen(Ljava/io/File;Lorg/iq80/leveldb/DBFactory;Lorg/iq80/leveldb/Options;)V
:try_end_1a
.catch Ljava/io/IOException; {:try_start_17 .. :try_end_1a} :catch_1b
.line 60
:goto_1a
return-void
:catch_1b
move-exception v1
.line 55
:try_start_1c
invoke-interface {p3, p2, v0}, Lorg/iq80/leveldb/DBFactory;->repair(Ljava/io/File;Lorg/iq80/leveldb/Options;)V
.line 56
invoke-direct {p0, p2, p3, v0}, Lorg/bitcoinj/store/LevelDBBlockStore;->tryOpen(Ljava/io/File;Lorg/iq80/leveldb/DBFactory;Lorg/iq80/leveldb/Options;)V
:try_end_22
.catch Ljava/io/IOException; {:try_start_1c .. :try_end_22} :catch_23
goto :goto_1a
.line 57
:catch_23
move-exception v0
.line 58
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 declared-synchronized initStoreIfNeeded()V
.registers 5
.prologue
.line 69
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
sget-object v1, Lorg/bitcoinj/store/LevelDBBlockStore;->CHAIN_HEAD_KEY:[B
invoke-interface {v0, v1}, Lorg/iq80/leveldb/DB;->get([B)[B
:try_end_8
.catchall {:try_start_1 .. :try_end_8} :catchall_2c
move-result-object v0
if-eqz v0, :cond_d
.line 75
:goto_b
monitor-exit p0
return-void
.line 71
:cond_d
:try_start_d
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->context:Lorg/bitcoinj/core/Context;
invoke-virtual {v0}, Lorg/bitcoinj/core/Context;->getParams()Lorg/bitcoinj/core/NetworkParameters;
move-result-object v0
invoke-virtual {v0}, Lorg/bitcoinj/core/NetworkParameters;->getGenesisBlock()Lorg/bitcoinj/core/Block;
move-result-object v0
invoke-virtual {v0}, Lorg/bitcoinj/core/Block;->cloneAsHeader()Lorg/bitcoinj/core/Block;
move-result-object v0
.line 72
new-instance v1, Lorg/bitcoinj/core/StoredBlock;
invoke-virtual {v0}, Lorg/bitcoinj/core/Block;->getWork()Ljava/math/BigInteger;
move-result-object v2
const/4 v3, 0x0
invoke-direct {v1, v0, v2, v3}, Lorg/bitcoinj/core/StoredBlock;-><init>(Lorg/bitcoinj/core/Block;Ljava/math/BigInteger;I)V
.line 73
invoke-virtual {p0, v1}, Lorg/bitcoinj/store/LevelDBBlockStore;->put(Lorg/bitcoinj/core/StoredBlock;)V
.line 74
invoke-virtual {p0, v1}, Lorg/bitcoinj/store/LevelDBBlockStore;->setChainHead(Lorg/bitcoinj/core/StoredBlock;)V
:try_end_2b
.catchall {:try_start_d .. :try_end_2b} :catchall_2c
goto :goto_b
.line 69
:catchall_2c
move-exception v0
monitor-exit p0
throw v0
.end method
.method private declared-synchronized tryOpen(Ljava/io/File;Lorg/iq80/leveldb/DBFactory;Lorg/iq80/leveldb/Options;)V
.registers 5
.prologue
.line 64
monitor-enter p0
:try_start_1
invoke-interface {p2, p1, p3}, Lorg/iq80/leveldb/DBFactory;->open(Ljava/io/File;Lorg/iq80/leveldb/Options;)Lorg/iq80/leveldb/DB;
move-result-object v0
iput-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
.line 65
invoke-direct {p0}, Lorg/bitcoinj/store/LevelDBBlockStore;->initStoreIfNeeded()V
:try_end_a
.catchall {:try_start_1 .. :try_end_a} :catchall_c
.line 66
monitor-exit p0
return-void
.line 64
:catchall_c
move-exception v0
monitor-exit p0
throw v0
.end method
# virtual methods
.method public declared-synchronized close()V
.registers 3
.prologue
.line 105
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
invoke-interface {v0}, Lorg/iq80/leveldb/DB;->close()V
:try_end_6
.catch Ljava/io/IOException; {:try_start_1 .. :try_end_6} :catch_8
.catchall {:try_start_1 .. :try_end_6} :catchall_f
.line 108
monitor-exit p0
return-void
.line 106
:catch_8
move-exception v0
.line 107
:try_start_9
new-instance v1, Lorg/bitcoinj/store/BlockStoreException;
invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V
throw v1
:try_end_f
.catchall {:try_start_9 .. :try_end_f} :catchall_f
.line 105
:catchall_f
move-exception v0
monitor-exit p0
throw v0
.end method
.method public declared-synchronized destroy()V
.registers 4
.prologue
.line 135
monitor-enter p0
:try_start_1
sget-object v0, Lorg/fusesource/leveldbjni/JniDBFactory;->factory:Lorg/fusesource/leveldbjni/JniDBFactory;
iget-object v1, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->path:Ljava/io/File;
new-instance v2, Lorg/iq80/leveldb/Options;
invoke-direct {v2}, Lorg/iq80/leveldb/Options;-><init>()V
invoke-virtual {v0, v1, v2}, Lorg/fusesource/leveldbjni/JniDBFactory;->destroy(Ljava/io/File;Lorg/iq80/leveldb/Options;)V
:try_end_d
.catchall {:try_start_1 .. :try_end_d} :catchall_f
.line 136
monitor-exit p0
return-void
.line 135
:catchall_f
move-exception v0
monitor-exit p0
throw v0
.end method
.method public declared-synchronized get(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/core/StoredBlock;
.registers 4
.prologue
.line 86
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
invoke-virtual {p1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B
move-result-object v1
invoke-interface {v0, v1}, Lorg/iq80/leveldb/DB;->get([B)[B
:try_end_a
.catchall {:try_start_1 .. :try_end_a} :catchall_1f
move-result-object v0
.line 87
if-nez v0, :cond_10
.line 88
const/4 v0, 0x0
.line 89
:goto_e
monitor-exit p0
return-object v0
:cond_10
:try_start_10
iget-object v1, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->context:Lorg/bitcoinj/core/Context;
invoke-virtual {v1}, Lorg/bitcoinj/core/Context;->getParams()Lorg/bitcoinj/core/NetworkParameters;
move-result-object v1
invoke-static {v0}, Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;
move-result-object v0
invoke-static {v1, v0}, Lorg/bitcoinj/core/StoredBlock;->deserializeCompact(Lorg/bitcoinj/core/NetworkParameters;Ljava/nio/ByteBuffer;)Lorg/bitcoinj/core/StoredBlock;
:try_end_1d
.catchall {:try_start_10 .. :try_end_1d} :catchall_1f
move-result-object v0
goto :goto_e
.line 86
:catchall_1f
move-exception v0
monitor-exit p0
throw v0
.end method
.method public declared-synchronized getChainHead()Lorg/bitcoinj/core/StoredBlock;
.registers 3
.prologue
.line 94
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
sget-object v1, Lorg/bitcoinj/store/LevelDBBlockStore;->CHAIN_HEAD_KEY:[B
invoke-interface {v0, v1}, Lorg/iq80/leveldb/DB;->get([B)[B
move-result-object v0
invoke-static {v0}, Lorg/bitcoinj/core/Sha256Hash;->wrap([B)Lorg/bitcoinj/core/Sha256Hash;
move-result-object v0
invoke-virtual {p0, v0}, Lorg/bitcoinj/store/LevelDBBlockStore;->get(Lorg/bitcoinj/core/Sha256Hash;)Lorg/bitcoinj/core/StoredBlock;
:try_end_10
.catchall {:try_start_1 .. :try_end_10} :catchall_13
move-result-object v0
monitor-exit p0
return-object v0
:catchall_13
move-exception v0
monitor-exit p0
throw v0
.end method
.method public getParams()Lorg/bitcoinj/core/NetworkParameters;
.registers 2
.prologue
.line 140
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->context:Lorg/bitcoinj/core/Context;
invoke-virtual {v0}, Lorg/bitcoinj/core/Context;->getParams()Lorg/bitcoinj/core/NetworkParameters;
move-result-object v0
return-object v0
.end method
.method public declared-synchronized put(Lorg/bitcoinj/core/StoredBlock;)V
.registers 5
.prologue
.line 79
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->buffer:Ljava/nio/ByteBuffer;
invoke-virtual {v0}, Ljava/nio/ByteBuffer;->clear()Ljava/nio/Buffer;
.line 80
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->buffer:Ljava/nio/ByteBuffer;
invoke-virtual {p1, v0}, Lorg/bitcoinj/core/StoredBlock;->serializeCompact(Ljava/nio/ByteBuffer;)V
.line 81
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
invoke-virtual {p1}, Lorg/bitcoinj/core/StoredBlock;->getHeader()Lorg/bitcoinj/core/Block;
move-result-object v1
invoke-virtual {v1}, Lorg/bitcoinj/core/Block;->getHash()Lorg/bitcoinj/core/Sha256Hash;
move-result-object v1
invoke-virtual {v1}, Lorg/bitcoinj/core/Sha256Hash;->getBytes()[B
move-result-object v1
iget-object v2, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->buffer:Ljava/nio/ByteBuffer;
invoke-virtual {v2}, Ljava/nio/ByteBuffer;->array()[B
move-result-object v2
invoke-interface {v0, v1, v2}, Lorg/iq80/leveldb/DB;->put([B[B)V
:try_end_22
.catchall {:try_start_1 .. :try_end_22} :catchall_24
.line 82
monitor-exit p0
return-void
.line 79
:catchall_24
move-exception v0
monitor-exit p0
throw v0
.end method
.method public declared-synchronized reset()V
.registers 4
.prologue
.line 114
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
invoke-interface {v0}, Lorg/iq80/leveldb/DB;->createWriteBatch()Lorg/iq80/leveldb/WriteBatch;
:try_end_6
.catch Ljava/io/IOException; {:try_start_1 .. :try_end_6} :catch_30
.catchall {:try_start_1 .. :try_end_6} :catchall_37
move-result-object v1
.line 116
:try_start_7
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
invoke-interface {v0}, Lorg/iq80/leveldb/DB;->iterator()Lorg/iq80/leveldb/DBIterator;
:try_end_c
.catchall {:try_start_7 .. :try_end_c} :catchall_2b
move-result-object v2
.line 118
:try_start_d
invoke-interface {v2}, Lorg/iq80/leveldb/DBIterator;->seekToFirst()V
.line 119
:goto_10
invoke-interface {v2}, Lorg/iq80/leveldb/DBIterator;->hasNext()Z
move-result v0
if-eqz v0, :cond_3a
.line 120
invoke-interface {v2}, Lorg/iq80/leveldb/DBIterator;->next()Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/util/Map$Entry;
invoke-interface {v0}, Ljava/util/Map$Entry;->getKey()Ljava/lang/Object;
move-result-object v0
check-cast v0, [B
invoke-interface {v1, v0}, Lorg/iq80/leveldb/WriteBatch;->delete([B)Lorg/iq80/leveldb/WriteBatch;
:try_end_25
.catchall {:try_start_d .. :try_end_25} :catchall_26
goto :goto_10
.line 123
:catchall_26
move-exception v0
:try_start_27
invoke-interface {v2}, Lorg/iq80/leveldb/DBIterator;->close()V
throw v0
:try_end_2b
.catchall {:try_start_27 .. :try_end_2b} :catchall_2b
.line 126
:catchall_2b
move-exception v0
:try_start_2c
invoke-interface {v1}, Lorg/iq80/leveldb/WriteBatch;->close()V
throw v0
:try_end_30
.catch Ljava/io/IOException; {:try_start_2c .. :try_end_30} :catch_30
.catchall {:try_start_2c .. :try_end_30} :catchall_37
.line 129
:catch_30
move-exception v0
.line 130
:try_start_31
new-instance v1, Lorg/bitcoinj/store/BlockStoreException;
invoke-direct {v1, v0}, Lorg/bitcoinj/store/BlockStoreException;-><init>(Ljava/lang/Throwable;)V
throw v1
:try_end_37
.catchall {:try_start_31 .. :try_end_37} :catchall_37
.line 114
:catchall_37
move-exception v0
monitor-exit p0
throw v0
.line 121
:cond_3a
:try_start_3a
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
invoke-interface {v0, v1}, Lorg/iq80/leveldb/DB;->write(Lorg/iq80/leveldb/WriteBatch;)V
:try_end_3f
.catchall {:try_start_3a .. :try_end_3f} :catchall_26
.line 123
:try_start_3f
invoke-interface {v2}, Lorg/iq80/leveldb/DBIterator;->close()V
:try_end_42
.catchall {:try_start_3f .. :try_end_42} :catchall_2b
.line 126
:try_start_42
invoke-interface {v1}, Lorg/iq80/leveldb/WriteBatch;->close()V
.line 128
invoke-direct {p0}, Lorg/bitcoinj/store/LevelDBBlockStore;->initStoreIfNeeded()V
:try_end_48
.catch Ljava/io/IOException; {:try_start_42 .. :try_end_48} :catch_30
.catchall {:try_start_42 .. :try_end_48} :catchall_37
.line 131
monitor-exit p0
return-void
.end method
.method public declared-synchronized setChainHead(Lorg/bitcoinj/core/StoredBlock;)V
.registers 5
.prologue
.line 99
monitor-enter p0
:try_start_1
iget-object v0, p0, Lorg/bitcoinj/store/LevelDBBlockStore;->db:Lorg/iq80/leveldb/DB;
sget-object v1, Lorg/bitcoinj/store/LevelDBBlockStore;->CHAIN_HEAD_KEY:[B
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-interface {v0, v1, v2}, Lorg/iq80/leveldb/DB;->put([B[B)V
:try_end_14
.catchall {:try_start_1 .. :try_end_14} :catchall_16
.line 100
monitor-exit p0
return-void
.line 99
:catchall_16
move-exception v0
monitor-exit p0
throw v0
.end method