25 if ( !$user->getId() ) {
29 $dbr = DBAccessObjectUtils::getDBFromRecency( $this->dbProvider, $recency );
30 $res = $dbr->newSelectQueryBuilder()
31 ->select( [
'up_property',
'up_value' ] )
32 ->from(
'user_properties' )
33 ->where( [
'up_user' => $user->getId() ] )
35 ->caller( __METHOD__ )->fetchResultSet();
38 foreach ( $res as $row ) {
39 $options[$row->up_property] = (string)$row->up_value;
42 $this->optionsFromDb[$user->getId()] = $options;
47 if ( !$keys || !$userNames ) {
52 $res = $this->dbProvider->getReplicaDatabase()
53 ->newSelectQueryBuilder()
54 ->select( [
'user_name',
'up_property',
'up_value' ] )
55 ->from(
'user_properties' )
56 ->join(
'user',
null,
'user_id=up_user' )
58 'up_property' => $keys,
59 'user_name' => $userNames
61 ->caller( __METHOD__ )
63 foreach ( $res as $row ) {
64 $options[$row->up_property][$row->user_name] = (string)$row->up_value;
71 if ( !$user->
getId() ) {
75 $oldOptions = $this->optionsFromDb[ $user->
getId() ]
76 ?? $this->fetch( $user, IDBAccessObject::READ_LATEST );
77 $newOptions = $oldOptions;
80 foreach ( $updates as $key => $value ) {
82 $value, $oldOptions[$key] ??
null )
85 if ( array_key_exists( $key, $oldOptions ) ) {
86 $keysToDelete[] = $key;
87 unset( $newOptions[$key] );
89 if ( $value !==
null ) {
90 $truncValue = mb_strcut( $value, 0,
93 'up_user' => $user->
getId(),
94 'up_property' => $key,
95 'up_value' => $truncValue,
97 $newOptions[$key] = $truncValue;
101 if ( !count( $keysToDelete ) && !count( $rowsToInsert ) ) {
107 $dbw = $this->dbProvider->getPrimaryDatabase();
108 if ( $keysToDelete ) {
109 $dbw->newDeleteQueryBuilder()
110 ->deleteFrom(
'user_properties' )
111 ->where( [
'up_user' => $user->
getId() ] )
112 ->andWhere( [
'up_property' => $keysToDelete ] )
113 ->caller( __METHOD__ )->execute();
115 if ( $rowsToInsert ) {
117 $dbw->newInsertQueryBuilder()
118 ->insertInto(
'user_properties' )
120 ->rows( $rowsToInsert )
121 ->caller( __METHOD__ )->execute();
125 $this->optionsFromDb[$user->
getId()] = $newOptions;