lsc-project / lsc

LSC engine
http://lsc-project.org/wiki/documentation/latest/start
Other
111 stars 42 forks source link

Unchanged numeric value gets always updated #281

Open pipoprods opened 7 months ago

pipoprods commented 7 months ago

I'm synchronising a LDAP to a MariaDB. The gosaMailQuota LDAP attribute goes to quota in MariaDB, which is a bigInt:

+----------------+------------+------+-----+---------+-------+
| Field          | Type       | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| quota          | bigint(20) | YES  |     | <null>  |       |
+----------------+------------+------+-----+---------+-------+

On the LSC side, the quota value is generated in a dataset:

<dataset>
        <name>quota</name>
        <policy>FORCE</policy>
        <forceValues>
                <string>srcBean.getDatasetFirstValueById("gosaMailQuota")</string>
        </forceValues>
</dataset>

and extracted from SQL request in SqlMap:

SELECT quota FORM table WHERE [...]

In this first version, the value gets updated even if the LDAP value matches the DB.

I've tried converting the value to a numeric type, behavior is the same:

To have LSC update the value only when it changes, I had to convert to string in SQL and compare with the value from LDAP:

<dataset>
        <name>quota</name>
        <policy>FORCE</policy>
        <forceValues>
                <string>srcBean.getDatasetFirstValueById("gosaMailQuota")</string>
        </forceValues>
</dataset>

and extracted from SQL request in SqlMap:

SELECT CONCAT('', quota) FORM table WHERE [...]
coudot commented 5 months ago

Your workaround is a good idea.

A test could be to declare gosaMailQuota as binary attribute in LDAP connection. This should prevent LSC to force the value to be casted as String.

pipoprods commented 5 months ago

Unfortunately, the behavior is still the same with attribute declared as binary:

<ldapConnection>
    <binaryAttributes>
        <string>gosaMailQuota</string>
    </binaryAttributes>
</ldapConnection>

Should I try and change something on the dataset side?

coudot commented 5 months ago

Yes please try also to use this in your dataset:

<dataset>
        <name>quota</name>
        <policy>FORCE</policy>
        <forceValues>
                <string>srcBean.getDatasetBinaryValuesById("gosaMailQuota")</string>
        </forceValues>
</dataset>

See https://lsc-project.org/javadoc/latest/org/lsc/beans/LscBean.html#getDatasetBinaryValuesById-java.lang.String-

pipoprods commented 5 months ago

It's completely breaking data insertion as the dataset produces binary data that doesn't match database type:

Error: 1366-22007: Incorrect integer value: '[B@3dc5e5ba' for column `quota` at row 3
coudot commented 5 months ago

My mistake, try getDatasetFirstBinaryValueById instead of getDatasetBinaryValuesById

I don't have any idea after this...

pipoprods commented 5 months ago

Insertion is working correctly, but records still get updated at each run. Thanks for the ideas :)