connection = PG::Connection.new(@db_hash)
- # There's also an "owner" field in the "shares" table, but it
- # contains a principal URL and not a bare username. Thus its
- # format depends on the CalDAV server configuration, and isn't
- # predictable.
- sql_query = 'SELECT username FROM prefs'
+ # There are also "owner" and "with" fields in the "shares" table,
+ # but they contains principal URLs and not a bare username. Thus
+ # their format depends on the CalDAV server configuration, and
+ # isn't predictable.
+ sql_query = 'SELECT username FROM prefs;'
begin
connection.query(sql_query) do |result|
# 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()])