--- ibx/trunk/fbintf/client/FBArray.pas 2016/12/06 10:33:46 46 +++ ibx/trunk/fbintf/client/FBArray.pas 2017/01/09 15:31:51 47 @@ -78,6 +78,7 @@ type function SQLData: PChar; override; function GetDataLength: cardinal; override; function GetCodePage: TSystemCodePage; override; + function getCharSetID: cardinal; override; procedure SetDataLength(len: cardinal); override; procedure SetSQLType(aValue: cardinal); override; public @@ -99,14 +100,20 @@ type { TFBArrayMetaData } TFBArrayMetaData = class(TFBInterfacedObject,IArrayMetaData) + private + function GetDType(SQLType: cardinal): UChar; protected FArrayDesc: TISC_ARRAY_DESC; + FCharSetID: integer; procedure LoadMetaData(aAttachment: IAttachment; aTransaction: ITransaction; relationName, columnName: string); virtual; abstract; function NumOfElements: integer; public constructor Create(aAttachment: IAttachment; aTransaction: ITransaction; - relationName, columnName: string); + relationName, columnName: string); overload; + constructor Create(SQLType: cardinal; tableName: string; columnName: string; + Scale: integer; size: cardinal; charSetID: cardinal; + dimensions: cardinal; bounds: TArrayBounds); overload; function GetCodePage: TSystemCodePage; virtual; abstract; public @@ -250,6 +257,11 @@ begin Result := (FArray.FMetaData as TFBArrayMetaData).GetCodePage; end; +function TFBArrayElement.getCharSetID: cardinal; +begin + Result := (FArray.FMetaData as TFBArrayMetaData).GetCharSetID; +end; + procedure TFBArrayElement.SetDataLength(len: cardinal); begin if len > GetDataLength then @@ -474,6 +486,30 @@ begin LoadMetaData(aAttachment,aTransaction,relationName, columnName); end; +constructor TFBArrayMetaData.Create(SQLType: cardinal; tableName: string; + columnName: string; Scale: integer; size: cardinal; charSetID: cardinal; + dimensions: cardinal; bounds: TArrayBounds); +var i: integer; +begin + inherited Create; + with FArrayDesc do + begin + array_desc_dtype := GetDType(SQLType); + array_desc_scale := char(Scale); + array_desc_length := UShort(size); + StrPLCopy(array_desc_field_name,columnName,sizeof(array_desc_field_name)); + StrPLCopy(array_desc_relation_name,tableName,sizeof(array_desc_relation_name)); + array_desc_dimensions := dimensions; + array_desc_flags := 0; + FCharSetID := charSetID; + for i := 0 to Length(bounds) - 1 do + begin + array_desc_bounds[i].array_bound_lower := bounds[i].LowerBound; + array_desc_bounds[i].array_bound_upper := bounds[i].UpperBound; + end; + end; +end; + function TFBArrayMetaData.GetSQLType: cardinal; begin case FArrayDesc.array_desc_dtype of @@ -549,6 +585,34 @@ begin end; end; +function TFBArrayMetaData.GetDType(SQLType: cardinal): UChar; +begin + case SQLType of + SQL_TEXT: + Result := blr_text; + SQL_SHORT: + Result := blr_short; + SQL_LONG: + Result := blr_long; + SQL_QUAD: + Result := blr_quad; + SQL_FLOAT: + Result := blr_float; + SQL_D_FLOAT: + Result := blr_double; + SQL_TIMESTAMP: + Result := blr_timestamp; + SQL_VARYING: + Result := blr_varying; + SQL_TYPE_DATE: + Result := blr_sql_date; + SQL_TYPE_TIME: + Result := blr_sql_time; + SQL_INT64: + Result := blr_int64; + end; +end; + function TFBArrayMetaData.NumOfElements: integer; var i: integer; Bounds: TArrayBounds;