24 $res = $dbr->newSelectQueryBuilder()
25 ->select( [
'up_property',
'up_value' ] )
26 ->from(
'user_properties' )
27 ->where( [
'up_user' => $user->
getId() ] )
29 ->caller( __METHOD__ )->fetchResultSet();
32 foreach ( $res as $row ) {
33 $options[$row->up_property] = (string)$row->up_value;
36 $this->optionsFromDb[$user->
getId()] = $options;
41 $oldOptions = $this->optionsFromDb[ $user->
getId() ]
42 ?? $this->fetch( $user, \IDBAccessObject::READ_LATEST );
43 $newOptions = $oldOptions;
46 foreach ( $updates as $key => $value ) {
48 $value, $oldOptions[$key] ??
null )
51 if ( array_key_exists( $key, $oldOptions ) ) {
52 $keysToDelete[] = $key;
53 unset( $newOptions[$key] );
55 if ( $value !==
null ) {
56 $truncValue = mb_strcut( $value, 0,
59 'up_user' => $user->
getId(),
60 'up_property' => $key,
61 'up_value' => $truncValue,
63 $newOptions[$key] = $truncValue;
67 if ( !count( $keysToDelete ) && !count( $rowsToInsert ) ) {
73 $dbw = $this->dbProvider->getPrimaryDatabase();
74 if ( $keysToDelete ) {
75 $dbw->newDeleteQueryBuilder()
76 ->deleteFrom(
'user_properties' )
77 ->where( [
'up_user' => $user->
getId() ] )
78 ->andWhere( [
'up_property' => $keysToDelete ] )
79 ->caller( __METHOD__ )->execute();
81 if ( $rowsToInsert ) {
83 $dbw->newInsertQueryBuilder()
84 ->insertInto(
'user_properties' )
86 ->rows( $rowsToInsert )
87 ->caller( __METHOD__ )->execute();
91 $this->optionsFromDb[$user->
getId()] = $newOptions;