configDB gplot-Datei lässt sich nicht verändern

Begonnen von khk123, 16 April 2021, 12:51:52

Vorheriges Thema - Nächstes Thema

khk123

Eine Einschränkung muss ich noch nachreichen. Ich verwende eine SQLITE3-Datenbank. Wie es bei den anderen Datenbanken geändert werden kann habe ich mir nicht angesehen.

VG
Karlheinz 
FHEM6.2, RasPi4, RasPi Zero W,
CUL V3, HM, ZWave, IT, vcontrol, owntracks, alexa

khk123

#16
Noch ein Hinweis: Mit MariaDB als Datenbank konnte ich das Verhalten nicht reproduzieren. In der Datenbank existiert immer nur ein Eintrag.


Edit files SVG_test.gplot -> save as SVG_Test.gplot.
Saved SVG_Test.gplot to configDB

configDB filelist
Files found in database:
------------------------------------------------------------
./FHEM/FhemUtils/uniqueID
./FHEM/template.layout
./log/eventTypes.txt
./www/gplot/SVG_CoronaRM.gplot
./www/gplot/SVG_Test.gplot
./www/gplot/template.gplot
./www/gplot/templateDB.gplot
/opt/fhem/db.conf

2.

Edit files SVG_Test.gplot -> save as SVG_test.gplot.
Saved SVG_test.gplot to configDB

configDB filelist
Files found in database:
------------------------------------------------------------
./FHEM/FhemUtils/uniqueID
./FHEM/template.layout
./log/eventTypes.txt
./www/gplot/SVG_CoronaRM.gplot
./www/gplot/SVG_test.gplot
./www/gplot/template.gplot
./www/gplot/templateDB.gplot
/opt/fhem/db.conf

3.

configdb fileshow ./www/gplot/SVG_test.gplot
############################
# Filename: SVG_test.gplot
# 14:52

4.

configdb fileshow ./www/gplot/SVG_Test.gplot
############################
# Filename: SVG_test.gplot
# 14:52
FHEM6.2, RasPi4, RasPi Zero W,
CUL V3, HM, ZWave, IT, vcontrol, owntracks, alexa

betateilchen

Danke für Deine Analyse. Das mit der Groß/Kleinschreibung schaue ich mir bei Gelegenheit an.

Zitat von: khk123 am 18 April 2021, 13:19:50
Eine Einschränkung muss ich noch nachreichen. Ich verwende eine SQLITE3-Datenbank.

Das hatte ich schon gesehen.
In den allermeisten Fällen arbeite ich auch mit sqlite3.
Auch das von mir gepostete Beispiel mit den 4 Schritten wurde mit einer SQLITE3 Datenbank ausgeführt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Das Ganze Problem scheint sqlite-spezifisch zu sein.

Zitat von: khk123 am 18 April 2021, 13:11:35
Warum du beim Lesen mit Like arbeitest hat bestimmt andere Gründe,

Wenn es dafür Gründe gab, hab ich sie inzwischen vergessen  8)

Zitat von: khk123 am 18 April 2021, 13:11:35
Falls die LIKE-Version nicht durch ein "=" ersetzt werden kann,

Grundsätzlich wüßte ich nicht, was dagegenspricht, deshalb habe ich gerade eine Version eingecheckt, die mit "=" anstatt "LIKE" arbeitet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

khk123

Hab noch mal mit MariaDB getestet. Es gibt doch ein Probllem mit der Groß- und Kleinschreibung.

Folgende Devises sind angelegt:

Internals:
   DEF        LogDatabase:SVG_TEST:HISTORY
   FUUID      607c5e66-f33f-2684-17e3-092a7c53ff9ef18b
   GPLOTFILE  SVG_TEST
   LOGDEVICE  LogDatabase
   LOGFILE    HISTORY
   NAME       SVG_TEST
   NR         729
   STATE      initialized
   TYPE       SVG
Attributes:
   DbLogExclude .*
   alias      SVG_TEST
   room       SVG_Test


und

Internals:
   DEF        LogDatabase:SVG_test:HISTORY
   FUUID      607c5ce6-f33f-2684-2329-56320aaf78c3d021
   GPLOTFILE  SVG_test
   LOGDEVICE  LogDatabase
   LOGFILE    HISTORY
   NAME       SVG_test
   NR         675
   STATE      initialized
   TYPE       SVG
Attributes:
   DbLogExclude .*
   alias      SVG_test
   room       SVG_Test


Beide Devices verwenden dieselbe gplot-Datei und je nachdem welche zuletzt verändert wurde, ist dieser mit dem entsprechenden Namen (Gross- oder Kleinbuchstaben) auch in der Datenbank zu finden.
Es gibt nur einen Record, keine zwei verschiedene.

Nach Änderung an SVG_test:

Files found in database:
------------------------------------------------------------
./FHEM/FhemUtils/uniqueID
./FHEM/template.layout
./log/eventTypes.txt
./www/gplot/SVG_test.gplot
./www/gplot/template.gplot
./www/gplot/templateDB.gplot
/opt/fhem/db.conf


und nach Änderung an SVG_TEST:

Files found in database:
------------------------------------------------------------
./FHEM/FhemUtils/uniqueID
./FHEM/template.layout
./log/eventTypes.txt
./www/gplot/SVG_TEST.gplot
./www/gplot/template.gplot
./www/gplot/templateDB.gplot
/opt/fhem/db.conf


VG
Karlheinz
FHEM6.2, RasPi4, RasPi Zero W,
CUL V3, HM, ZWave, IT, vcontrol, owntracks, alexa

khk123

