📄 storeimpl.java
字号:
case SQLTokenizer.REAL:
return (long)(readFloat() * 10000L);
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
return (long)(readDouble() * 10000L);
case SQLTokenizer.MONEY:
return readLong();
case SQLTokenizer.SMALLMONEY:
return readInt();
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
return (long)(readNumeric().doubleValue() * 10000L);
case SQLTokenizer.CHAR:
case SQLTokenizer.NCHAR:
case SQLTokenizer.VARCHAR:
case SQLTokenizer.NVARCHAR:
return Money.parseMoney( readString() );
case SQLTokenizer.CLOB:
case SQLTokenizer.NCLOB:
case SQLTokenizer.LONGNVARCHAR:
case SQLTokenizer.LONGVARCHAR:
return Money.parseMoney( readLongString() );
case SQLTokenizer.JAVA_OBJECT:
ByteArrayInputStream bais = new ByteArrayInputStream(readLongBinary());
ObjectInputStream ois = new ObjectInputStream(bais);
return Money.parseMoney( ois.readObject().toString() );
case SQLTokenizer.LONGVARBINARY:
case SQLTokenizer.BLOB:
return (long)(Utils.bytes2double( readLongBinary() ) * 10000L);
case SQLTokenizer.TIMESTAMP:
case SQLTokenizer.TIME:
case SQLTokenizer.DATE:
case SQLTokenizer.SMALLDATETIME:
throw SmallSQLException.create(Language.VALUE_CANT_CONVERT, new Object[] { SQLTokenizer.getKeyWord(dataType), "MONEY" });
default: throw new Error();
}
}
/**
* It used for ResultSet.getBigDecimal()
*/
MutableNumeric getNumeric(int offset, int dataType) throws Exception{
this.offset = offset;
if(readBoolean()) return null;
switch(dataType){
case SQLTokenizer.BIT:
case SQLTokenizer.BOOLEAN:
return readBoolean() ? new MutableNumeric(1) : new MutableNumeric(0);
case SQLTokenizer.BINARY:
case SQLTokenizer.VARBINARY:
return new MutableNumeric(Utils.bytes2double( readBinary() ));
case SQLTokenizer.TINYINT:
return new MutableNumeric(readUnsignedByte());
case SQLTokenizer.SMALLINT:
return new MutableNumeric(readShort());
case SQLTokenizer.INT:
return new MutableNumeric(readInt());
case SQLTokenizer.BIGINT:
return new MutableNumeric(readLong());
case SQLTokenizer.REAL:
return new MutableNumeric(readFloat());
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
return new MutableNumeric(readDouble());
case SQLTokenizer.MONEY:
return new MutableNumeric( readLong(), 4);
case SQLTokenizer.SMALLMONEY:
return new MutableNumeric( readInt(), 4);
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
return readNumeric();
case SQLTokenizer.CHAR:
case SQLTokenizer.NCHAR:
case SQLTokenizer.VARCHAR:
case SQLTokenizer.NVARCHAR:
return new MutableNumeric( readString() );
case SQLTokenizer.CLOB:
case SQLTokenizer.NCLOB:
case SQLTokenizer.LONGNVARCHAR:
case SQLTokenizer.LONGVARCHAR:
return new MutableNumeric( readLongString() );
case SQLTokenizer.JAVA_OBJECT:
ByteArrayInputStream bais = new ByteArrayInputStream(readLongBinary());
ObjectInputStream ois = new ObjectInputStream(bais);
return new MutableNumeric( ois.readObject().toString() );
case SQLTokenizer.LONGVARBINARY:
case SQLTokenizer.BLOB:
return new MutableNumeric( Utils.bytes2double( readLongBinary() ) );
case SQLTokenizer.TIMESTAMP:
case SQLTokenizer.TIME:
case SQLTokenizer.DATE:
case SQLTokenizer.SMALLDATETIME:
throw SmallSQLException.create(Language.VALUE_CANT_CONVERT, new Object[] { SQLTokenizer.getKeyWord(dataType), "NUMERIC" });
// SAVER: check if this should be a kind of "type not recognized" exception.
default: throw new Error();
}
}
/**
* It used for ResultSet.getObject()
*/
Object getObject(int offset, int dataType) throws Exception{
this.offset = offset;
if(readBoolean()) return null;
switch(dataType){
case SQLTokenizer.BIT:
case SQLTokenizer.BOOLEAN:
return readBoolean() ? Boolean.TRUE : Boolean.FALSE;
case SQLTokenizer.BINARY:
case SQLTokenizer.VARBINARY:
return readBinary();
case SQLTokenizer.TINYINT:
return Utils.getInteger( readUnsignedByte() );
case SQLTokenizer.SMALLINT:
return Utils.getInteger( readShort() );
case SQLTokenizer.INT:
return Utils.getInteger(readInt());
case SQLTokenizer.BIGINT:
return new Long(readLong());
case SQLTokenizer.REAL:
return new Float( readFloat() );
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
return new Double( readDouble() );
case SQLTokenizer.MONEY:
return Money.createFromUnscaledValue(readLong());
case SQLTokenizer.SMALLMONEY:
return Money.createFromUnscaledValue(readInt());
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
return readNumeric();
case SQLTokenizer.CHAR:
case SQLTokenizer.NCHAR:
case SQLTokenizer.VARCHAR:
case SQLTokenizer.NVARCHAR:
return readString();
case SQLTokenizer.CLOB:
case SQLTokenizer.NCLOB:
case SQLTokenizer.LONGNVARCHAR:
case SQLTokenizer.LONGVARCHAR:
return readLongString();
case SQLTokenizer.JAVA_OBJECT:
ByteArrayInputStream bais = new ByteArrayInputStream(readLongBinary());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
case SQLTokenizer.LONGVARBINARY:
case SQLTokenizer.BLOB:
return readLongBinary();
case SQLTokenizer.TIMESTAMP:
return new DateTime( readTimestamp(), SQLTokenizer.TIMESTAMP );
case SQLTokenizer.TIME:
return new DateTime( readTime(), SQLTokenizer.TIME );
case SQLTokenizer.DATE:
return new DateTime( readDate(), SQLTokenizer.DATE );
case SQLTokenizer.SMALLDATETIME:
return new DateTime( readSmallDateTime(), SQLTokenizer.TIMESTAMP );
case SQLTokenizer.UNIQUEIDENTIFIER:
return Utils.bytes2unique( page, this.offset);
default: throw new Error();
}
}
/**
* It used for ResultSet.getString()
*/
String getString( int offset, int dataType) throws Exception{
this.offset = offset;
if(readBoolean()) return null;
switch(dataType){
case SQLTokenizer.BIT:
return readBoolean() ? "1" : "0";
case SQLTokenizer.BOOLEAN:
return String.valueOf( readBoolean() );
case SQLTokenizer.BINARY:
case SQLTokenizer.VARBINARY:
return Utils.bytes2hex( readBinary() );
case SQLTokenizer.TINYINT:
return String.valueOf( readUnsignedByte() );
case SQLTokenizer.SMALLINT:
return String.valueOf( readShort() );
case SQLTokenizer.INT:
return String.valueOf( readInt() );
case SQLTokenizer.BIGINT:
return String.valueOf( readLong() );
case SQLTokenizer.REAL:
return String.valueOf( readFloat() );
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
return String.valueOf( readDouble() );
case SQLTokenizer.MONEY:
return Money.createFromUnscaledValue( readLong() ).toString();
case SQLTokenizer.SMALLMONEY:
return Money.createFromUnscaledValue( readInt() ).toString();
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
return readNumeric().toString();
case SQLTokenizer.CHAR:
case SQLTokenizer.NCHAR:
case SQLTokenizer.VARCHAR:
case SQLTokenizer.NVARCHAR:
return readString();
case SQLTokenizer.CLOB:
case SQLTokenizer.NCLOB:
case SQLTokenizer.LONGNVARCHAR:
case SQLTokenizer.LONGVARCHAR:
return readLongString();
case SQLTokenizer.JAVA_OBJECT:
ByteArrayInputStream bais = new ByteArrayInputStream(readLongBinary());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject().toString();
case SQLTokenizer.LONGVARBINARY:
case SQLTokenizer.BLOB:
return Utils.bytes2hex( readLongBinary() );
case SQLTokenizer.TIMESTAMP:
return new DateTime( readTimestamp(), SQLTokenizer.TIMESTAMP ).toString();
case SQLTokenizer.TIME:
return new DateTime( readTime(), SQLTokenizer.TIME ).toString();
case SQLTokenizer.DATE:
return new DateTime( readDate(), SQLTokenizer.DATE ).toString();
case SQLTokenizer.SMALLDATETIME:
return new DateTime( readSmallDateTime(), SQLTokenizer.TIMESTAMP ).toString();
case SQLTokenizer.UNIQUEIDENTIFIER:
return Utils.bytes2unique( page, this.offset);
default: throw new Error();
}
}
/**
* It used for ResultSet.getBytes()
*/
byte[] getBytes(int offset, int dataType) throws Exception{
this.offset = offset;
if(readBoolean()) return null;
switch(dataType){
case SQLTokenizer.BINARY:
case SQLTokenizer.VARBINARY:
return readBinary();
case SQLTokenizer.TINYINT:
case SQLTokenizer.BIT:
case SQLTokenizer.BOOLEAN:
byte[] bytes = new byte[1];
System.arraycopy( page, offset, bytes, 0, bytes.length);
return bytes;
case SQLTokenizer.SMALLINT:
bytes = new byte[2];
System.arraycopy( page, offset, bytes, 0, bytes.length);
return bytes;
case SQLTokenizer.INT:
case SQLTokenizer.REAL:
case SQLTokenizer.SMALLMONEY:
case SQLTokenizer.TIME:
case SQLTokenizer.DATE:
case SQLTokenizer.SMALLDATETIME:
bytes = new byte[4];
System.arraycopy( page, offset, bytes, 0, bytes.length);
return bytes;
case SQLTokenizer.BIGINT:
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
case SQLTokenizer.MONEY:
case SQLTokenizer.TIMESTAMP:
bytes = new byte[8];
System.arraycopy( page, offset, bytes, 0, bytes.length);
return bytes;
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
return readNumeric().toByteArray();
case SQLTokenizer.CHAR:
case SQLTokenizer.NCHAR:
case SQLTokenizer.VARCHAR:
case SQLTokenizer.NVARCHAR:
return readString().getBytes();
case SQLTokenizer.CLOB:
case SQLTokenizer.NCLOB:
case SQLTokenizer.LONGNVARCHAR:
case SQLTokenizer.LONGVARCHAR:
return readLongString().getBytes();
case SQLTokenizer.JAVA_OBJECT:
case SQLTokenizer.LONGVARBINARY:
case SQLTokenizer.BLOB:
return readLongBinary();
case SQLTokenizer.UNIQUEIDENTIFIER:
bytes = new byte[16];
System.arraycopy( page, offset, bytes, 0, bytes.length);
return bytes;
default: throw new Error();
}
}
void scanObjectOffsets( int[] offsets, int dataTypes[] ){
offset = PAGE_CONTROL_SIZE;
for(int i=0; i<offsets.length; i++){
offsets[i] = offset;
boolean isNull = readBoolean(); // for isNull
switch(dataTypes[i]){
case SQLTokenizer.BIT:
case SQLTokenizer.BOOLEAN:
case SQLTokenizer.TINYINT:
offset++;
break;
case SQLTokenizer.SMALLINT:
offset += 2;
break;
case SQLTokenizer.INT:
case SQLTokenizer.REAL:
case SQLTokenizer.SMALLMONEY:
case SQLTokenizer.TIME:
case SQLTokenizer.DATE:
case SQLTokenizer.SMALLDATETIME:
offset += 4;
break;
case SQLTokenizer.BIGINT:
case SQLTokenizer.FLOAT:
case SQLTokenizer.DOUBLE:
case SQLTokenizer.MONEY:
case SQLTokenizer.JAVA_OBJECT:
case SQLTokenizer.LONGVARBINARY:
case SQLTokenizer.BLOB:
case SQLTokenizer.CLOB:
case SQLTokenizer.NCLOB:
case SQLTokenizer.LONGNVARCHAR:
case SQLTokenizer.LONGVARCHAR:
case SQLTokenizer.TIMESTAMP:
offset += 8;
break;
case SQLTokenizer.BINARY:
case SQLTokenizer.VARBINARY:
int count = readShort();
if(!isNull) offset += count; // not use += directly because readShort change the offset
break;
case SQLTokenizer.NUMERIC:
case SQLTokenizer.DECIMAL:
count = readByte();
offset += 2;
if(!isNull) offset += count*4;
break;
case SQLTokenizer.CHAR:
case SQLTokenizer.NCHAR:
case SQLTokenizer.VARCHAR:
case SQLTokenizer.NVARCHAR:
count = readShort();
if(!isNull) offset += count << 1; // not use += directly because readShort change the offset
break;
case SQLTokenizer.UNIQUEIDENTIFIER:
offset += 16;
break;
default: throw new Error(String.valueOf( dataTypes[i] ) );
}
}
}
void deleteRow(SSConnection con) throws SQLException{
status = DELETED;
type = SQLTokenizer.DELETE;
createWriteLock();
writeFinsh(con);
}
StorePageLink getLink(){
return ((TableStorePageInsert)storePage).getLink();
}
/**
* If this store is a ghost because it was rollback.
*/
boolean isRollback(){
return storePage.raFile == null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -