ZcashLightClientKit/Sources/ZcashLightClientKit/DAO/NotesDao.swift

145 lines
4.0 KiB
Swift

//
// NotesDao.swift
// ZcashLightClientKit
//
// Created by Francisco Gindre on 11/18/19.
//
import Foundation
import SQLite
struct ReceivedNote: ReceivedNoteEntity, Codable {
enum CodingKeys: String, CodingKey {
case id = "id_note"
case diversifier
case rcm
case nf
case isChange = "is_change"
case transactionId = "id_tx"
case outputIndex = "output_index"
case account
case value
case memo
case spent
}
var id: Int
var diversifier: Data
var rcm: Data
var nf: Data
var isChange: Bool
var transactionId: Int
var outputIndex: Int
var account: Int
var value: Int
var memo: Data?
var spent: Int?
}
class ReceivedNotesSQLDAO: ReceivedNoteRepository {
let table = Table("received_notes")
var dbProvider: ConnectionProvider
init(dbProvider: ConnectionProvider) {
self.dbProvider = dbProvider
}
func count() throws -> Int {
try dbProvider.connection().scalar(table.count)
}
func receivedNote(byRawTransactionId: Data) throws -> ReceivedNoteEntity? {
let transactions = Table("transactions")
let idTx = Expression<Int>("id_tx")
let transaction = Expression<Int>("tx")
let txid = Expression<Blob>("txid")
let joinStatement = table
.join(
.inner,
transactions,
on: transactions[idTx] == table[transaction]
)
.where(transactions[txid] == Blob(bytes: byRawTransactionId.bytes))
.limit(1)
return try dbProvider.connection()
.prepare(joinStatement)
.map { row -> ReceivedNote in
try row.decode()
}
.first
}
}
struct SentNote: SentNoteEntity, Codable {
enum CodingKeys: String, CodingKey {
case id = "id_note"
case transactionId = "tx"
case outputPool = "output_pool"
case outputIndex = "output_index"
case account = "from_account"
case address = "to_address"
case value
case memo
}
var id: Int
var transactionId: Int
var outputPool: Int
var outputIndex: Int
var account: Int
var address: String
var value: Int
var memo: Data?
}
class SentNotesSQLDAO: SentNotesRepository {
let table = Table("sent_notes")
var dbProvider: ConnectionProvider
init(dbProvider: ConnectionProvider) {
self.dbProvider = dbProvider
}
func count() throws -> Int {
try dbProvider.connection().scalar(table.count)
}
func sentNote(byRawTransactionId: Data) throws -> SentNoteEntity? {
let transactions = Table("transactions")
let idTx = Expression<Int>("id_tx")
let transaction = Expression<Int>("tx")
let txid = Expression<Blob>("txid")
let joinStatement = table
.join(
.inner,
transactions,
on: transactions[idTx] == table[transaction]
)
.where(transactions[txid] == Blob(bytes: byRawTransactionId.bytes))
.limit(1)
return try dbProvider.connection()
.prepare(joinStatement)
.map { row -> SentNote in
try row.decode()
}
.first
// try dbProvider.connection().run("""
// SELECT sent_notes.id_note as id,
// sent_notes.tx as transactionId,
// sent_notes.output_index as outputIndex,
// sent_notes.account as account,
// sent_notes.to_address as address,
// sent_notes.value as value,
// sent_notes.memo as memo
// FROM sent_note JOIN transactions
// WHERE sent_note.tx = transactions.id_tx AND
// transactions.txid = \(Blob(bytes: byRawTransactionId.bytes))
// """).map({ row -> SentNoteEntity in
// try row.decode()
// }).first
}
}