?? myldbtypesroutines.pas
字號:
unit MYLDBTypesRoutines;
{$I MYLDBVer.inc}
interface
uses
{$IFDEF DEBUG_LOG}
MYLDBDebug,
{$ENDIF}
MYLDBTypes,
MYLDBConverts,
MYLDBMemory,
MYLDBExcept,
MYLDBConst;
// Return DataSize
function GetDataSizeInMemory(DataType: TMYLDBBaseFieldType; Length: Integer = 0): Integer; overload;
// Return DataSize
function GetDataSizeInMemory(DataType: TMYLDBBaseFieldType; Data: Pointer): Integer; overload;
// Allocate Memory and Set Data
procedure AllocMemAndSetData(DataType: TMYLDBBaseFieldType; const Value; out Buffer; out BufferSize: Integer);
implementation
//------------------------------------------------------------------------------
// Return DataSize
//------------------------------------------------------------------------------
function GetDataSizeInMemory(DataType: TMYLDBBaseFieldType; Length: Integer): Integer;
begin
case DataType of
bftChar, // AsciZ
bftVarchar: Result := Length + 1;
bftWideChar,
bftWideVarchar: Result := (Length + 1) * 2;
bftSignedInt8: Result := SizeOf(Shortint);
bftSignedInt16: Result := SizeOf(Smallint);
bftSignedInt32: Result := SizeOf(Integer);
bftSignedInt64: Result := SizeOf(Int64);
bftUnSignedInt8: Result := SizeOf(Byte);
bftUnSignedInt16: Result := SizeOf(Word);
bftUnSignedInt32: Result := SizeOf(Cardinal);
bftSingle: Result := SizeOf(Single);
bftDouble: Result := SizeOf(Double);
bftExtended: Result := SizeOf(Extended);
bftDate: Result := SizeOf(TMYLDBDate);
bftTime: Result := SizeOf(TMYLDBTime);
bftDateTime: Result := SizeOf(TMYLDBDateTime);
bftBlob,
bftClob,
bftWideClob: Result := SizeOf(TMYLDBPageItemID)+SizeOf(PChar); // 10
bftLogical: Result := SizeOf(TMYLDBLogical);
bftCurrency: Result := SizeOf(TMYLDBCurrency);
// 5.07 Bytes bugfix
// begin old code
// bftBytes: Result := Length;
// bftVarBytes: Result := Length;
// end old code
bftBytes: Result := Length + 1;
bftVarBytes: Result := Length + 1;
else
raise EMYLDBException.Create(30050, ErrorGUnknownDataType, [BftToStr(DataType)]);
end;
end;//GetDataSizeInMemory
//------------------------------------------------------------------------------
// Return DataSize
//------------------------------------------------------------------------------
function GetDataSizeInMemory(DataType: TMYLDBBaseFieldType; Data: Pointer): Integer; overload;
begin
// Result := -1;
case DataType of
bftChar,
bftVarchar:
Result := GetDataSizeInMemory(DataType, Length(PChar(Data)));
bftWideChar,
bftWideVarchar:
Result := GetDataSizeInMemory(DataType, Length(PWideChar(Data)));
else
Result := GetDataSizeInMemory(DataType);
end;
end;//GetDataSizeInMemory
//------------------------------------------------------------------------------
// Allocate Memory and Set Data
//------------------------------------------------------------------------------
procedure AllocMemAndSetData(DataType: TMYLDBBaseFieldType;
const Value;
out Buffer;
out BufferSize: Integer);
var len: Integer;
begin
Pointer(Buffer) := nil;
try
case DataType of
bftChar,
bftVarchar:
begin
len := Length(PChar(Value));
BufferSize := GetDataSizeInMemory(DataType,len);
Pointer(Buffer) := MemoryManager.GetMem(BufferSize);
Move(PChar(String(Value))^, PChar(Buffer)^, BufferSize);
end;
bftWideChar,
bftWideVarchar:
begin
len := Length(PWideChar(Value));
BufferSize := GetDataSizeInMemory(DataType,len);
Pointer(Buffer) := MemoryManager.GetMem(BufferSize);
Move(PWideChar(Value)^, PChar(Buffer)^, BufferSize);
end;
else
begin
BufferSize := GetDataSizeInMemory(DataType);
Pointer(Buffer) := MemoryManager.GetMem(BufferSize);
case BufferSize of
1: PByte(Buffer)^ := Byte(Value);
2: PWord(Buffer)^ := Word(Value);
4: PInteger(Buffer)^ := Integer(Value);
8: PInt64(Buffer)^ := Int64(Value);
10: PExtended(Buffer)^ := Extended(Value);
else Move(Value, PChar(Buffer)^, BufferSize);
end;
end;
end;
except
if Pointer(Buffer) <> nil then
raise EMYLDBException.Create(30054, ErrorGCannotCopyDataIntoNewMemory);
end;
end;//AllocMemAndSetData
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -