forked from openrs2/openrs2
parent
4f16713f01
commit
fff63285fe
@ -1,16 +0,0 @@ |
|||||||
package org.openrs2.archive.container |
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf |
|
||||||
import io.netty.buffer.ByteBufUtil |
|
||||||
import io.netty.buffer.DefaultByteBufHolder |
|
||||||
import org.openrs2.buffer.crc32 |
|
||||||
import org.openrs2.crypto.Whirlpool |
|
||||||
|
|
||||||
public abstract class Container( |
|
||||||
data: ByteBuf |
|
||||||
) : DefaultByteBufHolder(data) { |
|
||||||
public val bytes: ByteArray = ByteBufUtil.getBytes(data, data.readerIndex(), data.readableBytes(), false) |
|
||||||
public val crc32: Int = data.crc32() |
|
||||||
public val whirlpool: ByteArray = Whirlpool.whirlpool(bytes) |
|
||||||
public abstract val encrypted: Boolean |
|
||||||
} |
|
@ -1,94 +0,0 @@ |
|||||||
package org.openrs2.archive.container |
|
||||||
|
|
||||||
import java.sql.Connection |
|
||||||
|
|
||||||
public object ContainerImporter { |
|
||||||
public fun prepare(connection: Connection) { |
|
||||||
connection.prepareStatement( |
|
||||||
""" |
|
||||||
LOCK TABLE containers IN EXCLUSIVE MODE |
|
||||||
""".trimIndent() |
|
||||||
).use { stmt -> |
|
||||||
stmt.execute() |
|
||||||
} |
|
||||||
|
|
||||||
connection.prepareStatement( |
|
||||||
""" |
|
||||||
CREATE TEMPORARY TABLE tmp_containers ( |
|
||||||
index INTEGER NOT NULL, |
|
||||||
crc32 INTEGER NOT NULL, |
|
||||||
whirlpool BYTEA NOT NULL, |
|
||||||
data BYTEA NOT NULL, |
|
||||||
encrypted BOOLEAN NOT NULL |
|
||||||
) ON COMMIT DROP |
|
||||||
""".trimIndent() |
|
||||||
).use { stmt -> |
|
||||||
stmt.execute() |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public fun addContainer(connection: Connection, container: Container): Long { |
|
||||||
return addContainers(connection, listOf(container)).single() |
|
||||||
} |
|
||||||
|
|
||||||
public fun addContainers(connection: Connection, containers: List<Container>): List<Long> { |
|
||||||
connection.prepareStatement( |
|
||||||
""" |
|
||||||
TRUNCATE TABLE tmp_containers |
|
||||||
""".trimIndent() |
|
||||||
).use { stmt -> |
|
||||||
stmt.execute() |
|
||||||
} |
|
||||||
|
|
||||||
connection.prepareStatement( |
|
||||||
""" |
|
||||||
INSERT INTO tmp_containers (index, crc32, whirlpool, data, encrypted) |
|
||||||
VALUES (?, ?, ?, ?, ?) |
|
||||||
""".trimIndent() |
|
||||||
).use { stmt -> |
|
||||||
for ((i, container) in containers.withIndex()) { |
|
||||||
stmt.setInt(1, i) |
|
||||||
stmt.setInt(2, container.crc32) |
|
||||||
stmt.setBytes(3, container.whirlpool) |
|
||||||
stmt.setBytes(4, container.bytes) |
|
||||||
stmt.setBoolean(5, container.encrypted) |
|
||||||
stmt.addBatch() |
|
||||||
} |
|
||||||
|
|
||||||
stmt.executeBatch() |
|
||||||
} |
|
||||||
|
|
||||||
connection.prepareStatement( |
|
||||||
""" |
|
||||||
INSERT INTO containers (crc32, whirlpool, data, encrypted) |
|
||||||
SELECT t.crc32, t.whirlpool, t.data, t.encrypted |
|
||||||
FROM tmp_containers t |
|
||||||
LEFT JOIN containers c ON c.whirlpool = t.whirlpool |
|
||||||
WHERE c.whirlpool IS NULL |
|
||||||
ON CONFLICT DO NOTHING |
|
||||||
""".trimIndent() |
|
||||||
).use { stmt -> |
|
||||||
stmt.execute() |
|
||||||
} |
|
||||||
|
|
||||||
val ids = mutableListOf<Long>() |
|
||||||
|
|
||||||
connection.prepareStatement( |
|
||||||
""" |
|
||||||
SELECT c.id |
|
||||||
FROM tmp_containers t |
|
||||||
JOIN containers c ON c.whirlpool = t.whirlpool |
|
||||||
ORDER BY t.index ASC |
|
||||||
""".trimIndent() |
|
||||||
).use { stmt -> |
|
||||||
stmt.executeQuery().use { rows -> |
|
||||||
while (rows.next()) { |
|
||||||
ids += rows.getLong(1) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
check(ids.size == containers.size) |
|
||||||
return ids |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue