# Move the user *src* to *dst* within the Agendav database. This
# should "rename" him in _every_ table where he is referenced.
#
- # This can fail is *src* does not exist, or if *dst* already exists
- # before the move. It should also be an error if the destination
- # domain doesn't exist. But Agendav doesn't know about domains, so
- # we let that slide.
+ # This can fail if *dst* already exists before the move. It should
+ # also be an error if the destination domain doesn't exist. But
+ # Agendav doesn't know about domains, so we let that slide.
+ #
+ # If the source user doesn't exist, we do our best. AgenDAV has a
+ # "shares" table that isn't keyed on the username, but rather the
+ # principal URL. And its "prefs" table doesn't contain entries for
+ # users who have default preferences. As a result, we may need to
+ # perform some find/replaces in the "shares" table even if no
+ # corresponding user exists in the "prefs" table (which is how we
+ # tell if a user exists in AgenDAV). Thus it's not a fatal error if
+ # the *src* user doesn't exist.
#
# @param src [User] the source user to be moved.
#
# @param dst [User] the destination user being moved to.
#
def mv_user(src, dst)
- raise NonexistentUserError.new(src.to_s()) if not user_exists(src)
raise UserAlreadyExistsError.new(dst.to_s()) if user_exists(dst)
connection = PG::Connection.new(@db_hash)
begin
# The "prefs" table uses the normal username as a key...
+ # This should be harmless if the source user does not exist.
sql_query = 'UPDATE prefs SET username = $1 WHERE username = $2;'
connection.query(sql_query, [dst.to_s(), src.to_s()])