143 lines
5.9 KiB
C++
143 lines
5.9 KiB
C++
/*
|
|
* Legal Notice
|
|
*
|
|
* This document and associated source code (the "Work") is a part of a
|
|
* benchmark specification maintained by the TPC.
|
|
*
|
|
* The TPC reserves all right, title, and interest to the Work as provided
|
|
* under U.S. and international laws, including without limitation all patent
|
|
* and trademark rights therein.
|
|
*
|
|
* No Warranty
|
|
*
|
|
* 1.1 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE INFORMATION
|
|
* CONTAINED HEREIN IS PROVIDED "AS IS" AND WITH ALL FAULTS, AND THE
|
|
* AUTHORS AND DEVELOPERS OF THE WORK HEREBY DISCLAIM ALL OTHER
|
|
* WARRANTIES AND CONDITIONS, EITHER EXPRESS, IMPLIED OR STATUTORY,
|
|
* INCLUDING, BUT NOT LIMITED TO, ANY (IF ANY) IMPLIED WARRANTIES,
|
|
* DUTIES OR CONDITIONS OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
|
|
* PURPOSE, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF RESULTS, OF
|
|
* WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF NEGLIGENCE.
|
|
* ALSO, THERE IS NO WARRANTY OR CONDITION OF TITLE, QUIET ENJOYMENT,
|
|
* QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT
|
|
* WITH REGARD TO THE WORK.
|
|
* 1.2 IN NO EVENT WILL ANY AUTHOR OR DEVELOPER OF THE WORK BE LIABLE TO
|
|
* ANY OTHER PARTY FOR ANY DAMAGES, INCLUDING BUT NOT LIMITED TO THE
|
|
* COST OF PROCURING SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS
|
|
* OF USE, LOSS OF DATA, OR ANY INCIDENTAL, CONSEQUENTIAL, DIRECT,
|
|
* INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER CONTRACT, TORT, WARRANTY,
|
|
* OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY OTHER AGREEMENT
|
|
* RELATING TO THE WORK, WHETHER OR NOT SUCH AUTHOR OR DEVELOPER HAD
|
|
* ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
*
|
|
* Contributors
|
|
* - Sergey Vasilevskiy
|
|
*/
|
|
|
|
/*
|
|
* Customer Position transaction class.
|
|
*
|
|
*/
|
|
#ifndef TXN_HARNESS_CUSTOMER_POSITION_H
|
|
#define TXN_HARNESS_CUSTOMER_POSITION_H
|
|
|
|
#include "TxnHarnessDBInterface.h"
|
|
|
|
namespace TPCE {
|
|
|
|
class CCustomerPosition {
|
|
CCustomerPositionDBInterface *m_db;
|
|
|
|
public:
|
|
CCustomerPosition(CCustomerPositionDBInterface *pDB) : m_db(pDB){};
|
|
|
|
void DoTxn(PCustomerPositionTxnInput pTxnInput, PCustomerPositionTxnOutput pTxnOutput) {
|
|
// Initialization
|
|
TCustomerPositionFrame1Input Frame1Input;
|
|
TCustomerPositionFrame1Output Frame1Output;
|
|
TCustomerPositionFrame2Input Frame2Input;
|
|
TCustomerPositionFrame2Output Frame2Output;
|
|
|
|
TXN_HARNESS_SET_STATUS_SUCCESS;
|
|
|
|
// Copy Frame 1 Input
|
|
Frame1Input.cust_id = pTxnInput->cust_id;
|
|
strncpy(Frame1Input.tax_id, pTxnInput->tax_id, sizeof(Frame1Input.tax_id));
|
|
|
|
// Execute Frame 1
|
|
m_db->DoCustomerPositionFrame1(&Frame1Input, &Frame1Output);
|
|
|
|
// Validate Frame 1 Output
|
|
if ((Frame1Output.acct_len < 1) || (Frame1Output.acct_len > max_acct_len)) {
|
|
TXN_HARNESS_PROPAGATE_STATUS(CBaseTxnErr::CPF1_ERROR1);
|
|
}
|
|
|
|
// Copy Frame 1 Output
|
|
pTxnOutput->acct_len = Frame1Output.acct_len;
|
|
pTxnOutput->c_ad_id = Frame1Output.c_ad_id;
|
|
strncpy(pTxnOutput->c_area_1, Frame1Output.c_area_1, sizeof(pTxnOutput->c_area_1));
|
|
strncpy(pTxnOutput->c_area_2, Frame1Output.c_area_2, sizeof(pTxnOutput->c_area_2));
|
|
strncpy(pTxnOutput->c_area_3, Frame1Output.c_area_3, sizeof(pTxnOutput->c_area_3));
|
|
strncpy(pTxnOutput->c_ctry_1, Frame1Output.c_ctry_1, sizeof(pTxnOutput->c_ctry_1));
|
|
strncpy(pTxnOutput->c_ctry_2, Frame1Output.c_ctry_2, sizeof(pTxnOutput->c_ctry_2));
|
|
strncpy(pTxnOutput->c_ctry_3, Frame1Output.c_ctry_3, sizeof(pTxnOutput->c_ctry_3));
|
|
pTxnOutput->c_dob = Frame1Output.c_dob;
|
|
strncpy(pTxnOutput->c_email_1, Frame1Output.c_email_1, sizeof(pTxnOutput->c_email_1));
|
|
strncpy(pTxnOutput->c_email_2, Frame1Output.c_email_2, sizeof(pTxnOutput->c_email_2));
|
|
strncpy(pTxnOutput->c_ext_1, Frame1Output.c_ext_1, sizeof(pTxnOutput->c_ext_1));
|
|
strncpy(pTxnOutput->c_ext_2, Frame1Output.c_ext_2, sizeof(pTxnOutput->c_ext_2));
|
|
strncpy(pTxnOutput->c_ext_3, Frame1Output.c_ext_3, sizeof(pTxnOutput->c_ext_3));
|
|
strncpy(pTxnOutput->c_f_name, Frame1Output.c_f_name, sizeof(pTxnOutput->c_f_name));
|
|
strncpy(pTxnOutput->c_gndr, Frame1Output.c_gndr, sizeof(pTxnOutput->c_gndr));
|
|
strncpy(pTxnOutput->c_l_name, Frame1Output.c_l_name, sizeof(pTxnOutput->c_l_name));
|
|
strncpy(pTxnOutput->c_local_1, Frame1Output.c_local_1, sizeof(pTxnOutput->c_local_1));
|
|
strncpy(pTxnOutput->c_local_2, Frame1Output.c_local_2, sizeof(pTxnOutput->c_local_2));
|
|
strncpy(pTxnOutput->c_local_3, Frame1Output.c_local_3, sizeof(pTxnOutput->c_local_3));
|
|
strncpy(pTxnOutput->c_m_name, Frame1Output.c_m_name, sizeof(pTxnOutput->c_m_name));
|
|
strncpy(pTxnOutput->c_st_id, Frame1Output.c_st_id, sizeof(pTxnOutput->c_st_id));
|
|
pTxnOutput->c_tier = Frame1Output.c_tier;
|
|
// pTxnOutput->cust_id = Frame1Output.cust_id;
|
|
|
|
for (int i = 0; i < Frame1Output.acct_len && i < max_acct_len; i++) {
|
|
pTxnOutput->acct_id[i] = Frame1Output.acct_id[i];
|
|
pTxnOutput->asset_total[i] = Frame1Output.asset_total[i];
|
|
pTxnOutput->cash_bal[i] = Frame1Output.cash_bal[i];
|
|
}
|
|
|
|
TXN_HARNESS_EARLY_EXIT_ON_ERROR;
|
|
|
|
if (pTxnInput->get_history) {
|
|
// Copy Frame 2 Input
|
|
Frame2Input.acct_id = Frame1Output.acct_id[pTxnInput->acct_id_idx];
|
|
|
|
// Execute Frame 2
|
|
m_db->DoCustomerPositionFrame2(&Frame2Input, &Frame2Output);
|
|
|
|
// Validate Frame 2 Output
|
|
if ((Frame2Output.hist_len < min_hist_len) || (Frame2Output.hist_len > max_hist_len)) {
|
|
TXN_HARNESS_PROPAGATE_STATUS(CBaseTxnErr::CPF2_ERROR1);
|
|
}
|
|
|
|
// Copy Frame 2 Output
|
|
pTxnOutput->hist_len = Frame2Output.hist_len;
|
|
for (int i = 0; i < Frame2Output.hist_len && i < max_hist_len; i++) {
|
|
pTxnOutput->hist_dts[i] = Frame2Output.hist_dts[i];
|
|
pTxnOutput->qty[i] = Frame2Output.qty[i];
|
|
strncpy(pTxnOutput->symbol[i], Frame2Output.symbol[i], sizeof(pTxnOutput->symbol[i]));
|
|
pTxnOutput->trade_id[i] = Frame2Output.trade_id[i];
|
|
strncpy(pTxnOutput->trade_status[i], Frame2Output.trade_status[i], sizeof(pTxnOutput->trade_status[i]));
|
|
}
|
|
} else {
|
|
// Execute Frame 3
|
|
m_db->DoCustomerPositionFrame3();
|
|
|
|
// Copy Frame 3 Output
|
|
pTxnOutput->hist_len = 0;
|
|
}
|
|
}
|
|
};
|
|
|
|
} // namespace TPCE
|
|
|
|
#endif // TXN_HARNESS_CUSTOMER_POSITION_H
|