Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unchanged numeric value gets always updated #281

Open
pipoprods opened this issue Apr 18, 2024 · 6 comments
Open

Unchanged numeric value gets always updated #281

pipoprods opened this issue Apr 18, 2024 · 6 comments
Assignees
Labels

Comments

@pipoprods
Copy link

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:

  • <string>parseInt(srcBean.getDatasetFirstValueById("gosaMailQuota"), 10)</string>
  • <string>new java.math.BigInteger(srcBean.getDatasetFirstValueById("gosaMailQuota"))</string>

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 [...]
@soisik soisik self-assigned this Apr 18, 2024
@coudot
Copy link
Member

coudot commented May 28, 2024

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
Copy link
Author

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
Copy link
Member

coudot commented May 31, 2024

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
Copy link
Author

pipoprods commented May 31, 2024

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
Copy link
Member

coudot commented May 31, 2024

My mistake, try getDatasetFirstBinaryValueById instead of getDatasetBinaryValuesById

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

@pipoprods
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants