@Override public Object getKeepingByOrigin(HashId origin, int limit) { return protect(() -> { try (ResultSet rs = inPool(db -> db.queryRow( "select keeping_items.packed, keeping_items.hash from keeping_items, ledger where ledger.hash = keeping_items.hash and origin = ? and state = ? order by keeping_items.id desc limit ?", origin.getDigest(), ItemState.APPROVED.ordinal(), limit))) { if (rs == null) return null; byte[] packed = rs.getBytes("packed"); List<byte[]> contractIds = new ArrayList<>(); contractIds.add(rs.getBytes("hash")); while (rs.next()) contractIds.add(rs.getBytes("hash")); if (contractIds.size() > 1) return contractIds; else return packed; } catch (Exception e) { e.printStackTrace(); throw e; } }); }
" hash " + "FROM ledger " + "WHERE hash IN ("+queryPart+") AND state = " + ItemState.APPROVED.ordinal()
@Override protected void writeTo(Boss.Writer bw) throws IOException { super.writeTo(bw); if (!answerIsRequested()) { bw.write(itemState.ordinal()); bw.write(hasEnvironment); } }
) { statement.setBytes(1, stateRecord.getId().getDigest()); statement.setInt(2, stateRecord.getState().ordinal()); statement.setLong(3, StateRecord.unixTime(stateRecord.getCreatedAt())); statement.setLong(4, StateRecord.unixTime(stateRecord.getExpiresAt())); } else { db.update("update ledger set state=?, expires_at=?, locked_by_id=? where id=?", stateRecord.getState().ordinal(), StateRecord.unixTime(stateRecord.getExpiresAt()), stateRecord.getLockedByRecordId(),
statement.setInt(2, stateRecord.getState().ordinal()); statement.setLong(3, StateRecord.unixTime(stateRecord.getCreatedAt())); statement.setLong(4, StateRecord.unixTime(stateRecord.getExpiresAt())); } else { db.update("update ledger set state=?, expires_at=?, locked_by_id=? where id=?", stateRecord.getState().ordinal(), StateRecord.unixTime(stateRecord.getExpiresAt()), stateRecord.getLockedByRecordId(),
byte[] URL = callbackURL.getBytes(StandardCharsets.UTF_8); byte[] concat = new byte[digest.length + URL.length + 1]; concat[0] = (byte) state.ordinal(); System.arraycopy(digest, 0, concat, 1, digest.length); System.arraycopy(URL, 0, concat, digest.length + 1, URL.length);
public void writeTo(Boss.Writer bw) throws IOException { bw.writeObject(state.ordinal()); if(createdAt != null) bw.writeObject(createdAt.toEpochSecond()); else bw.writeObject(0); if(expiresAt != null) bw.writeObject(expiresAt.toEpochSecond()); else bw.writeObject(0); bw.writeObject(haveCopy); } }
@Test public void checkPaymentContract() throws Exception { // to register manually, execute from deploy project: // bin/sql_all pro "insert into ledger(hash,state,created_at, expires_at, locked_by_id) values(decode('9186C0A9E9471E4559E74B5DAC3DBBB8445807DF80CAE4CE06FDB6588FAEBA1CE004AD378BEF3C445DECF3375E3CA5FD16227DBE5831A21207BB1BD21C85F30D0CED014E152F77E62082E0442FBD9FD2458C20778F7501B5D425AF9984062E54','hex'),'4','1520977039','1552513039','0');" // to erase all ledgers, execute: // bin/sql_all pro "truncate table ledger" // (after erasing ledgers, items still stay in cache -> need to restart (or redeploy) nodes) Contract contract = paymentContract; contract.check(); System.out.println("uno bin: " + Base64.encodeString(contract.getPackedTransaction())); System.out.println("uno hashId: " + Bytes.toHex(contract.getId().getDigest()).replace(" ", "")); System.out.println("approved ord: " + ItemState.APPROVED.ordinal()); System.out.println("getCreatedAt: " + StateRecord.unixTime(contract.getCreatedAt())); System.out.println("getExpiresAt: " + StateRecord.unixTime(contract.getExpiresAt())); ItemResult itemResult = normalClient.getState(contract.getId()); System.out.println("getState... done! itemResult: " + itemResult.state); }