-
Content Count
277 -
Joined
-
Last visited
-
Days Won
2
Everything posted by Jacek Laskowski
-
@Kas Ob. Maybe you should put on a new thread with your proposal, this one concerns my proposal, ok?
-
Ok, I actually assumed that everyone uses lower case letters as prefixes But let's think about the cases. Let's assume that we want to use the letter 'a' as a prefix, in which case all the possibilities of the end result are: name -> aname Name -> aName Array -> aArray array -> aarray ?? When the beginning of the name already contains a small 'a' (in case of re-editing), it is enough to check if the beginning is consistent with 'a', only the last example introduces an ambiguity, because 'array' starts with 'a' and it is not known if it is a 'rray' with an added prefix or 'array' without a prefix. In this case, I would leave 'array' unchanged (which works well for editing the aarray parameter as well). The case with the prefix written in capital letters 'A': name -> Aname Name -> AName Array -> AArray ?? array -> Aarray In this case, the third case (Array) is ambiguous. I would leave it unchanged, similarly as above. These conditions do not seem very complicated, have I overlooked something?
-
As I wrote in the first post this functionality would be optional and configurable.
-
The Hungarian notation refers to prefixes identifying the type of variable, this is something else. In this case you would have all 3 kinds of prefixes marked as 'a'.
-
Large address space awareness. How to test properly?
Jacek Laskowski replied to A.M. Hoornweg's topic in RTL and Delphi Object Pascal
https://www.thedelphigeek.com/2019/04/fastmm4-large-memory.html -
Simple inlined function question
Jacek Laskowski replied to Mike Torrettinni's topic in Algorithms, Data Structures and Class Design
Inline was added in D2005: https://edn.embarcadero.com/article/33050 -
Hi, I found a serious FireDAC bug, I wrote a minimal sample program to reveal it, you need a Firebird server and any database to run. Maybe there is also a problem with other servers, I did not check. The problem occurs when you do not explicitly assign the FDConnection control to the FDQuery, but use the registered Connection Definition Name and assign it by Query.ConnectionName and occurs when Connection Definition Name is used more than once at a time (in thread). The result is a mass of random errors, each time you run it, there are different errors, in a different place of FireDAC code. Source of example, console app: program FDPoolingBug; uses System.Threading, System.Classes, Winapi.Windows, FireDAC.Phys.IBWrapper, FireDAC.Phys, FireDAC.Phys.FBDef, FireDAC.Stan.Intf, FireDAC.Stan.Def, FireDAC.DApt, FireDAC.Phys.FB, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Comp.Client, System.SysUtils; {$APPTYPE CONSOLE} {$R *.res} const CONN_DEF_NAME = 'CONNECTION_TO_DB'; var bEnd : Boolean = False; procedure RegisterConnectionDefinition(); var oConDef: IFDStanConnectionDef; oPars: TFDPhysFBConnectionDefParams; begin if FDManager.ConnectionDefs.FindConnectionDef(CONN_DEF_NAME) = nil then begin oConDef := FDManager.ConnectionDefs.AddConnectionDef; oConDef.Name := CONN_DEF_NAME; oPars := TFDPhysFBConnectionDefParams(oConDef.Params); oPars.DriverID := 'FB'; oPars.Server := '192.168.1.10'; oPars.Database := 'Some_FB_Database.FDB'; oPars.Port := 3060; oPars.Pooled := True; oPars.PoolMaximumItems := 100; oPars.PoolCleanupTimeout := 30000; oPars.PoolExpireTimeout := 90000; oPars.UserName := 'sysdba'; oPars.Password := 'masterkey'; oPars.SQLDialect := 3; oPars.Protocol := ipTCPIP; oPars.CharacterSet := TIBCharacterSet.csUTF8; oConDef.Apply; end end; procedure QueryWithAutoConnection(); //This method works incorrectly var lCounter: Integer; lId: Integer; lQuery: TFDQuery; begin lId := GetCurrentThreadId() mod 99; Writeln('start: ', lId); try lQuery := TFDQuery.Create(nil); lQuery.ConnectionName := CONN_DEF_NAME; lQuery.SQL.Text := 'select * from rdb$database'; lCounter := 0; repeat lQuery.Open; lQuery.Close; Inc(lCounter); if lCounter = 1000 then begin lCounter := 0; Writeln(lId); end; until bEnd; except On E : Exception do begin writeln(Format('id: %d, Exception: %s, Desc: %s', [lId, E.ClassName, E.Message])); Writeln; end; end; end; procedure QueryWithDedicatedConnection(); // This method works correctly var lConn: TFDConnection; lCounter: Integer; lId: Integer; lQuery: TFDQuery; begin lId := GetCurrentThreadId() mod 99; Writeln('start: ', lId); try lConn := TFDConnection.Create(nil); lConn.ConnectionDefName := CONN_DEF_NAME; lQuery := TFDQuery.Create(nil); lQuery.Connection := lConn; lQuery.SQL.Text := 'select * from rdb$database'; lCounter := 0; repeat lQuery.Open; lQuery.Close; Inc(lCounter); if lCounter = 1000 then begin lCounter := 0; Writeln(lId); end; until bEnd; except On E : Exception do begin writeln(Format('id: %d, Exception: %s, Desc: %s', [lId, E.ClassName, E.Message])); Writeln; end; end; end; procedure RunOne(); var aTask: ITask; begin aTask := TTask.Create(QueryWithAutoConnection); aTask.Start; TTask.WaitForAll([aTask]); end; procedure RunParallel(lThreadCount : Integer); var aTasks: TArray<ITask>; i: Integer; begin SetLength(aTasks, lThreadCount); for i := 0 to Pred(lThreadCount) do begin aTasks[i] := TTask.Create(QueryWithAutoConnection); Sleep(10); aTasks[i].Start; end; TTask.WaitForAll(aTasks); end; begin try RegisterConnectionDefinition(); //RunOne; RunParallel(3); Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Can someone check it in Delphi 10.4.1? I use Delphi 10.3.
-
And unfortunately this is a certain inconsistency, because when I create FDConnection and assign it ConnectionDefName, a physical, new connection is taken from the pool. Why doesn't he do it with Query if he gets a new, automatically created FDConnection in the same way? Couldn't this new FDConnection also get a new, unique connection from the pool?
-
I downloaded GExperts sources and tried to build... without success, I get error on prebuild step: PreBuildEvent: call ..\..\images\_CreateGXIconsRc.cmd&&call ..\..\buildtools\prebuild.cmd "d :\Work\GExperts\Projects\DelphiXx103\GExpertsRS103.dproj"&&call ..\..\buildto ols\movedll.cmd "d:\Work\GExperts\Binaries\GExpertsRS103.dll" generating GXIcons.rc in d:\Work\GExperts\Images Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. Nazwa pliku jest powtórzona, albo nie można odnaleźć pliku. C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\CodeGear.Common.Targets(402, 5): error MSB3073: The command "call ..\..\images\_CreateGXIconsRc.cmd&&call .. \..\buildtools\prebuild.cmd "d:\Work\GExperts\Projects\DelphiXx103\GExpertsRS10 3.dproj"&&call ..\..\buildtools\movedll.cmd "d:\Work\GExperts\Binaries\GExperts RS103.dll"" exited with code 1. [d:\Work\GExperts\Projects\DelphiXx103\GExperts RS103.dproj] Done Building Project "d:\Work\GExperts\Projects\DelphiXx103\GExpertsRS103.dpro j" (rebuild target(s)) -- FAILED. Error message "Nazwa pliku jest powtórzona, albo nie można odnaleźć pliku." after translate to english means: "The file name is duplicated or the file cannot be found.'" But which file?
-
Ok, I forgot FDManager.Active := True; at the end of the RegisterConnectionDefinition() method, but it doesn't change anything, after adding the errors are the same. And as for the connection... I don't use the same connection, I use a pool that is managed by FireDAC, so I assume that for every query it gives a new connection, isn't that how it should work? from documentatio9n: "The ConnectionName property value must be specified before Prepare call. If it matches the name of one of connection definitions, then FireDAC will transparently create connection object and link the dataset with it. "
-
Vote for SAST support for Delphi in GitLab
Jacek Laskowski replied to Darian Miller's topic in Tips / Blogs / Tutorials / Videos
exactly! -
Vote for SAST support for Delphi in GitLab
Jacek Laskowski replied to Darian Miller's topic in Tips / Blogs / Tutorials / Videos
What is SAST? -
Firebird 3.0.6 - embedded. Change the disk to caching the first time you start program
Jacek Laskowski replied to Stano's topic in Databases
Please ask here: https://groups.google.com/g/firebird-support -
How make event be called with an inherited class?
Jacek Laskowski replied to Magno's topic in Algorithms, Data Structures and Class Design
NetHTTPClient has one huge advantage... When working with SSL/TLS it uses the system api and you don't have to fight with openssl, certificates etc. -
How make event be called with an inherited class?
Jacek Laskowski replied to Magno's topic in Algorithms, Data Structures and Class Design
In your class constructor, you should assign these events, something like: constructor TmyNetHTTPClient.Create() begin inherited Create; OnReceiveData := ReceiveData; OnRequestComplewted := RequestCompleted; end; -
Problems changing database with pooled connection
Jacek Laskowski replied to Mark Williams's topic in Databases
Try to use OutputDebugString() function from WinAPI and this tool for viewing output: https://docs.microsoft.com/en-us/sysinternals/downloads/debugview -
Problems changing database with pooled connection
Jacek Laskowski replied to Mark Williams's topic in Databases
Try debugging the difference in the firedac code, just before the error, how the manager's state differs? -
What exactly are PoolCleanupTimeout and PoolExpireTimeout in FireDAC connection definition params? Documentation not explain these parameters. @Dmitry Arefiev ?
-
Problems changing database with pooled connection
Jacek Laskowski replied to Mark Williams's topic in Databases
@Dmitry Arefiev Dmitry, please explain what you mean? -
Local string variable value is not assigned for 2nd and following calls
Jacek Laskowski replied to ertank's topic in RTL and Delphi Object Pascal
I guess inside the uUtils.Http.PostIndy() method, the Request parameter is somehow casted and associated with a buffer/indicator, which is later cleaned up by another part of the code (maybe thread?) -
livebindings without livebindings designer , code only
Jacek Laskowski replied to FranzB's topic in Databases
I don't know the answer to the question, but it may be useful: https://github.com/malcolmgroves/FluentLiveBindings -
Records, Generics and RTTI meets FireDAC
Jacek Laskowski replied to Lars Fosdal's topic in Tips / Blogs / Tutorials / Videos
@Lars Fosdal Ok, ok, I just wanted to expand the topic: FireDAC, RTTI and generics 😉 -
Records, Generics and RTTI meets FireDAC
Jacek Laskowski replied to Lars Fosdal's topic in Tips / Blogs / Tutorials / Videos
Look at my idea, without records, but with interfaces, SQL is generated automatically, moreover UPDATE and INSERT works 😉 https://github.com/jaclas/transfORM -
I need to validate an XML file that has references to XSD files, I use TXMLDocument for that. But during this validation, which is done in a thread, the MSXML bni library displays me a window asking for permission, it looks like this: The message in english is: "This page is accessing information that is not under its control. This poses a security risk. Do you want to continue?" Is it possible to confirm this question from the code level or disable the message? And I know it is hidden in the internet options of the system, but I do not have access to clients' computers and I have to bypass it in the code.
-
XMLDocument and popup windows
Jacek Laskowski replied to Jacek Laskowski's topic in RTL and Delphi Object Pascal
The reason is in the internet settings: https://kb.froglogic.com/squish/web/troubleshoot/page-accessing-information-not-under-its-control/ When I change "Access data sources across domains" to Enable problem disappear. But how to change this or prevent from code level?