Example #1
0
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;
	}
}
Example #2
0
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;
	}
}
Example #3
0
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;
	}
}
Example #4
0
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;
}