async Task <RescueTicket> CreateAsync(string user, RescueMode mode) { RescueTicket rescueTicket = null; using (DB db = await DB.CreateAsync(dbUrl)) { var sb = new StringBuilder(); foreach (var b in BitConverter.GetBytes(DateTime.Now.Ticks)) { sb.Append(b.ToString("X2")); } bool duplicate; int tryCount = 0; do { duplicate = false; rescueTicket = new RescueTicket { mode = mode, user_id = user, id = "ST-" + sb + StringExt.RandomSecureString(13), code = StringExt.RandomString(4, "0123456789") }; try { if (!await rescueTicket.SaveAsync(db)) { rescueTicket = null; } } catch (MySql.Data.MySqlClient.MySqlException e) { rescueTicket = null; // if the ticketId is already taken, try another duplicate = (e.Number == 1062); tryCount++; } }while (duplicate && (tryCount < 10)); if (rescueTicket == null) { throw new Exception("Ticket create fails. Impossible generate a ticketId"); } } return(rescueTicket); }
public async Task <RescueTicket> CreateRescueAsync(string user, RescueMode mode) { return(await CreateAsync(user, mode)); }