-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLoadPerson.cpp
More file actions
44 lines (36 loc) · 1.3 KB
/
Copy pathLoadPerson.cpp
File metadata and controls
44 lines (36 loc) · 1.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
struct DBParams {
string_view db_name;
int db_connection_timeout;
bool db_allow_exceptions;
DBLogLevel db_log_level;
};
struct PersonFilter {
int min_age;
int max_age;
string_view name_filter;
}
DBHandler DBHandlerBuilder(const DBParams& params) {
DBConnector connector(params.db_allow_exceptions, params.db_log_level);
if (params.db_name.starts_with("tmp."s)) {
return connector.ConnectTmp(params.db_name, params.db_connection_timeout);
} else {
return connector.Connect(params.db_name, params.db_connection_timeout);
}
}
optional<vector<Person>> LoadPersons(const DBParams& db_params, const PersonFilter person_filter) {
DBHandler db = move(DBHandlerBuilder(db_params));
if (!db_params.db_allow_exceptions && !db.IsOK()) {
return nullopt;
}
ostringstream query_str;
query_str << "from Persons "s
<< "select Name, Age "s
<< "where Age between "s << person_filter.min_age << " and "s << person_filter.max_age << " "s
<< "and Name like '%"s << db.Quote(person_filter.name_filter) << "%'"s;
DBQuery query(query_str.str());
vector<Person> persons;
for (auto [name, age] : db.LoadRows<string, int>(query)) {
persons.push_back({move(name), age});
}
return persons;
}