FirebirdSQL / firebird

Firebird server, client and tools
https://firebirdsql.org
1.26k stars 217 forks source link

user-friendly DPB-string in new api [CORE4716] #5023

Open firebird-automations opened 9 years ago

firebird-automations commented 9 years ago

Submitted by: Nick (nick)

Votes: 2

Now DPB looks like this: #⁠1'?'#⁠1#⁠3'0'#⁠7'WIN1251'#⁠$1C#⁠6'SYSDBA'#⁠$1D#⁠9'masterkey' (in Delphi). It is not so easy to generate it correctly. Something like 'ConnectionSqlDialect=[3], ConnectionCharSet=[WIN1251], UserName=[SYSDBA], Password=[masterkey]' seems more friendly.

firebird-automations commented 9 years ago

Commented by: @aafemt

Should it be case-sensitive? Comma-separated, zero-separated or semicolon separated? Why use square braces instead of ODBCstandard braces? Encoding? wchar_t?.. How to handle mistyped/unknown parameter names?

firebird-automations commented 9 years ago

Commented by: Doug Chamberlin (greymont)

Please pick an established standard for this syntax, such as JSON, rather than using something new! That would answer all the questions from Dimitry, I think.

Also, avoid XML as the point is to make the options more readable.

firebird-automations commented 9 years ago

Commented by: @aafemt

Is ODBC standard established enough?..

firebird-automations commented 9 years ago

Commented by: Nick (nick)

I think... >Should it be case-sensitive? as in DPB

>Comma-separated, zero-separated or semicolon separated? something human-printable and human-readable

>Why use square braces instead of ODBCstandard braces? symbols ' and " are used for strings in many languages. Now I think it will be useful if developer can use any of them, and maybe square braces too. In C#⁠: string dpb = "ConnectionSqlDialect='3', ConnectionCharSet='WIN1251', UserName='SYSDBA', Password='masterkey'"; In Delphi: DPB: string = 'ConnectionSqlDialect="3", ConnectionCharSet="WIN1251", UserName="SYSDBA", Password="masterkey"';

>Encoding? wchar_t?.. binary, with utf-8 encoded values if needed (username, path to database, etc. ), with doubling quote symbol if it is in param value (like UserName='it''s user').

>How to handle mistyped/unknown parameter names? with smart skiping and error if parameter does not exists and not defined in skipped list for current version. something like this:

with error for NoDbTriggers and ProcessName params for FB < 2.1 (they not exists there): 'EngineParams(ConnectionSqlDialect="3", ConnectionCharSet="WIN1251", UserName="SYSDBA", Password="masterkey", NoDbTriggers, ProcessName="D:\App.exe")'

with skip NoDbTriggers and ProcessName for FB < 2.1, and skipping SomeFB3Param for FB3: 'EngineParams(ConnectionSqlDialect="3", ConnectionCharSet="WIN1251", UserName="SYSDBA", Password="masterkey", NoDbTriggers, ProcessName="D:\App.exe", SomeFB3Param="ParamValue" ,SkipParamsForVersionsLowerThan("2.1.0")="NoDbTriggers, ProcessName"), SkipParamsForVersionsLowerThan("3")="SomeFB3Param")'

and with plugin params: 'EngineParams(ConnectionSqlDialect="3", ConnectionCharSet="WIN1251", UserName="SYSDBA", Password="masterkey"), PluginParams(PluginName="DS_Replication", Timeout="30"), PluginParams(PluginName="SmartLogging", LogLevel="12")'

with skip: 'EngineParams(ConnectionSqlDialect="3", ConnectionCharSet="WIN1251", UserName="SYSDBA", Password="masterkey"), PluginParams(PluginName="DS_Replication", Timeout="30"), PluginParams(PluginName="SmartLogging", LogLevel="12", SkipParamsForVersionsLowerThan("0.1")="LogLevel")'

firebird-automations commented 9 years ago

Commented by: Nick (nick)

JSON is good too. { "Engine": { "ConnectionSqlDialect": 3, "ConnectionCharSet": "WIN1251", "UserName": "SYSDBA", "Password": "masterkey", "VersionParams": { "2.1": { "NoDbTriggers": True, "ProcessName": "D:\App.exe" }, "3": { "SomeFB3Param": "ParamValue" } } }, "Plugin": { "Name": "DS_Replication", "Timeout": 30 }, "Plugin": { "Name": "SmartLogging", "PluginVersionParams": { "0.1": { "LogLevel": 12 } } } }

firebird-automations commented 7 years ago

Commented by: PizzaProgram Ltd. (szakilaci)

While this seems to be a great feature at first sight, please consider following aspects too: 1.) SPEED: - it is obvious that parsing a JSON gives much more overhead than analysing a simple #⁠1 char - The ideal DB connection is, if you: <Connect><do things><Disconnect> ... as quickly as possible. - param-parsing + encrypting + compressing should happen at the client side BEFORE a connection attempt is made

2.) Encryption / safety / password protection: - it is very hard to protect something encrypted, if there are always standard keywords at standard places. (Think about how they decrypted the enigma machine ... ) Think about if YOUR personal data would be hacked from a DB.

3.) Separating: - maybe if there would be a feature to send more specific (JSON formed) parameters AFTER a connection has been established with minimum params.

4.) Enhancements: - it would be nice to be able to disable showing DB-PATHs in the 'firebird.log' file. (Currently you can easily find a database hidden on a PC or server by simply looking at this log file and search for errors when connection broke. It reveals the full path. :(( ) - or turn OFF logging completely during a specific connection. - overwriting connection/command/idle timeouts (See: CORE985)