diff --git a/src/org/redkale/source/DataJdbcSource.java b/src/org/redkale/source/DataJdbcSource.java index d458ebbf6..68fc4dab8 100644 --- a/src/org/redkale/source/DataJdbcSource.java +++ b/src/org/redkale/source/DataJdbcSource.java @@ -318,7 +318,7 @@ public class DataJdbcSource extends DataSqlSource { for (FilterFuncColumn ffc : columns) { for (String col : ffc.cols()) { Object o = set.getObject(++index); - Number rs = ffc.defvalue; + Number rs = ffc.getDefvalue(); if (o != null) rs = (Number) o; map.put(ffc.col(col), rs); } @@ -371,7 +371,7 @@ public class DataJdbcSource extends DataSqlSource { Map rs = new LinkedHashMap<>(); ResultSet set = stmt.executeQuery(sql); ResultSetMetaData rsd = set.getMetaData(); - boolean smallint = rsd.getColumnType(1) == Types.SMALLINT; + boolean smallint = rsd == null ? false : rsd.getColumnType(1) == Types.SMALLINT; while (set.next()) { rs.put((K) (smallint ? set.getShort(1) : set.getObject(1)), (N) set.getObject(2)); } diff --git a/src/org/redkale/source/DataSqlSource.java b/src/org/redkale/source/DataSqlSource.java index 9ca44ccb1..629907794 100644 --- a/src/org/redkale/source/DataSqlSource.java +++ b/src/org/redkale/source/DataSqlSource.java @@ -8,7 +8,7 @@ package org.redkale.source; import java.io.Serializable; import java.net.URL; import java.nio.ByteBuffer; -import java.sql.SQLException; +import java.sql.*; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; @@ -145,6 +145,26 @@ public abstract class DataSqlSource extends AbstractService implement //查询一页数据 protected abstract CompletableFuture> querySheetDB(final EntityInfo info, final boolean needtotal, final SelectColumn selects, final Flipper flipper, final FilterNode node); + protected T infoGetValue(EntityInfo info, final SelectColumn sels, final ResultSet set) throws SQLException { + return info.getValue(sels, set); + } + + protected String createSQLOrderby(EntityInfo info, Flipper flipper) { + return info.createSQLOrderby(flipper); + } + + protected Map getJoinTabalis(FilterNode node) { + return node == null ? null : node.getJoinTabalis(); + } + + protected CharSequence createSQLJoin(FilterNode node, final Function func, final boolean update, final Map joinTabalis, final Set haset, final EntityInfo info) { + return node == null ? null : node.createSQLJoin(func, update, joinTabalis, haset, info); + } + + protected CharSequence createSQLExpress(FilterNode node, final EntityInfo info, final Map joinTabalis) { + return node == null ? null : node.createSQLExpress(info, joinTabalis); + } + @Override protected ExecutorService getExecutor() { return executor; diff --git a/src/org/redkale/source/FilterFuncColumn.java b/src/org/redkale/source/FilterFuncColumn.java index 1df589151..d12032dd0 100644 --- a/src/org/redkale/source/FilterFuncColumn.java +++ b/src/org/redkale/source/FilterFuncColumn.java @@ -40,11 +40,11 @@ public class FilterFuncColumn implements java.io.Serializable { return new FilterFuncColumn(func, defvalue, columns); } - String[] cols() { + public String[] cols() { return columns == null || columns.length == 0 ? new String[]{COLUMN_NULL} : columns; } - String col(String column) { + public String col(String column) { return column == null || column.isEmpty() ? COLUMN_NULL : column; } diff --git a/src/org/redkale/util/ByteBufferReader.java b/src/org/redkale/util/ByteBufferReader.java new file mode 100644 index 000000000..cd0e3d7d9 --- /dev/null +++ b/src/org/redkale/util/ByteBufferReader.java @@ -0,0 +1,229 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.util; + +import java.nio.ByteBuffer; +import java.util.*; + +/** + * 以ByteBuffer为数据载体的Reader
+ * 注意:ByteBuffer必须是BIG_ENDIAN,且最小可读空间至少是8 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + */ +public class ByteBufferReader { + + private ByteBuffer[] buffers; + + private int currIndex; + + private ByteBuffer currBuffer; + + public ByteBufferReader(Collection buffers) { + Objects.requireNonNull(buffers); + this.buffers = buffers.toArray(new ByteBuffer[buffers.size()]); + this.currBuffer = this.buffers[0]; + this.currIndex = 0; + } + + public ByteBufferReader(ByteBuffer[] buffers) { + Objects.requireNonNull(buffers); + this.buffers = buffers; + this.currBuffer = this.buffers[0]; + this.currIndex = 0; + } + + public ByteBufferReader(ByteBuffer buffer) { + Objects.requireNonNull(buffer); + this.buffers = new ByteBuffer[]{buffer}; + this.currBuffer = this.buffers[0]; + this.currIndex = 0; + } + + public static ByteBufferReader create(ByteBuffer buffer) { + return new ByteBufferReader(buffer); + } + + public static ByteBufferReader create(Collection buffers) { + return new ByteBufferReader(buffers); + } + + public static ByteBufferReader create(ByteBuffer[] buffers) { + return new ByteBufferReader(buffers); + } + + public boolean hasRemaining(){ + return this.currBuffer.hasRemaining(); + } + + public byte get() { + ByteBuffer buf = this.currBuffer; + if (!buf.hasRemaining()) { + buf = this.buffers[++this.currIndex]; + this.currBuffer = buf; + } + return this.currBuffer.get(); + } + + public short getShort() { + ByteBuffer buf = this.currBuffer; + int remain = buf.remaining(); + if (remain >= 2) return buf.getShort(); + if (remain == 0) { + buf = this.buffers[++this.currIndex]; + this.currBuffer = buf; + return buf.getShort(); + } + return (short) ((buf.get() << 8) | (get() & 0xff)); + } + + public int getInt() { + ByteBuffer buf = this.currBuffer; + int remain = buf.remaining(); + if (remain >= 4) return buf.getInt(); + if (remain == 0) { + buf = this.buffers[++this.currIndex]; + this.currBuffer = buf; + return buf.getInt(); + } + if (remain == 1) { + return ((buf.get() << 24) + | ((get() & 0xff) << 16) + | ((get() & 0xff) << 8) + | ((get() & 0xff))); + } + if (remain == 2) { + return ((buf.get() << 24) + | ((buf.get() & 0xff) << 16) + | ((get() & 0xff) << 8) + | ((get() & 0xff))); + } + //remain == 3 + return ((buf.get() << 24) + | ((buf.get() & 0xff) << 16) + | ((buf.get() & 0xff) << 8) + | ((get() & 0xff))); + } + + public float getFloat() { + return Float.intBitsToFloat(getInt()); + } + + public long getLong() { + ByteBuffer buf = this.currBuffer; + int remain = buf.remaining(); + if (remain >= 8) return buf.getLong(); + if (remain == 0) { + buf = this.buffers[++this.currIndex]; + this.currBuffer = buf; + return buf.getLong(); + } + if (remain == 1) { + return ((((long) buf.get()) << 56) + | (((long) get() & 0xff) << 48) + | (((long) get() & 0xff) << 40) + | (((long) get() & 0xff) << 32) + | (((long) get() & 0xff) << 24) + | (((long) get() & 0xff) << 16) + | (((long) get() & 0xff) << 8) + | (((long) get() & 0xff))); + } + if (remain == 2) { + return ((((long) buf.get()) << 56) + | (((long) buf.get() & 0xff) << 48) + | (((long) get() & 0xff) << 40) + | (((long) get() & 0xff) << 32) + | (((long) get() & 0xff) << 24) + | (((long) get() & 0xff) << 16) + | (((long) get() & 0xff) << 8) + | (((long) get() & 0xff))); + } + if (remain == 3) { + return ((((long) buf.get()) << 56) + | (((long) buf.get() & 0xff) << 48) + | (((long) buf.get() & 0xff) << 40) + | (((long) get() & 0xff) << 32) + | (((long) get() & 0xff) << 24) + | (((long) get() & 0xff) << 16) + | (((long) get() & 0xff) << 8) + | (((long) get() & 0xff))); + } + if (remain == 4) { + return ((((long) buf.get()) << 56) + | (((long) buf.get() & 0xff) << 48) + | (((long) buf.get() & 0xff) << 40) + | (((long) buf.get() & 0xff) << 32) + | (((long) get() & 0xff) << 24) + | (((long) get() & 0xff) << 16) + | (((long) get() & 0xff) << 8) + | (((long) get() & 0xff))); + } + if (remain == 5) { + return ((((long) buf.get()) << 56) + | (((long) buf.get() & 0xff) << 48) + | (((long) buf.get() & 0xff) << 40) + | (((long) buf.get() & 0xff) << 32) + | (((long) buf.get() & 0xff) << 24) + | (((long) get() & 0xff) << 16) + | (((long) get() & 0xff) << 8) + | (((long) get() & 0xff))); + } + if (remain == 6) { + return ((((long) buf.get()) << 56) + | (((long) buf.get() & 0xff) << 48) + | (((long) buf.get() & 0xff) << 40) + | (((long) buf.get() & 0xff) << 32) + | (((long) buf.get() & 0xff) << 24) + | (((long) buf.get() & 0xff) << 16) + | (((long) get() & 0xff) << 8) + | (((long) get() & 0xff))); + } + //remain == 7 + return ((((long) buf.get()) << 56) + | (((long) buf.get() & 0xff) << 48) + | (((long) buf.get() & 0xff) << 40) + | (((long) buf.get() & 0xff) << 32) + | (((long) buf.get() & 0xff) << 24) + | (((long) buf.get() & 0xff) << 16) + | (((long) buf.get() & 0xff) << 8) + | (((long) get() & 0xff))); + } + + public double getDouble() { + return Double.longBitsToDouble(getLong()); + } + + public ByteBufferReader get(byte[] dst) { + return get(dst, 0, dst.length); + } + + public ByteBufferReader get(byte[] dst, int offset, int length) { + ByteBuffer buf = this.currBuffer; + int remain = buf.remaining(); + if (remain >= length) { + buf.get(dst, offset, length); + return this; + } + buf.get(dst, offset, remain); + this.currBuffer = this.buffers[++this.currIndex]; + return get(dst, offset + remain, length - remain); + } + + public ByteBufferReader skip(int size) { + ByteBuffer buf = this.currBuffer; + int remain = buf.remaining(); + if (remain >= size) { + buf.position(buf.position() + size); + return this; + } + buf.position(buf.position() + remain); + this.currBuffer = this.buffers[++this.currIndex]; + return skip(size - remain); + } +} diff --git a/src/org/redkale/util/ByteBufferWriter.java b/src/org/redkale/util/ByteBufferWriter.java index 694ab6884..2bb60d637 100644 --- a/src/org/redkale/util/ByteBufferWriter.java +++ b/src/org/redkale/util/ByteBufferWriter.java @@ -48,7 +48,7 @@ public class ByteBufferWriter { public ByteBuffer[] toBuffers() { if (buffers == null) return new ByteBuffer[0]; for (ByteBuffer buf : this.buffers) { - if (buf.position() != 0) buf.flip(); + buf.flip(); } return this.buffers; } @@ -130,7 +130,6 @@ public class ByteBufferWriter { // System.out.println(Arrays.toString(b4)); // System.out.println(Arrays.toString(toBytes(writer.toBuffers()))); // } - public ByteBufferWriter putFloat(float value) { getLastBuffer(4).putFloat(value); position += 4;