When we fail to read from the data source we should exit.
This is what we do when data_server::load() throws a std::string (ugh), but not if it throws something else or returns false.
data_server::load() will however return false if we fail to connect to LDAP, which leads to a sync with an empty object list.
Failure to connect should result in throwing std::runtime_error, and main should probably catch everything around the call to data_server::load (or both std::exception and std::string).
When we fail to read from the data source we should exit.
This is what we do when data_server::load() throws a std::string (ugh), but not if it throws something else or returns false.
data_server::load() will however return false if we fail to connect to LDAP, which leads to a sync with an empty object list.
Failure to connect should result in throwing std::runtime_error, and main should probably catch everything around the call to data_server::load (or both std::exception and std::string).