1 5 package org.h2.test.bench; 6 7 import java.math.BigDecimal ; 8 import java.sql.PreparedStatement ; 9 import java.sql.ResultSet ; 10 import java.sql.Timestamp ; 11 import java.util.HashMap ; 12 13 public class BenchCThread { 14 15 private Database db; 16 private int warehouseId; 17 private int terminalId; 18 private HashMap prepared = new HashMap (); 19 private static final int OP_NEW_ORDER = 0, OP_PAYMENT = 1, 20 OP_ORDER_STATUS = 2, OP_DELIVERY = 3, 21 OP_STOCK_LEVEL = 4; 22 private static final BigDecimal ONE = new BigDecimal ("1"); 23 private BenchCRandom random; 24 private BenchC bench; 25 26 BenchCThread(Database db, BenchC bench, BenchCRandom random, int terminal) 27 throws Exception { 28 this.db = db; 29 this.bench = bench; 30 this.terminalId = terminal; 31 db.setAutoCommit(false); 32 this.random = random; 33 warehouseId = random.getInt(1, bench.warehouses); 34 } 35 36 void process() throws Exception { 37 int[] deck = new int[] { OP_NEW_ORDER, OP_NEW_ORDER, OP_NEW_ORDER, 38 OP_NEW_ORDER, OP_NEW_ORDER, OP_NEW_ORDER, OP_NEW_ORDER, 39 OP_NEW_ORDER, OP_NEW_ORDER, OP_NEW_ORDER, OP_PAYMENT, 40 OP_PAYMENT, OP_PAYMENT, OP_PAYMENT, OP_PAYMENT, OP_PAYMENT, 41 OP_PAYMENT, OP_PAYMENT, OP_PAYMENT, OP_PAYMENT, 42 OP_ORDER_STATUS, OP_DELIVERY, OP_STOCK_LEVEL }; 43 int len = deck.length; 44 for (int i = 0; i < len; i++) { 45 int temp = deck[i]; 46 int j = random.getInt(0, len); 47 deck[i] = deck[j]; 48 deck[j] = temp; 49 } 50 for (int i = 0; i < len; i++) { 51 int op = deck[i]; 52 switch (op) { 53 case OP_NEW_ORDER: 54 processNewOrder(); 55 break; 56 case OP_PAYMENT: 57 processPayment(); 58 break; 59 case OP_ORDER_STATUS: 60 processOrderStatus(); 61 break; 62 case OP_DELIVERY: 63 processDelivery(); 64 break; 65 case OP_STOCK_LEVEL: 66 processStockLevel(); 67 break; 68 default: 69 throw new Error ("op=" + op); 70 } 71 } 72 } 73 74 private void processNewOrder() throws Exception { 75 int d_id = random.getInt(1, bench.districtsPerWarehouse); 76 int c_id = random.getNonUniform(1023, 1, bench.customersPerDistrict); 77 int o_ol_cnt = random.getInt(5, 15); 78 boolean rollback = random.getInt(1, 100) == 1; 79 int[] supply_w_id = new int[o_ol_cnt]; 80 int[] item_id = new int[o_ol_cnt]; 81 int[] quantity = new int[o_ol_cnt]; 82 int o_all_local = 1; 83 for (int i = 0; i < o_ol_cnt; i++) { 84 int w; 85 if (bench.warehouses > 1 && random.getInt(1, 100) == 1) { 86 do { 87 w = random.getInt(1, bench.warehouses); 88 } while (w != warehouseId); 89 o_all_local = 0; 90 } else { 91 w = warehouseId; 92 } 93 supply_w_id[i] = w; 94 int item; 95 if (rollback && i == o_ol_cnt - 1) { 96 item = -1; 98 } else { 99 item = random.getNonUniform(8191, 1, bench.items); 100 } 101 item_id[i] = item; 102 quantity[i] = random.getInt(1, 10); 103 } 104 char[] bg = new char[o_ol_cnt]; 105 int[] stock = new int[o_ol_cnt]; 106 BigDecimal [] amt = new BigDecimal [o_ol_cnt]; 107 Timestamp datetime = new Timestamp (System.currentTimeMillis()); 108 PreparedStatement prep; 109 ResultSet rs; 110 111 prep = prepare("UPDATE DISTRICT SET D_NEXT_O_ID=D_NEXT_O_ID+1 " 112 + "WHERE D_ID=? AND D_W_ID=?"); 113 prep.setInt(1, d_id); 114 prep.setInt(2, warehouseId); 115 db.update(prep); 116 prep = prepare("SELECT D_NEXT_O_ID, D_TAX FROM DISTRICT " 117 + "WHERE D_ID=? AND D_W_ID=?"); 118 prep.setInt(1, d_id); 119 prep.setInt(2, warehouseId); 120 rs = db.query(prep); 121 rs.next(); 122 int o_id = rs.getInt(1) - 1; 123 BigDecimal d_tax = rs.getBigDecimal(2); 124 rs.close(); 125 prep = prepare("SELECT C_DISCOUNT, C_LAST, C_CREDIT, W_TAX " 131 + "FROM CUSTOMER, WAREHOUSE " 132 + "WHERE C_ID=? AND C_W_ID=? AND C_W_ID=W_ID AND C_D_ID=?"); 133 prep.setInt(1, c_id); 134 prep.setInt(2, warehouseId); 135 prep.setInt(3, d_id); 136 rs = db.query(prep); 137 rs.next(); 138 BigDecimal c_discount = rs.getBigDecimal(1); 139 rs.getString(2); rs.getString(3); BigDecimal w_tax = rs.getBigDecimal(4); 142 rs.close(); 143 BigDecimal total = new BigDecimal ("0"); 144 for (int ol_number = 1; ol_number <= o_ol_cnt; ol_number++) { 145 int ol_i_id = item_id[ol_number - 1]; 146 int ol_supply_w_id = supply_w_id[ol_number - 1]; 147 int ol_quantity = quantity[ol_number - 1]; 148 prep = prepare("SELECT I_PRICE, I_NAME, I_DATA " 149 + "FROM ITEM WHERE I_ID=?"); 150 prep.setInt(1, ol_i_id); 151 rs = db.query(prep); 152 if (!rs.next()) { 153 if (rollback) { 154 db.rollback(); 156 return; 157 } 158 throw new Exception ("item not found: " + ol_i_id + " " 159 + ol_supply_w_id); 160 } 161 BigDecimal i_price = rs.getBigDecimal(1); 162 rs.getString(2); String i_data = rs.getString(3); 164 rs.close(); 165 prep = prepare("SELECT S_QUANTITY, S_DATA, " 166 + "S_DIST_01, S_DIST_02, S_DIST_03, S_DIST_04, S_DIST_05, " 167 + "S_DIST_06, S_DIST_07, S_DIST_08, S_DIST_09, S_DIST_10 " 168 + "FROM STOCK WHERE S_I_ID=? AND S_W_ID=?"); 169 prep.setInt(1, ol_i_id); 170 prep.setInt(2, ol_supply_w_id); 171 rs = db.query(prep); 172 if (!rs.next()) { 173 if (rollback) { 174 db.rollback(); 176 return; 177 } 178 throw new Exception ("item not found: " + ol_i_id + " " 179 + ol_supply_w_id); 180 } 181 int s_quantity = rs.getInt(1); 182 String s_data = rs.getString(2); 183 String [] s_dist = new String [10]; 184 for (int i = 0; i < 10; i++) { 185 s_dist[i] = rs.getString(3 + i); 186 } 187 rs.close(); 188 String ol_dist_info = s_dist[d_id - 1]; 189 stock[ol_number - 1] = s_quantity; 190 if ((i_data.indexOf("original") != -1) 191 && (s_data.indexOf("original") != -1)) { 192 bg[ol_number - 1] = 'B'; 193 } else { 194 bg[ol_number - 1] = 'G'; 195 } 196 if (s_quantity > ol_quantity) { 197 s_quantity = s_quantity - ol_quantity; 198 } else { 199 s_quantity = s_quantity - ol_quantity + 91; 200 } 201 prep = prepare("UPDATE STOCK SET S_QUANTITY=? " 202 + "WHERE S_W_ID=? AND S_I_ID=?"); 203 prep.setInt(1, s_quantity); 204 prep.setInt(2, ol_supply_w_id); 205 prep.setInt(3, ol_i_id); 206 db.update(prep); 207 BigDecimal ol_amount = new BigDecimal (ol_quantity).multiply( 208 i_price).multiply(ONE.add(w_tax).add(d_tax)).multiply( 209 ONE.subtract(c_discount)); 210 ol_amount = ol_amount.setScale(2, BigDecimal.ROUND_HALF_UP); 211 amt[ol_number - 1] = ol_amount; 212 total = total.add(ol_amount); 213 prep = prepare("INSERT INTO ORDER_LINE (OL_O_ID, OL_D_ID, OL_W_ID, OL_NUMBER, " 214 + "OL_I_ID, OL_SUPPLY_W_ID, " 215 + "OL_QUANTITY, OL_AMOUNT, OL_DIST_INFO) " 216 + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); 217 prep.setInt(1, o_id); 218 prep.setInt(2, d_id); 219 prep.setInt(3, warehouseId); 220 prep.setInt(4, ol_number); 221 prep.setInt(5, ol_i_id); 222 prep.setInt(6, ol_supply_w_id); 223 prep.setInt(7, ol_quantity); 224 prep.setBigDecimal(8, ol_amount); 225 prep.setString(9, ol_dist_info); 226 db.update(prep); 227 } 228 prep = prepare("INSERT INTO ORDERS (O_ID, O_D_ID, O_W_ID, O_C_ID, " 229 + "O_ENTRY_D, O_OL_CNT, O_ALL_LOCAL) " 230 + "VALUES (?, ?, ?, ?, ?, ?, ?)"); 231 prep.setInt(1, o_id); 232 prep.setInt(2, d_id); 233 prep.setInt(3, warehouseId); 234 prep.setInt(4, c_id); 235 prep.setTimestamp(5, datetime); 236 prep.setInt(6, o_ol_cnt); 237 prep.setInt(7, o_all_local); 238 db.update(prep); 239 prep = prepare("INSERT INTO NEW_ORDER (NO_O_ID, NO_D_ID, NO_W_ID) " 240 + "VALUES (?, ?, ?)"); 241 prep.setInt(1, o_id); 242 prep.setInt(2, d_id); 243 prep.setInt(3, warehouseId); 244 db.update(prep); 245 db.commit(); 246 } 247 248 private void processPayment() throws Exception { 249 int d_id = random.getInt(1, bench.districtsPerWarehouse); 250 int c_w_id, c_d_id; 251 if (bench.warehouses > 1 && random.getInt(1, 100) <= 15) { 252 do { 253 c_w_id = random.getInt(1, bench.warehouses); 254 } while (c_w_id != warehouseId); 255 c_d_id = random.getInt(1, bench.districtsPerWarehouse); 256 } else { 257 c_w_id = warehouseId; 258 c_d_id = d_id; 259 } 260 boolean byname; 261 String c_last; 262 int c_id = 1; 263 if (random.getInt(1, 100) <= 60) { 264 byname = true; 265 c_last = random.getLastname(random.getNonUniform(255, 0, 999)); 266 } else { 267 byname = false; 268 c_last = ""; 269 c_id = random.getNonUniform(1023, 1, bench.customersPerDistrict); 270 } 271 BigDecimal h_amount = random.getBigDecimal(random.getInt(100, 500000), 272 2); 273 Timestamp datetime = new Timestamp (System.currentTimeMillis()); 274 PreparedStatement prep; 275 ResultSet rs; 276 277 prep = prepare("UPDATE DISTRICT SET D_YTD = D_YTD+? " 278 + "WHERE D_ID=? AND D_W_ID=?"); 279 prep.setBigDecimal(1, h_amount); 280 prep.setInt(2, d_id); 281 prep.setInt(3, warehouseId); 282 db.update(prep); 283 prep = prepare("UPDATE WAREHOUSE SET W_YTD=W_YTD+? WHERE W_ID=?"); 284 prep.setBigDecimal(1, h_amount); 285 prep.setInt(2, warehouseId); 286 db.update(prep); 287 prep = prepare("SELECT W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP, W_NAME " 288 + "FROM WAREHOUSE WHERE W_ID=?"); 289 prep.setInt(1, warehouseId); 290 rs = db.query(prep); 291 rs.next(); 292 rs.getString(1); rs.getString(2); rs.getString(3); rs.getString(4); rs.getString(5); String w_name = rs.getString(6); 298 rs.close(); 299 prep = prepare("SELECT D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP, D_NAME " 300 + "FROM DISTRICT WHERE D_ID=? AND D_W_ID=?"); 301 prep.setInt(1, d_id); 302 prep.setInt(2, warehouseId); 303 rs = db.query(prep); 304 rs.next(); 305 rs.getString(1); rs.getString(2); rs.getString(3); rs.getString(4); rs.getString(5); String d_name = rs.getString(6); 311 rs.close(); 312 BigDecimal c_balance; 313 String c_credit; 314 if (byname) { 315 prep = prepare("SELECT COUNT(C_ID) FROM CUSTOMER " 316 + "WHERE C_LAST=? AND C_D_ID=? AND C_W_ID=?"); 317 prep.setString(1, c_last); 318 prep.setInt(2, c_d_id); 319 prep.setInt(3, c_w_id); 320 rs = db.query(prep); 321 rs.next(); 322 int namecnt = rs.getInt(1); 323 rs.close(); 324 if (namecnt == 0) { 325 db.rollback(); 327 return; 328 } 329 prep = prepare("SELECT C_FIRST, C_MIDDLE, C_ID, " 330 + "C_STREET_1, C_STREET_2, C_CITY, C_STATE, C_ZIP, " 331 + "C_PHONE, C_CREDIT, C_CREDIT_LIM, " 332 + "C_DISCOUNT, C_BALANCE, C_SINCE FROM CUSTOMER " 333 + "WHERE C_LAST=? AND C_D_ID=? AND C_W_ID=? " 334 + "ORDER BY C_FIRST"); 335 prep.setString(1, c_last); 336 prep.setInt(2, c_d_id); 337 prep.setInt(3, c_w_id); 338 rs = db.query(prep); 339 if (namecnt % 2 != 0) { 341 namecnt++; 342 } 343 for (int n = 0; n < namecnt / 2; n++) { 344 rs.next(); 345 } 346 rs.getString(1); rs.getString(2); c_id = rs.getInt(3); 349 rs.getString(4); rs.getString(5); rs.getString(6); rs.getString(7); rs.getString(8); rs.getString(9); c_credit = rs.getString(10); 356 rs.getString(11); rs.getBigDecimal(12); c_balance = rs.getBigDecimal(13); 359 rs.getTimestamp(14); rs.close(); 361 } else { 362 prep = prepare("SELECT C_FIRST, C_MIDDLE, C_LAST, " 363 + "C_STREET_1, C_STREET_2, C_CITY, C_STATE, C_ZIP, " 364 + "C_PHONE, C_CREDIT, C_CREDIT_LIM, " 365 + "C_DISCOUNT, C_BALANCE, C_SINCE FROM CUSTOMER " 366 + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?"); 367 prep.setInt(1, c_id); 368 prep.setInt(2, c_d_id); 369 prep.setInt(3, c_w_id); 370 rs = db.query(prep); 371 rs.next(); 372 rs.getString(1); rs.getString(2); rs.getString(3); rs.getString(4); rs.getString(5); rs.getString(6); rs.getString(7); rs.getString(8); rs.getString(9); c_credit = rs.getString(10); 382 rs.getString(11); rs.getBigDecimal(12); c_balance = rs.getBigDecimal(13); 385 rs.getTimestamp(14); rs.close(); 387 } 388 c_balance = c_balance.add(h_amount); 389 if (c_credit.equals("BC")) { 390 prep = prepare("SELECT C_DATA INTO FROM CUSTOMER " 391 + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?"); 392 prep.setInt(1, c_id); 393 prep.setInt(2, c_d_id); 394 prep.setInt(3, c_w_id); 395 rs = db.query(prep); 396 rs.next(); 397 String c_data = rs.getString(1); 398 rs.close(); 399 String c_new_data = "| " + c_id + " " + c_d_id + " " + c_w_id 400 + " " + d_id + " " + warehouseId + " " + h_amount + " " 401 + c_data; 402 if (c_new_data.length() > 500) { 403 c_new_data = c_new_data.substring(0, 500); 404 } 405 prep = prepare("UPDATE CUSTOMER SET C_BALANCE=?, C_DATA=? " 406 + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?"); 407 prep.setBigDecimal(1, c_balance); 408 prep.setString(2, c_new_data); 409 prep.setInt(3, c_id); 410 prep.setInt(4, c_d_id); 411 prep.setInt(5, c_w_id); 412 db.update(prep); 413 } else { 414 prep = prepare("UPDATE CUSTOMER SET C_BALANCE=? " 415 + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?"); 416 prep.setBigDecimal(1, c_balance); 417 prep.setInt(2, c_id); 418 prep.setInt(3, c_d_id); 419 prep.setInt(4, c_w_id); 420 db.update(prep); 421 } 422 String h_data = w_name + " " + d_name; 425 prep = prepare("INSERT INTO HISTORY (H_C_D_ID, H_C_W_ID, H_C_ID, H_D_ID, " 426 + "H_W_ID, H_DATE, H_AMOUNT, H_DATA) " 427 + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); 428 prep.setInt(1, c_d_id); 429 prep.setInt(2, c_w_id); 430 prep.setInt(3, c_id); 431 prep.setInt(4, d_id); 432 prep.setInt(5, warehouseId); 433 prep.setTimestamp(6, datetime); 434 prep.setBigDecimal(7, h_amount); 435 prep.setString(8, h_data); 436 db.update(prep); 437 db.commit(); 438 } 439 440 private void processOrderStatus() throws Exception { 441 int d_id = random.getInt(1, bench.districtsPerWarehouse); 442 boolean byname; 443 String c_last = null; 444 int c_id = -1; 445 if (random.getInt(1, 100) <= 60) { 446 byname = true; 447 c_last = random.getLastname(random.getNonUniform(255, 0, 999)); 448 } else { 449 byname = false; 450 c_id = random.getNonUniform(1023, 1, bench.customersPerDistrict); 451 } 452 PreparedStatement prep; 453 ResultSet rs; 454 455 prep = prepare("UPDATE DISTRICT SET D_NEXT_O_ID=-1 WHERE D_ID=-1"); 456 db.update(prep); 457 if (byname) { 458 prep = prepare("SELECT COUNT(C_ID) FROM CUSTOMER " 459 + "WHERE C_LAST=? AND C_D_ID=? AND C_W_ID=?"); 460 prep.setString(1, c_last); 461 prep.setInt(2, d_id); 462 prep.setInt(3, warehouseId); 463 rs = db.query(prep); 464 rs.next(); 465 int namecnt = rs.getInt(1); 466 rs.close(); 467 if (namecnt == 0) { 468 db.rollback(); 470 return; 471 } 472 prep = prepare("SELECT C_BALANCE, C_FIRST, C_MIDDLE, C_ID " 473 + "FROM CUSTOMER " 474 + "WHERE C_LAST=? AND C_D_ID=? AND C_W_ID=? " 475 + "ORDER BY C_FIRST"); 476 prep.setString(1, c_last); 477 prep.setInt(2, d_id); 478 prep.setInt(3, warehouseId); 479 rs = db.query(prep); 480 if (namecnt % 2 != 0) { 481 namecnt++; 482 } 483 for (int n = 0; n < namecnt / 2; n++) { 484 rs.next(); 485 } 486 rs.getBigDecimal(1); rs.getString(2); rs.getString(3); rs.close(); 490 } else { 491 prep = prepare("SELECT C_BALANCE, C_FIRST, C_MIDDLE, C_LAST " 492 + "FROM CUSTOMER " 493 + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?"); 494 prep.setInt(1, c_id); 495 prep.setInt(2, d_id); 496 prep.setInt(3, warehouseId); 497 rs = db.query(prep); 498 rs.next(); 499 rs.getBigDecimal(1); rs.getString(2); rs.getString(3); rs.getString(4); rs.close(); 504 } 505 prep = prepare("SELECT MAX(O_ID) " 506 + "FROM ORDERS WHERE O_C_ID=? AND O_D_ID=? AND O_W_ID=?"); 507 prep.setInt(1, c_id); 508 prep.setInt(2, d_id); 509 prep.setInt(3, warehouseId); 510 rs = db.query(prep); 511 int o_id = -1; 512 if (rs.next()) { 513 o_id = rs.getInt(1); 514 if (rs.wasNull()) { 515 o_id = -1; 516 } 517 } 518 rs.close(); 519 if (o_id != -1) { 520 prep = prepare("SELECT O_ID, O_CARRIER_ID, O_ENTRY_D " 521 + "FROM ORDERS WHERE O_ID=?"); 522 prep.setInt(1, o_id); 523 rs = db.query(prep); 524 rs.next(); 525 o_id = rs.getInt(1); 526 rs.getInt(2); rs.getTimestamp(3); rs.close(); 529 prep = prepare("SELECT OL_I_ID, OL_SUPPLY_W_ID, OL_QUANTITY, " 530 + "OL_AMOUNT, OL_DELIVERY_D FROM ORDER_LINE " 531 + "WHERE OL_O_ID=? AND OL_D_ID=? AND OL_W_ID=?"); 532 prep.setInt(1, o_id); 533 prep.setInt(2, d_id); 534 prep.setInt(3, warehouseId); 535 rs = db.query(prep); 536 while (rs.next()) { 537 rs.getInt(1); rs.getInt(2); rs.getInt(3); rs.getBigDecimal(4); rs.getTimestamp(5); } 543 rs.close(); 544 } 545 db.commit(); 546 } 547 548 private void processDelivery() throws Exception { 549 int o_carrier_id = random.getInt(1, 10); 550 Timestamp datetime = new Timestamp (System.currentTimeMillis()); 551 PreparedStatement prep; 552 ResultSet rs; 553 554 prep = prepare("UPDATE DISTRICT SET D_NEXT_O_ID=-1 WHERE D_ID=-1"); 555 db.update(prep); 556 for (int d_id = 1; d_id <= bench.districtsPerWarehouse; d_id++) { 557 prep = prepare("SELECT MIN(NO_O_ID) FROM NEW_ORDER " 558 + "WHERE NO_D_ID=? AND NO_W_ID=?"); 559 prep.setInt(1, d_id); 560 prep.setInt(2, warehouseId); 561 rs = db.query(prep); 562 int no_o_id = -1; 563 if (rs.next()) { 564 no_o_id = rs.getInt(1); 565 if (rs.wasNull()) { 566 no_o_id = -1; 567 } 568 } 569 rs.close(); 570 if (no_o_id != -1) { 571 prep = prepare("DELETE FROM NEW_ORDER " 572 + "WHERE NO_O_ID=? AND NO_D_ID=? AND NO_W_ID=?"); 573 prep.setInt(1, no_o_id); 574 prep.setInt(2, d_id); 575 prep.setInt(3, warehouseId); 576 db.update(prep); 577 prep = prepare("SELECT O_C_ID FROM ORDERS " 578 + "WHERE O_ID=? AND O_D_ID=? AND O_W_ID=?"); 579 prep.setInt(1, no_o_id); 580 prep.setInt(2, d_id); 581 prep.setInt(3, warehouseId); 582 rs = db.query(prep); 583 rs.next(); 584 rs.getInt(1); rs.close(); 586 prep = prepare("UPDATE ORDERS SET O_CARRIER_ID=? " 587 + "WHERE O_ID=? AND O_D_ID=? AND O_W_ID=?"); 588 prep.setInt(1, o_carrier_id); 589 prep.setInt(2, no_o_id); 590 prep.setInt(3, d_id); 591 prep.setInt(4, warehouseId); 592 db.update(prep); 593 prep = prepare("UPDATE ORDER_LINE SET OL_DELIVERY_D=? " 594 + "WHERE OL_O_ID=? AND OL_D_ID=? AND OL_W_ID=?"); 595 prep.setTimestamp(1, datetime); 596 prep.setInt(2, no_o_id); 597 prep.setInt(3, d_id); 598 prep.setInt(4, warehouseId); 599 db.update(prep); 600 prep = prepare("SELECT SUM(OL_AMOUNT) FROM ORDER_LINE " 601 + "WHERE OL_O_ID=? AND OL_D_ID=? AND OL_W_ID=?"); 602 prep.setInt(1, no_o_id); 603 prep.setInt(2, d_id); 604 prep.setInt(3, warehouseId); 605 rs = db.query(prep); 606 rs.next(); 607 BigDecimal ol_amount = rs.getBigDecimal(1); 608 rs.close(); 609 prep = prepare("UPDATE CUSTOMER SET C_BALANCE=C_BALANCE+? " 610 + "WHERE C_ID=? AND C_D_ID=? AND C_W_ID=?"); 611 prep.setBigDecimal(1, ol_amount); 612 prep.setInt(2, no_o_id); 613 prep.setInt(3, d_id); 614 prep.setInt(4, warehouseId); 615 db.update(prep); 616 } 617 } 618 db.commit(); 619 } 620 621 private void processStockLevel() throws Exception { 622 int d_id = (terminalId % bench.districtsPerWarehouse) + 1; 623 int threshold = random.getInt(10, 20); 624 PreparedStatement prep; 625 ResultSet rs; 626 627 prep = prepare("UPDATE DISTRICT SET D_NEXT_O_ID=-1 WHERE D_ID=-1"); 628 db.update(prep); 629 630 prep = prepare("SELECT D_NEXT_O_ID FROM DISTRICT " 631 + "WHERE D_ID=? AND D_W_ID=?"); 632 prep.setInt(1, d_id); 633 prep.setInt(2, warehouseId); 634 rs = db.query(prep); 635 rs.next(); 636 int o_id = rs.getInt(1); 637 rs.close(); 638 prep = prepare("SELECT COUNT(DISTINCT S_I_ID) " 648 + "FROM ORDER_LINE, STOCK WHERE OL_W_ID=? AND " 649 + "OL_D_ID=? AND OL_O_ID<? AND " 650 + "OL_O_ID>=? AND S_W_ID=? AND " 651 + "S_I_ID=OL_I_ID AND S_QUANTITY<?"); 652 prep.setInt(1, warehouseId); 653 prep.setInt(2, d_id); 654 prep.setInt(3, o_id); 655 prep.setInt(4, o_id-20); 656 prep.setInt(5, warehouseId); 657 prep.setInt(6, threshold); 658 rs = db.query(prep); 660 rs.next(); 661 rs.getInt(1); rs.close(); 663 db.commit(); 664 } 665 666 private PreparedStatement prepare(String sql) throws Exception { 667 PreparedStatement prep = (PreparedStatement ) prepared.get(sql); 668 if (prep == null) { 669 prep = db.prepare(sql); 670 prepared.put(sql, prep); 671 } 672 return prep; 673 } 674 675 } 676 | Popular Tags |