Schlagwort-Archive: howto

Planung und Durchführung einer Firebird 3 Migration

Wie migriert man eine Anwendung inkl. zugehöriger Datenbanken von Firebird 2 auf Firebird 3? Automatisiert? Bei vielen Installationen auf verschiedenen Kundenrechnern ohne manuelle Eingriffe? Dies waren die Fragen bzw. Aufgaben die zu klären waren und die ich nun versuche etwas zu beschreiben und für den einen oder anderen der ein ähnliches Problem hat noch ein paar Hinweise mit auf den Weg zu geben.
Weiterlesen

How to count number of lines of code

For statistics I would like to know how many lines of code I have written over the last few years.
I have used the following code snippet for Windows PowerShell to count the number of lines of code in a directory recursively.
Open the Windows PowerShell and navigate to the main development folder.

dir -Recurse *.pas | Get-Content | Measure-Object -Line

My result:

2017_09_lines_of_code_powershell

Dateisuche ohne FindFirst/FindNext (mit Regex Filter)

Um nach Dateien in einem Verzeichnis zu suchen musste man „früher“ die Methoden FindFirst, FindNext und FindClose bemühen. Dies war meiner Meinung nach immer recht kompliziert. Vorallem wenn man auch in Unterverzeichnissen suchen wollte.
Seit einigen Delphi Versionen gibt es die Unit IOUtils.pas welche einem den komplizierten Teil abnimmt. Eine einfache Suche nach allen Dateien im Verzeichnis C:\Temp inkl. aller Unterverzeichnisse sieht wie folgt aus:

  var
    SearchResult: TStringDynArray;
    I: Integer;
  begin
    SearchResult := TDirectory.GetFiles('C:\Temp', TSearchOption.soAllDirectories, nil);
    for I := Low(SearchResult) to High(SearchResult) do
      WriteLn(SearchResult[I]);
  end;

Weiterlesen

How to EncodeDate with Firebird SQL

Wie kann man in Firebird bzw. in SQL aus einem String oder den numerischen Werten für Jahr, Monat und Tag ein „echtes“ Datum erzeugen? In Delphi gibt es den Befehl „EncodeDate“ (http://docwiki.embarcadero.com/Libraries/Berlin/en/System.SysUtils.EncodeDate). In Firebird den Befehl „cast“ (http://firebirdsql.org/refdocs/langrefupd21-intfunc-cast.html).
Weiterlesen

How to properly cleanup/shutdown a Delphi ISAPI (which uses Threads)

If You use Threads or global Objects (which are created in the initialization section for example) You have to cleanup/shutdown them in the OnTerminate event of the ISAPI Application. If You destroy/shutdown them in the finalization section in a unit it could end up in a hanging application pool in IIS on shutdown/reuse and some windows event log entries.
Weiterlesen

How to TStringList to JSON Array and vice versa

Nachfolgend zwei kleine Funktionen um eine TStringList bzw. TStrings in ein TJSONArray und umgekehrt zu wandeln.

uses
  Data.DBXJSON;

function StringsToJSONArray(const Data: TStrings): TJSONArray;
var
  I: Integer;
begin
  Result := TJSONArray.Create;
  for I := 0 to Data.Count - 1 do
    Result.Add(Data[I]);
end;

function JSONArrayToStrings(const Data: TJSONArray): TStringList;
var
  I: Integer;
begin
  Result := TStringList.Create;
  for I := 0 to Data.Size - 1 do
    Result.Add(Data.Get(I).Value);
end;

Weiterlesen

How to protect a Firebird table against direct writing?

In Firebird it is possible to insert/update data in a table even if the user did not have direct write access to this table. One way is to insert/update data via a stored procedure. In this case the user connected to the database has only execute permissions to the stored procedure. The stored procedure has the necessary insert/update permissions to the table. Weiterlesen