import org.vertx.java.core.json.JsonObject; //导入方法依赖的package包/类
@Override
public void updatePeriodicBooking(final String resourceId, final String bookingId, final String selectedDays,
final int firstSelectedDay, final JsonObject data, final UserInfos user,
final Handler> handler) {
final long endDate = data.getLong("periodic_end_date", 0L);
final int occurrences = data.getInteger("occurrences", 0);
SqlStatementsBuilder statementsBuilder = new SqlStatementsBuilder();
Object rId = parseId(resourceId);
Object bId = parseId(bookingId);
// 1. Lock query to avoid race condition
statementsBuilder.raw(LOCK_BOOKING_QUERY);
// 2. Update parent booking
StringBuilder parentQuery = new StringBuilder();
JsonArray parentValues = new JsonArray();
parentQuery.append("UPDATE rbs.booking")
.append(" SET booking_reason = ?, start_date = to_timestamp(?), end_date = to_timestamp(?),");
parentValues.add(data.getString("booking_reason"))
.add(data.getLong("start_date"))
.add(endDate>0L ? endDate : null); // the null value will be replaced by the last slot's end date
final int endDateIndex = parentValues.size() - 1;
parentQuery.append(" periodicity = ?, occurrences = ?, modified = NOW(),");
parentValues.add(data.getInteger("periodicity"))
.add(occurrences!=0 ? occurrences : null);
parentQuery.append(" days = B'")
.append(selectedDays)
.append("' WHERE resource_id = ?")
.append(" AND id = ?")
.append(" AND is_periodic = ?");
parentValues.add(rId)
.add(bId)
.add(true);
// 3. Delete child bookings
String deleteQuery = "DELETE FROM rbs.booking WHERE parent_booking_id = ?";
// 4. Create new child bookings
StringBuilder insertQuery = new StringBuilder();
JsonArray insertValues = new JsonArray();
final long lastSlotEndDate = appendInsertChildBookingsQuery(insertQuery, insertValues, rId,
selectedDays, firstSelectedDay, data, user, bId);
// Update end_date value in JsonArray parentValues
if (endDate <= 0L) {
parentValues = getValuesWithProperEndDate(parentValues, lastSlotEndDate, endDateIndex);
}
// Add queries to SqlStatementsBuilder
statementsBuilder.prepared(parentQuery.toString(), parentValues);
statementsBuilder.prepared(deleteQuery, new JsonArray().add(bId));
statementsBuilder.prepared(insertQuery.toString(), insertValues);
// Send queries to event bus
Sql.getInstance().transaction(statementsBuilder.build(), validResultHandler(3, handler));
}