#1 2021-07-13 17:37:40

itSDS
Member
From: Germany
Registered: 2014-04-24
Posts: 506

mORMot2 Oracle - Patch

Hi AB i use mORMot2 with Oracle and got error in GetFields.
Hier is my Patch for this

procedure TSqlDBUniDACConnectionProperties.GetFields(const aTableName: RawUtf8;
  out Fields: TSqlDBColumnDefineDynArray);
var
  meta: TDAMetaData;
  n: integer;
  F: TSqlDBColumnDefine;
  FA: TDynArray;
  hasSubType: boolean;
  Owner, Table: RawUtf8;
begin
  meta := (MainConnection as TSqlDBUniDACConnection).fDatabase.CreateMetaData;
  try
    FA.Init(TypeInfo(TSqlDBColumnDefineDynArray), Fields, @n);
    FA.Compare := SortDynArrayAnsiStringI; // FA.Find() case insensitive
    FillCharFast(F, sizeof(F), 0);
    meta.MetaDataKind := 'Columns';
    Split(aTableName, '.', Owner, Table);
    if Table = '' then
    begin
      Table := Owner;
      Owner := '';
    end;

// PATCH
    if (Owner = '') and
       (fDBMS <> dOracle) then
      Owner := MainConnection.Properties.DatabaseName; // itSDS
// PATCH

    if Owner <> '' then
      meta.Restrictions.Values['TABLE_SCHEMA'] := Utf8ToString(UpperCase(Owner))
    else
      meta.Restrictions.Values['SCOPE'] := 'LOCAL';
    meta.Restrictions.Values['TABLE_NAME'] := Utf8ToString(UpperCase(Table));
    meta.Open;
    hasSubType := meta.FindField('DATA_SUBTYPE') <> nil;
    while not meta.Eof do
    begin
      F.ColumnName := StringToUtf8(meta.FieldByName('COLUMN_NAME').AsString);
      F.ColumnTypeNative := StringToUtf8(meta.FieldByName('DATA_TYPE').AsString);
      if hasSubType then
        F.ColumnTypeNative := F.ColumnTypeNative +
          StringToUtf8(meta.FieldByName('DATA_SUBTYPE').AsString);
      F.ColumnLength := meta.FieldByName('DATA_LENGTH').AsInteger;
      F.ColumnScale := meta.FieldByName('DATA_SCALE').AsInteger;
      F.ColumnPrecision := meta.FieldByName('DATA_PRECISION').AsInteger;
      F.ColumnType := ColumnTypeNativeToDB(F.ColumnTypeNative, F.ColumnScale);
      if F.ColumnType = ftUnknown then
      begin
        // UniDAC metadata failed -> use SQL
        Fields := nil;
        inherited GetFields(aTableName, Fields);
        exit;
      end;
      FA.Add(F);
      meta.Next;
    end;
    Setlength(Fields, n);
    GetIndexesAndSetFieldsColumnIndexed(aTableName, Fields);
  finally
    meta.Free;
  end;
end;

Last edited by itSDS (2021-07-13 17:37:52)


Rad Studio 12.1 Santorini

Offline

#2 2021-07-13 17:39:52

ab
Administrator
From: France
Registered: 2010-06-21
Posts: 14,182
Website

Re: mORMot2 Oracle - Patch

Please follow the forum rules and don't post such code in the forum directly.

Please make a pull request on github - much easier to review and integrate.

Should be fixed now.

Offline

#3 2021-07-13 17:56:03

itSDS
Member
From: Germany
Registered: 2014-04-24
Posts: 506

Re: mORMot2 Oracle - Patch

k next time i try the correct way


Rad Studio 12.1 Santorini

Offline

Board footer

Powered by FluxBB