// Author: Zilvinas Verseckas // Company: Kolmisoft // Year: 2017 // About: Script compares Local and External CDRs #ifndef _M2_CDR_COMPARE_H #define _M2_CDR_COMPARE_H #define _GNU_SOURCE #define SCRIPT_NAME "m2_cdr_compare" #define SCRIPT_VERSION "1.0" #define MAX_CMP_SRC 16 // Maximum length of a comparable part of src/dst #define MAX_CMP_DST 16 #define VFILE_MAX_SIZE 100000 // Maximum number of CDRs to compare #define SQL_BATCH_SIZE 300 // Size of SQL insert/update batches #define SHIFT_CHECK_RANGE 500 // Range in which to look for time shift (the bigger, the more precise) #define EPSILON 0.000000001 #include "m2_functions.c" // Information about a Dispute struct cdr_dispute { int id; int user_id; int direction; char period_start[32]; time_t period_start_t; char period_end[32]; time_t period_end_t; time_t time_shift; time_t time_zone; int billsec_tolerance; double cost_tolerance; int cmp_last_src_digits; int cmp_last_dst_digits; double exchange_rate; int check_only_answered_calls; }; // Virtual file line structure struct vline { char src[MAX_CMP_SRC + 1]; char dst[MAX_CMP_DST + 1]; int start_time; int answer_time; int end_time; int billsec; double cost; short connected; short errors; int code; long long call_id; long long id; short skip; struct vline *next; }; // Virtual file structure struct vfile { struct vline *head; struct vline *tail; int size; }; // Pair data type typedef struct pair { long long fst; int snd; } pair_t; // CDR triple data type typedef struct cdr_tripple { long long id; long long call_id; int code; } cdr_tripple_t; // Dispute operations void print_dispute(const struct cdr_dispute *dispute); // Virtual file operations struct vfile *init_vfile(void); void free_vfile(struct vfile *file); struct vline *make_vline(const MYSQL_ROW row); void append_vline(struct vfile *file, struct vline *new_vline); struct vline *find_vline(struct vfile *file, const struct vline *to_find); struct vline *match_vline(struct vfile *file, const struct vline *to_find, const struct cdr_dispute *dispute, int *code); struct vline *exactly_match_vline(struct vfile *file, const struct vline *to_find, const struct cdr_dispute *dispute); int mark_duplicates(struct vfile *file, int code); void rewind_vfile(struct vfile *file, int depth); // Main script operations time_t find_time_shift(struct vfile *local_cdrs, struct vfile *external_cdrs, const struct cdr_dispute *dispute, int *status); int compare_cdrs(struct vfile *local_cdrs, struct vfile *external_cdrs, const struct cdr_dispute *dispute); int get_cdr_dispute(struct cdr_dispute *dispute, const int id); struct vfile *get_local_cdrs(const struct cdr_dispute *dispute, int *status); struct vfile *get_external_cdrs(const struct cdr_dispute *dispute, int *status); int store_faulty_cdrs(struct vfile *file, const int dispute_id, const int type); int insert_disputed_cdrs(const pair_t *map, const int size, const int dispute_id, const int type); int update_disputed_cdrs(const cdr_tripple_t *map, const int size, const int dispute_id); int update_dispute_status(const int status, const int id); int finish_dispute(const struct cdr_dispute *dispute); int validate_dispute(const struct cdr_dispute *dispute); // General script operations void cleanup_memory(void); int dequal(double a, double b); // Global flag for dispute status int dispute_in_progress = 0; // Working CDR dispute id int dispute_id = 0; // Dispute message for GUI int dispute_message_id = 0; #endif // _M2_CDR_COMPARE