#20
Hab noch mal etwas mehr mit MariaDB getestet und in confidb.pm das "like" gegen "=" ausgetauscht. Keine Änderung des Verhaltens mit MariaDB als Datenbank. Das Problem liegt wohl doch woanders.
Wenn ich in der Datenbank mir das CREATE-Statement für die Tabelle fhemb64filesave ansehe, dann ist die COLUMN als case-insensitiv definiert.

CREATE TABLE `fhemb64filesave` (
`filename` TEXT NULL DEFAULT NULL,
`content` MEDIUMBLOB NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB

daher hilft auch das Gleichheitszeichen nichts. Das Problem ist, dass die Tabelle mit utf8_general_ci angelegt wurde. Der Suffix _ci steht für case-insensitive und ist anscheinend der Default bei MariaDB.

Ich habe mal folgende Änderung für die Column filename durchgeführt:

ALTER TABLE fhemb64filesave MODIFY COLUMN filename TEXT COLLATE LATIN1_GENERAL_CS;

Der Suffix _CS steht für CaseSensitive.
Jetzt verhalten sich die Abfragen wie gewünscht.

SELECT * FROM fhemb64filesave WHERE filename = "./www/gplot/SVG_TEST.gplot";
./www/gplot/SVG_TEST.gplot


SELECT * FROM fhemb64filesave WHERE filename = "./www/gplot/SVG_test.gplot";
./www/gplot/SVG_test.gplot


SELECT * FROM fhemb64filesave WHERE filename like "./www/gplot/SVG_TEST.gplot";
./www/gplot/SVG_TEST.gplot


SELECT * FROM fhemb64filesave WHERE filename like "./www/gplot/SVG_test.gplot";
./www/gplot/SVG_test.gplot


SELECT * FROM fhemb64filesave WHERE filename like "./www/gplot/SVG_%.gplot";
./www/gplot/SVG_TEST.gplot
./www/gplot/SVG_test.gplot


SELECT * FROM fhemb64filesave WHERE filename like "./www/gplot/SVG_Test.gplot";
kein Treffer


Jetzt werden auch die korrekten gplot-Dateien bei den unterschiedlichen Devices SVG_TEST und SVG_test genutzt und sind getrennt veränderbar.

configdb filelist
Files found in database:
------------------------------------------------------------
./FHEM/FhemUtils/uniqueID
./FHEM/template.layout
./log/eventTypes.txt
./www/gplot/SVG_CoronaRM.gplot
./www/gplot/SVG_TEST.gplot
./www/gplot/template.gplot
./www/gplot/templateDB.gplot
/opt/fhem/db.conf


Soweit zum Verhalten mit MariaDB. Ich hoffe, dass es da keine Abweichungen zu MySQL gibt.

SQLITE3 mit dem geänderten configdb.pm sehe ich mir morgen noch mal an.

VG
Karlheinz
FHEM6.2, RasPi4, RasPi Zero W,
CUL V3, HM, ZWave, IT, vcontrol, owntracks, alexa

khk123

Meine Tests mit SQLITE3 und dem geänderten configDB.pm haben ergeben, dass es jetzt funktioniert.

Zwei Devices SVG_test und SVG_TEST angelegt und die richtigen gplot-Dateien wurden verwendet.


configdb filelist
Files found in database:
------------------------------------------------------------
...
./www/gplot/SVG_TEST.gplot
...
./www/gplot/SVG_test.gplot
...


Resumee:

Bei SQLITE3 erfolgt eine Suche mit LIKE case-insensitiv. Das könnte man mit


PRAGMA case_sensitive_like = <true|false>;


entsprechend einstellen, wenn es notwendig ist.

Bei SQLITE gibt es folgenden Hinweis:

The COLLATE clause specifies the name of a collating sequence to use as the default collation sequence for the column. If no COLLATE clause is specified, the default collation sequence is BINARY.

d.h. wenn beim CREATE nichts angegeben wird, dann erfolgt die Suche mit LIKE wg. der collation sequence BINARY case-sensitive.

Bei MariaDB ist es etwas anders. Hier zieht der Collate-Default der Datenbank-Installation. Ich habe bei meiner Installation von MariaDB nichts angegeben und daher ist bei mir der Default utf8_general_ci. Der Suffix _ci steht für case-insensitive. Soll das entsprechende Feld case-sensitive sein, muss dies beim CREATE entsprechend angegeben werden, z.B. COLLATE='latin1_general_cs'. Der Suffix _cs steht für case-sensitive.
Ändern kann man das nachträglich mit


ALTER TABLE fhemb64filesave MODIFY COLUMN filename TEXT COLLATE LATIN1_GENERAL_CS;


MySQL sollte wie MariaDB reagieren, müsste aber jemand testen.

PostgreSQL kann ich leider nicht testen, habe aber folgende Info gefunden:

PostgreSQL is a case-sensitive database by default.

und

The key word ILIKE can be used instead of LIKE to make the match case-insensitive according to the active locale.

Wäre auch noch zu testen, sollte daher eigentlich funktionieren.

Dass das Ganze ein sehr spezieller Fall ist, Devices mit gleichem Namen, nur durch Groß- und Kleinschreibung unterschieden, zu definieren, gebe ich gerne zu. Aber in FHEM können Devices mit Groß- und Kleinbuchstaben angelegt werden und daher muss auch die gplot-Datei mit Groß- und Kleinbuchstaben möglich sein. Sonst wird es verwirrend. Siehe auch FHEM Wiki: https://wiki.fhem.de/wiki/Ger%C3%A4tename

Ich hoffe ich konnte zur Lösung etwas beitragen und habe keinen Blödsinn geschrieben.  :)

VG
Karlheinz

FHEM6.2, RasPi4, RasPi Zero W,
CUL V3, HM, ZWave, IT, vcontrol, owntracks, alexa