}
@JRubyMethod(name = {"wait_for_notify", "notifies_wait"}, optional = 1)
public IRubyObject wait_for_notify(ThreadContext context, IRubyObject[] args, Block block) {
try {
NotificationResponse notification = postgresqlConnection.waitForNotify();
if (block.isGiven()) {
if (block.arity() == Arity.NO_ARGUMENTS) return block.call(context);
RubyString condition = context.runtime.newString(notification.getCondition());
RubyFixnum pid = context.runtime.newFixnum(notification.getPid());
String javaPayload = notification.getPayload();
IRubyObject payload = javaPayload == null ? context.nil : context.runtime.newString(javaPayload);
if (!block.arity().isFixed()) {
return block.call(context, condition, pid, payload);
} else if (block.arity().required() == 2) {
return block.call(context, condition, pid);
} else if (block.arity().required() == 3) {
return block.call(context, condition, pid, payload);
}
throw context.runtime.newArgumentError("Expected a block with arity 2 or 3");
} else {
return context.runtime.newString(notification.getCondition());
}
} catch (IOException e) {
throw newPgError(context, e.getLocalizedMessage(), null, getClientEncodingAsJavaEncoding(context));
}
}