bool Connection::ping() { if (connected()) { error_message_.clear(); return driver_->ping(); } else { // Not connected, and we've forgotten everything we need in // order to re-connect, if we once were connected. build_error_message("ping database server"); return false; } }
bool Connection::shutdown() { error_message_.clear(); if (connected()) { if (driver_->shutdown()) { return true; } else { if (throw_exceptions()) { throw ConnectionFailed(error(), errnum()); } return false; } } else { build_error_message("shutdown database server"); if (throw_exceptions()) { throw ConnectionFailed(error_message_.c_str()); } return false; } }
bool Connection::select_db(const std::string& db) { error_message_.clear(); if (connected()) { if (driver_->select_db(db.c_str())) { return true; } else { if (throw_exceptions()) { throw DBSelectionFailed(error(), errnum()); } return false; } } else { build_error_message("select a database"); if (throw_exceptions()) { throw DBSelectionFailed(error_message_.c_str()); } return false; } }
static int pamtester_expr_parser_hdlr(pamtester_expr_parser_t *parser, pamtester_token_t token, const char *token_val, size_t token_val_len) { switch (token) { case PAMTESTER_TOKEN_NUMERIC: { int val; char *next_ptr; if (parser->last_token == PAMTESTER_TOKEN_NUMERIC) { parser->last_error = build_error_message("unexpected token", token_val, token_val_len); return 1; } val = strtol(token_val, &next_ptr, 10); if (next_ptr - token_val != token_val_len || errno == ERANGE || errno == EINVAL) { if (parser->const_resolve_hdlr == NULL || parser->const_resolve_hdlr(parser->hdlr_param, &val, token_val, token_val_len)) { parser->last_error = build_error_message("undefined constant", token_val, token_val_len); return 1; } } if (parser->last_token == PAMTESTER_TOKEN_NOT) { val = ~val; } parser->val_filo[parser->val_filo_idx] = val; parser->val_filo_idx++; } break; case PAMTESTER_TOKEN_NOT: break; case PAMTESTER_TOKEN_OR: { if (parser->last_token != PAMTESTER_TOKEN_NUMERIC) { parser->last_error = build_error_message("unexpected token", token_val, token_val_len); return 1; } if (parser->val_filo_idx >= 2 && parser->op_filo_idx > 0) { switch (parser->op_filo[parser->op_filo_idx - 1]) { case PAMTESTER_TOKEN_NULL: break; case PAMTESTER_TOKEN_OR: parser->op_filo_idx--; parser->val_filo[parser->val_filo_idx - 2] |= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; case PAMTESTER_TOKEN_XOR: parser->op_filo_idx--; parser->val_filo[parser->val_filo_idx - 2] ^= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; case PAMTESTER_TOKEN_AND: parser->op_filo_idx--; parser->val_filo[parser->val_filo_idx - 2] &= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; default: break; } } parser->op_filo[parser->op_filo_idx++] = token; } break; case PAMTESTER_TOKEN_XOR: { if (parser->last_token != PAMTESTER_TOKEN_NUMERIC) { parser->last_error = build_error_message("unexpected token", token_val, token_val_len); return 1; } if (parser->val_filo_idx >= 2 && parser->op_filo_idx > 0) { switch (parser->op_filo[parser->op_filo_idx - 1]) { case PAMTESTER_TOKEN_NULL: case PAMTESTER_TOKEN_OR: break; case PAMTESTER_TOKEN_AND: parser->op_filo_idx--; parser->val_filo[parser->val_filo_idx - 2] &= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; case PAMTESTER_TOKEN_XOR: parser->op_filo_idx--; parser->val_filo[parser->val_filo_idx - 2] ^= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; default: break; } } parser->op_filo[parser->op_filo_idx++] = token; } break; case PAMTESTER_TOKEN_AND: { if (parser->last_token != PAMTESTER_TOKEN_NUMERIC) { parser->last_error = build_error_message("unexpected token", token_val, token_val_len); return 1; } if (parser->val_filo_idx >= 2 && parser->op_filo_idx > 0) { switch (parser->op_filo[parser->op_filo_idx - 1]) { case PAMTESTER_TOKEN_NULL: case PAMTESTER_TOKEN_OR: case PAMTESTER_TOKEN_XOR: break; case PAMTESTER_TOKEN_AND: parser->op_filo_idx--; parser->val_filo[parser->val_filo_idx - 2] &= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; default: break; } } parser->op_filo[parser->op_filo_idx++] = token; } break; case PAMTESTER_TOKEN_NULL: { while (parser->val_filo_idx >= 2 && parser->op_filo_idx > 0) { switch (parser->op_filo[--parser->op_filo_idx]) { case PAMTESTER_TOKEN_OR: parser->val_filo[parser->val_filo_idx - 2] |= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; case PAMTESTER_TOKEN_XOR: parser->val_filo[parser->val_filo_idx - 2] ^= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; case PAMTESTER_TOKEN_AND: parser->val_filo[parser->val_filo_idx - 2] &= parser->val_filo[parser->val_filo_idx - 1]; parser->val_filo_idx--; break; default: break; } } if (parser->last_token == PAMTESTER_TOKEN_NULL) { parser->empty_result = 1; } else { parser->result = parser->val_filo[0]; } } break; default: break; } parser->last_token = token; return 0; }