

TurboMagic
-
Content Count
255 -
Joined
-
Last visited
-
Days Won
9
Posts posted by TurboMagic
-
-
I'm on 4.0.x now and will look at the change log document for V5.0 soon.
-
1
-
-
I still have my backup problem. Back then I started to implement a small test application. Today I added database opening, closing and reading out
of some data capabilities for further testing/investigation. That test works as follows and doesn't show the error:1. Open database
2. Read out some data
3. Perform a backup
If I do similar things it failed with that XNET error.
During implementing the test program I found out that this:FDriverLink.DriverID := 'FB';
was in the code instead of this:
FDriverLink.DriverID := 'IB';
I changed my real application now and guess what?
It works! 😉Must have been a leftover from the times where dbExpress had been used
and no FB driver existed yet. -
GetIt publication of a V2.1.1 has been done now, but one user from German DP reported some problem I cannot reproduce yet.
I could install it via GetIt in 12.0 (had only Parnassus IDE plugins installed in that installation so far) and run it
while he seemed to get some compilation error.
Maybe somebody has a "plain"/"virgin" 11.x installation he can test on?
Suspicion is that older Delphi versions require some Edge SDK stuff (as available in GetIt) isntalled which
nowadays is included in RTL or so already...Enjoy
TurboMagic
-
Sigh! That was the idea of my own small backup/restore test app I developed using code from the main app. But when using that it always works 😞
Ok, one thing is left to check: these auto reconnect options of the DB connection. But I doubt that's the issue, but need to check. -
Strange. When I call offline on the DB connection and then run the backup from the same application I get this xnet error.
But when I call offline on the DB connection followed by exit as next statement and place a breakpoint on that, I can run
that application so it stops on the exit statement and then perform a backup from a separate test application which uses
the same code to perform the backup and the backup works.Why doesn't it work when I call that from the same application?
-
Thanks for the offline/online hint! I'll look at this later!
-
Ok, I'm pleased too early: when trying to perform a backup with FB 4.0 while the DB Connection is open, it fails with
an I/O error because the DB file is already open. 😞 And I also found out now that the cases where it worked were
because of having installed and 4.0 FB server on the same VM for using a DB tool and having forgotten to turn
off the service 😞With 2.5 embedded this wasn't a problem as far as I can remember.
That would mean now, that I have to close the DB connection and close the DriverLink, then I can perform the
backup and then I need to reopen the DB connection and what's more: all datasets I have, which pointed on this
DB connection and which might be open at this point in time become invalid. I would have to recreate them all.Correct?
Or is there a way I can perform a backup while still having an open DB connection using the embedded version
of Firebird? I could understand for the Restore, but not for the Backup...
And yes, the other option would be to not use Embedded but the regular client/server variant. -
Ok, I did the Firebird 4.0 Migration now and Backup/Restore basically work again. I've got something else in im application now when restoring,
but that's something on my side. -
Starting with FB 3.0 you are wrong. The client library is named like the client/server one now, as they try to unify things.
-
1
-
-
Oh, really? Then I should directly try to migrate to FB 4 embedded. I guess you used embedded? As I guess I wouldn't have the issues using the server variant...
-
Here's the code used to initialize the restore component:
FFBDriverLink := TFDPhysFBDriverLink.Create(nil); FFBDriverLink.VendorLib := 'D:\Projects\MyApp\Win32\Debug\Database\fbclient.dll'; FFBDriverLink.Embedded := true; FFBRestore := TFDIBRestore.Create(nil); FFBRestore.ConnectTimeout := 0; FFBRestore.Database := DatabaseFileName; FFBRestore.DriverLink := FFBDriverLink; FFBRestore.Password := c_DBPassword; FFBRestore.QueryTimeout := 2; FFBRestore.UserName := c_DBUserName; FFBRestore.Options := [roReplace]; FFBRestore.Protocol := TIBProtocol.ipLocal; FFBRestore.Verbose := true; FFBRestore.AfterExecute := OnRestoreFinishedInternal; FFBRestore.OnProgress := OnRestoreProgressInternal; FFBRestore.OnError := OnRestoreErrorInternal;
-
This is a problem already discussed in German DP:
https://www.delphipraxis.net/214354-backup-problem-nach-umstellung-auf-v3-0-embedded.html
but the hints I got from there weren't working yet or not exactly how I wanted things to work.I've got an application developed in Delphi 11.3 which used a Firebird V2.5 embedded database.
Now I wanted to migrate it to a newer version (currently 3.0, but at the end 4.x is planned).The migration worked for the main part of the application, but it fails for the backup/restore menus
in the application. The failure shown is:
[FireDAC][Phys][FB]Unable to complete network request to host "xnet://Global\FIREBIRD".
[FireDAC][Phys][FB]invalid service handle
[FireDAC][Phys][FB]invalid service handleThis is strange, because the same method for performing a restore is used in this application at startup
when a database backup file is found which stems from an update of the application. That's needed to be
able to move to a newer database file format verion (ODS in Firebird terms). In that scenario the restore is
run before there was an open TFDConnection.The failure case happens when I invoke the restore menu in the application. But that one closes the connection
first and after some modification even frees the connection and the DriverLink objects.I also created a separate small test application which just implements the restore using the unints from the
main application. When I set a breakpoing in the main application on the close call of the DB connection, let
that one get carried out and then halt the main application in the debugger the test application will present
a different error thant the one described above.I modified the main application then to just close the connection in the restore menu and then do nothing more.
Then I can run my separate test application and perform the restore.I also checked FDManager.ConnectionCount when I close that connection. Before it is 1 and after close it is 0,
so there's no connection pooling used in that application.=> what else can this be and why does it work, when running the restore before having opened any db connection?
-
Publication via GetIt is currently on hold, as the curator of it always gets virus alerts 😞
Most likely from the included exe cmd line too the wizard uses.I already generated a new version where I complied those myself. Let's see if that can be accepted.
-
Hello,
this is the information that a version 2.1 of Delphi Code Coverage Wizard Plus has been released today.
It can be found here: https://github.com/MHumm/delphi-code-coverage-wizard-plus/releases/tag/V2.1
and hopefully soon via Tools/GetIt package manager.What's new?
- updated code coverage command line tool used
- fixed duplicate accelerator keys on generate and run menu/page
- added support for new -ecp class prefix exclusion parameter
- added support for new -lcl parameter
- added support for new -ife and -efe parameters
- made Delphi 12.0 Athens known to the tool for IDE tools menu integration
Enjoy
TurboMagic
-
1
-
1
-
Hello,
when compiling my app (the Hash FMX demo from this project: DelphiEncryptionCompendium) with Delphi 12 for Android 32 bit debug mode
I get this failure message, while the same thing just works in 11.3. Compiling the FMX cipher demo for Android with 12.0 works though
(I just uploaded a new aab for app store publication).Looking at the failure messages I wonder where on earth I should have gotten > 65536 methods in this project?!
My 12.0 installation is a standard one with the standard SDK/NDK and Java brought by the Delphi installation.[PAClient Fehler] Fehler: E7688 ""C:\Program Files\Eclipse Adoptium\jdk-11.0.15.10-hotspot\bin\java.exe" -cp "c:\program files (x86)\embarcadero\studio\23.0\bin\Android\r8-8.0.40.jar" com.android.tools.r8.D8 --release --min-api 19 --output "D:\Projekte\DECGitMaster\Compiled\BIN_IDExx.x_Android__Demos\Hash_FMX.classes" @"D:\Projekte\DECGitMaster\Compiled\BIN_IDExx.x_Android__Demos\dex_list.txt"" kann nicht ausgeführt werden (Fehler 1) [PAClient Fehler] Fehler: E7688 Picked up JAVA_TOOL_OPTIONS: [PAClient Fehler] Fehler: E7688 Error: Cannot fit requested classes in a single dex file (# methods: 86037 > 65536). Try supplying a main-dex list [PAClient Fehler] Fehler: E7688 Compilation failed [PAClient Fehler] Fehler: E7688 Exception in thread "main" java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: null [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.N0.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:119) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.D8.main(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:5) [PAClient Fehler] Fehler: E7688 Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: null [PAClient Fehler] Fehler: E7688 at Version.fakeStackEntry(Version_8.0.40.java:0) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.N0.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:74) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.N0.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:27) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.N0.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:26) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.N0.b(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:2) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.D8.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:26) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.D8.b(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:13) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.D8.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:24) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.N0.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:106) [PAClient Fehler] Fehler: E7688 ... 1 more [PAClient Fehler] Fehler: E7688 Caused by: com.android.tools.r8.utils.b: Cannot fit requested classes in a single dex file (# methods: 86037 > 65536) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.E2.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:21) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.E2.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:26) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.dex.t0.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:228) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.dex.o0.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:9) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.dex.k.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:51) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.dex.k.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:157) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.D8.d(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:152) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.D8.c(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:1) [PAClient Fehler] Fehler: E7688 at com.android.tools.r8.utils.N0.a(R8_8.0.40_1caf5950b946297b5c46a21a695cd28795208d72fd17f5129543b31a15a067c2:23) [PAClient Fehler] Fehler: E7688 ... 6 more
Anybody any clue about the reason for this and how to fix it?
CHeers
TurboMagic
-
Ok, I have a solution now, thanks to Uwe's suggestion:
If I use a DataSetWriter instead of a SQL one, I can assign a TFDTable component to that one, which has the TableName property
and which calls OnNewRecord just fine. In that one can I check the table name and if it's one of the tables where not Null columns
have been added later on, I can check these columns for 'not NULL' and assign a default value there.In my tests the DB functionality of having default values didn't work. Maybe the TFDBatchMove added NULL values itsself for
these additional columns... -
Ok, the plan with the TFDBatchMoveDataSetWriter isn't so easy. It lacks the .TableName property and it looks like I need to assign a TDataSet to that one.
Seems more investigation is required.
-
Well, when I provide an SQL query for the reader as you describe I'm getting more inflexible
when adding new fields to that table in comparison to only having to deal with cases where a "not NULL"for a column needs to be dealt with.
Since Uwe hints that a SQLWriter will not call OnNewRecord I will try the TFDBatchMoveDataSetWriter now.
If that calls this event and lets me call FieldByName it should do.
-
I tried OnNewRecord now, but it doesn't seem to get called. What am I'm doing wrong?
Here I assign OnNewRecord via code, since FWriter is created at runtime:
FWriter.FDDataSet.OnNewRecord := OnNewRecord;
Here's the implementation of that event:
procedure TDBCopy.OnNewRecord(DataSet: TDataSet); begin if (FWriter.ActualTableName.ToUpper = 'KASSE_EINSTELLUNGEN') then begin DataSet.FieldByName('DRAWBACK_CALCULATION').AsInteger := 0; end; if (FWriter.ActualTableName.ToUpper = 'KASSE_PRINTSETTINGS') then begin DataSet.FieldByName('PRINT_SMALL_BONS').AsInteger := 0; end; end;
But when running FBatchMove.Execute; the breakpoint in the event is never ever called.
And the way my application crashes indicates that it's actually never run.
Do I need to activate something somewhere?
I only assign TableNames to FReader.TableName and FWriter.TableName and then run FBatchMove.Execute;
-
Thanks for that pointer.
-
I'm using D11.3 and a Firebird database. I use TFDBatchMove to copy rows from one database (the old one before the update of the application) to the empty DB installed with the update. Now when that new database contains a new column declared as non Null it crashes.
How to prevent this or how to deal with this?
-
Thanks for the info! That one works for me. My DNS is an inernal one so Google etc. don't help me...
-
Ok, I can query this TXT record now, when I know the IP of one of our internal DNS servers.
But how to find that one out?
Yes, cmd.exe -> ipconfig /all would tell me, but I need to implement this internally.
I tried to understand what THTTPCli does to determine that, but I failed to do so.
Is there some other easier solution available to get such an IP-address?
I know that I can have several connections and thus several DNS servers. but I think I can manage
when I get a list of all those. -
Well, I won't use this for e-mail, but the data will most likely not change often, if at all.
But this is good to know for first tests.
Using a timer in an Android SharedObject
in Cross-platform
Posted
Hello,
this question is quite low level. For the purpose of being used from some completely different programming language on Android I'm trying
to check if I can rework a Windows DLL of mine into a shared object.
I can create a shared object (.so) already, for this one has to be aware that the library project type in Delphi which would create a DLL on
Windows won't create a .SO on Android. I consider this a bug or at least a missing feature. But you can create a .SO by creating an FMX
project and throw out the use of the default generated form (and everything in the begin / end block of the DPR).
The resulting SO can be used if the functions/procedures are called dynamically.
Next step would be to get a timer up and running.
I tried the FMX time, but that didn't work, it crashes as soon as I want to create it (segfault 11).
So I looked into how this one is implemented and copied that code into my application (to have as few connections with RTL and
FMX as possible). But it crashes on creation as well.
I looked what is done under the hood and it is this:
The timer needs a JHandler and this shall be fetched via Androidapi.Helpers.TAndroidHelper, which has a MainHandler class property.
This accesses a FMainHandler field and if that is nil, it is initialized, but that needs a TJLooper.
As far as I understood (see https://developer.android.com/reference/android/os/Handler) this is the equivalent of the Windows message loop.
Can I replicate that somehow in my SO? What would I have to do to get this working?
My test project is attached. If you want to try it, compile the libSOTest.so first, then run libSOTestGUI.
Best regards
TurboMagic
SOTest.zip