1
1
const config = require ( 'config' )
2
2
const pg = require ( 'pg' )
3
+ var AWS = require ( "aws-sdk" ) ;
3
4
const logger = require ( './common/logger' )
4
5
const pushToKafka = require ( './services/pushToKafka' )
5
6
const pgOptions = config . get ( 'POSTGRES' )
6
7
const postMessage = require ( './services/posttoslack' )
7
8
const pgConnectionString = `postgresql://${ pgOptions . user } :${ pgOptions . password } @${ pgOptions . host } :${ pgOptions . port } /${ pgOptions . database } `
8
- const pgClient = new pg . Client ( pgConnectionString )
9
+ // const pgClient = new pg.Client(pgConnectionString)
9
10
const auditTrail = require ( './services/auditTrail' ) ;
10
11
const port = 3000
11
-
12
+ //----------------------------Calling reconsiler 1 Audit log script ----------
12
13
async function setupPgClient ( ) {
13
14
var payloadcopy
14
15
try {
15
- await pgClient . connect ( )
16
- //sql1= "select * from pgifx_sync_audit where syncstatus in ('Informix-updated')
17
- //and auditdatetime >= (now()::date - interval '10m') and auditdatetime <= (now()::date - interval '5m') ";
18
- //>= 12.53 and <= 12.48
16
+ const pgClient = new pg . Client ( pgConnectionString )
17
+ if ( ! pgClient . connect ( ) ) {
18
+ await pgClient . connect ( )
19
+ }
20
+ //rec_d_start = 10
21
+ //rec_d_end = 1
19
22
rec_d_start = config . RECONSILER . RECONSILER_START
20
23
rec_d_end = config . RECONSILER . RECONSILER_END
21
24
rec_d_type = config . RECONSILER . RECONSILER_DURATION_TYPE
22
- var paramvalues = [ 'push-to-kafka' , rec_d_start , rec_d_end ] ;
23
- //var paramvalues = ['push-to-kafka','60002027'];
24
- //sql1 = 'select * from common_oltp.pgifx_sync_audit where pgifx_sync_audit.syncstatus =($1)'
25
+ var paramvalues = [ 'push-to-kafka' , rec_d_start , rec_d_end ] ;
25
26
sql1 = "select pgifx_sync_audit.seq_id, payloadseqid,auditdatetime ,syncstatus, payload from pgifx_sync_audit where pgifx_sync_audit.syncstatus =($1)"
26
27
sql2 = " and pgifx_sync_audit.auditdatetime between (timezone('utc',now())) - interval '1" + rec_d_type + "' * ($2)"
27
28
sql3 = " and (timezone('utc',now())) - interval '1" + rec_d_type + "' * ($3)"
28
29
sql = sql1 + sql2 + sql3
29
- console . log ( 'sql ' , sql )
30
- // sql3 = ' select * from common_oltp.pgifx_sync_audit where pgifx_sync_audit.syncstatus =($1)'
31
- // sql4 = " and pgifx_sync_audit.payloadseqid = ($2)"
32
-
33
- //sql = sql3 + sql4
34
- //const result = await pgClient.query(sql1, (err, res) => {
35
30
await pgClient . query ( sql , paramvalues , async ( err , result ) => {
36
31
if ( err ) {
37
- var errmsg0 = `error-sync: Audit reconsiler query "${ err . message } "`
32
+ var errmsg0 = `error-sync: Audit Reconsiler1 query "${ err . message } "`
38
33
logger . debug ( errmsg0 )
39
- // await callposttoslack(errmsg0)
34
+ await callposttoslack ( errmsg0 )
40
35
}
41
36
else {
42
- console . log ( "Reconsiler Rowcount = " , result . rows . length )
37
+ console . log ( "Reconsiler1 : Rowcount = " , result . rows . length )
43
38
for ( var i = 0 ; i < result . rows . length ; i ++ ) {
44
39
for ( var columnName in result . rows [ i ] ) {
45
40
// console.log('column "%s" has a value of "%j"', columnName, result.rows[i][columnName]);
@@ -48,39 +43,37 @@ async function setupPgClient() {
48
43
var reconsiler_payload = result . rows [ i ] [ columnName ]
49
44
}
50
45
} //column for loop
51
- try {
46
+ try {
47
+ //console.log("reconsiler_payload====",reconsiler_payload);
48
+ if ( reconsiler_payload != "" ) {
52
49
var s_payload = reconsiler_payload
53
50
payload = JSON . parse ( s_payload )
54
51
payload1 = payload . payload
55
52
await pushToKafka ( payload1 )
56
- logger . info ( 'Reconsiler : Push to kafka and added for audit trail' )
57
- audit ( s_payload )
58
- } catch ( error ) {
59
- logger . error ( 'Reconsiler : Could not parse message payload' )
60
- logger . debug ( `error-sync: Reconsiler parse message : "${ error . message } "` )
61
- const errmsg1 = `postgres-ifx-processor: Reconsiler : Error Parse or payload : "${ error . message } " \n payload : " ${ payloadcopy . payload } " `
53
+ logger . info ( 'Reconsiler1 Push to kafka and added for audit trail' )
54
+ await audit ( s_payload , 0 ) //0 flag means reconsiler 1. 1 flag reconsiler 2 i,e dynamodb
55
+ } } catch ( error ) {
56
+ logger . error ( 'Reconsiler1 : Could not parse message payload' )
57
+ logger . debug ( `error-sync: Reconsiler1 parse message : "${ error . message } "` )
58
+ const errmsg1 = `error-sync: Reconsiler1 : Error Parse or payload : "${ error . message } " `
62
59
logger . logFullError ( error )
63
- audit ( error )
60
+ // await audit(error,0 )
64
61
await callposttoslack ( errmsg1 )
65
- }
66
- } //result for loop
62
+ terminate ( )
63
+ }
64
+ } //result for loop
67
65
}
68
66
pgClient . end ( )
69
- } )
67
+ terminate ( )
68
+ } )
70
69
} catch ( err ) {
71
- const errmsg = `postgres-ifx-processor: Reconsiler : Error in setting up postgres client: "${ err . message } "`
70
+ const errmsg = `postgres-ifx-processor: Reconsiler1 : Error in setting up postgres client: "${ err . message } "`
72
71
logger . error ( errmsg )
73
72
logger . logFullError ( err )
74
73
await callposttoslack ( errmsg )
75
74
terminate ( )
76
75
}
77
- }
78
-
79
- const terminate = ( ) => process . exit ( )
80
-
81
- async function run ( ) {
82
- logger . debug ( "Initialising Reconsiler setup..." )
83
- await setupPgClient ( )
76
+ return
84
77
}
85
78
86
79
async function callposttoslack ( slackmessage ) {
@@ -92,35 +85,159 @@ async function callposttoslack(slackmessage) {
92
85
logger . debug ( 'Message posted successfully' ) ;
93
86
//callback(null);
94
87
} else if ( response . statusCode < 500 ) {
95
- const errmsg1 = `Slack Error: posting message to Slack API: ${ response . statusCode } - ${ response . statusMessage } `
88
+ const errmsg1 = `Slack Error: Reconsiler1: posting message to Slack API: ${ response . statusCode } - ${ response . statusMessage } `
96
89
logger . debug ( `error-sync: ${ errmsg1 } ` )
97
90
} else {
98
- logger . debug ( `Server error when processing message: ${ response . statusCode } - ${ response . statusMessage } ` ) ;
91
+ logger . debug ( `Reconsiler1: Server error when processing message: ${ response . statusCode } - ${ response . statusMessage } ` ) ;
99
92
//callback(`Server error when processing message: ${response.statusCode} - ${response.statusMessage}`);
100
93
}
101
94
resolve ( "done" )
102
95
} ) ;
103
96
} ) //end
104
97
}
105
-
98
+ return
106
99
}
107
- // execute
108
- run ( )
109
100
110
- async function audit ( message ) {
111
- const pl_processid = 5555
112
- const jsonpayload = JSON . parse ( message )
113
- payload = JSON . parse ( jsonpayload . payload )
114
- payload1 = payload . payload
101
+ async function audit ( message , reconsileflag ) {
102
+ if ( reconsileflag === 1 )
103
+ {
104
+ const jsonpayload = ( message )
105
+ const payload = ( jsonpayload . payload )
106
+ var pl_producererr = "Reconsiler2"
107
+ } else {
108
+ const jsonpayload = JSON . parse ( message )
109
+ payload = JSON . parse ( jsonpayload . payload )
110
+ var pl_producererr = "Reconsiler1"
111
+ }
112
+ const pl_processid = 5555
113
+ //const jsonpayload = JSON.parse(message)
114
+ //payload = JSON.parse(jsonpayload.payload)
115
+ payload1 = ( payload . payload )
115
116
const pl_seqid = payload1 . payloadseqid
116
- const pl_topic = payload1 . topic // TODO can move in config ?
117
+ const pl_topic = payload1 . topic // TODO can move in config ?
117
118
const pl_table = payload1 . table
118
119
const pl_uniquecolumn = payload1 . Uniquecolumn
119
120
const pl_operation = payload1 . operation
120
121
const pl_timestamp = payload1 . timestamp
121
- //const pl_payload = JSON.stringify(payload.payload)
122
- const logMessage = `${ pl_seqid } ${ pl_processid } ${ pl_table } ${ pl_uniquecolumn } ${ pl_operation } ${ payload . timestamp } `
123
- logger . debug ( `reconsiler : ${ logMessage } ` ) ;
124
- //await auditTrail([pl_seqid, pl_processid, pl_table, pl_uniquecolumn, pl_operation, "push-to-kafka-reconsiler", "", "reconsiler", "", "", new Date(), ""], 'producer')
122
+ const pl_payload = JSON . stringify ( message )
123
+ const logMessage = `${ pl_seqid } ${ pl_processid } ${ pl_table } ${ pl_uniquecolumn } ${ pl_operation } ${ payload . timestamp } `
124
+ logger . debug ( `${ pl_producererr } : ${ logMessage } ` ) ;
125
+ await auditTrail ( [ pl_seqid , pl_processid , pl_table , pl_uniquecolumn , pl_operation , "push-to-kafka" , "" , "" , pl_producererr , pl_payload , new Date ( ) , "" ] , 'producer' )
126
+ return
127
+ }
128
+
129
+ //===============RECONSILER2 DYNAMODB CODE STARTS HERE ==========================
130
+
131
+ async function callReconsiler2 ( )
132
+ { console . log ( "inside 2" ) ;
133
+ docClient . scan ( params , onScan ) ;
134
+ }
135
+
136
+ var docClient = new AWS . DynamoDB . DocumentClient ( {
137
+ region : 'us-east-1' ,
138
+ convertEmptyValues : true
139
+ } ) ;
140
+ //ElapsedTime = 094600000
141
+ ElapsedTime = config . DYNAMODB . DD_ElapsedTime
142
+ var params = {
143
+ TableName : config . DYNAMODB . DYNAMODB_TABLE ,
144
+ FilterExpression : "#timestamp between :time_1 and :time_2" ,
145
+ ExpressionAttributeNames : {
146
+ "#timestamp" : "timestamp" ,
147
+ } ,
148
+ ExpressionAttributeValues : {
149
+ ":time_1" : Date . now ( ) - ElapsedTime ,
150
+ ":time_2" : Date . now ( )
151
+ }
152
+ }
153
+
154
+ function onScan ( err , data ) {
155
+ if ( err ) {
156
+ logger . error ( "Unable to scan the table. Error JSON:" , JSON . stringify ( err , null , 2 ) ) ;
157
+ terminate ( )
158
+ } else {
159
+ try
160
+ {
161
+ console . log ( "Scan succeeded." ) ;
162
+ let total_dd_records = 0 ;
163
+ let total_pushtokafka = 0 ;
164
+ data . Items . forEach ( async function ( item ) {
165
+ //console.log(item.payloadseqid);
166
+ var retval = await verify_pg_record_exists ( item . payloadseqid )
167
+ //console.log("retval", retval);
168
+ if ( retval === false ) {
169
+ var s_payload = ( item . pl_document )
170
+ payload = s_payload
171
+ payload1 = ( payload . payload )
172
+ await pushToKafka ( item . pl_document )
173
+ await audit ( s_payload , 1 ) //0 flag means reconsiler 1. 1 flag reconsiler 2 i,e dynamodb
174
+ logger . info ( `Reconsiler2 : ${ item . payloadseqid } posted to kafka: Total Kafka Count : ${ total_pushtokafka } ` )
175
+ total_pushtokafka += 1
176
+ }
177
+ total_dd_records += 1
178
+ } ) ;
179
+ logger . info ( `Reconsiler2 : count of total_dd_records ${ total_dd_records } ` ) ;
180
+ if ( typeof data . LastEvaluatedKey != "undefined" ) {
181
+ console . log ( "Scanning for more..." ) ;
182
+ params . ExclusiveStartKey = data . LastEvaluatedKey ;
183
+ docClient . scan ( params , onScan ) ;
184
+ }
185
+ }
186
+ catch ( err ) {
187
+ const errmsg = `error-sync: Reconsiler2 : Error during dynamodb scan/kafka push: "${ err . message } "`
188
+ logger . error ( errmsg )
189
+ logger . logFullError ( err )
190
+ callposttoslack ( errmsg )
191
+ //terminate()
192
+ }
193
+ }
194
+ //terminate()
125
195
}
126
196
197
+ async function verify_pg_record_exists ( seqid )
198
+ {
199
+ try {
200
+ const pgClient = new pg . Client ( pgConnectionString )
201
+ if ( ! pgClient . connect ( ) ) { await pgClient . connect ( ) }
202
+ var paramvalues = [ seqid ]
203
+ sql = 'select * from common_oltp.pgifx_sync_audit where pgifx_sync_audit.payloadseqid = ($1)'
204
+ return new Promise ( function ( resolve , reject ) {
205
+ pgClient . query ( sql , paramvalues , async ( err , result ) => {
206
+ if ( err ) {
207
+ var errmsg0 = `error-sync: Audit reconsiler2 query "${ err . message } "`
208
+ console . log ( errmsg0 )
209
+ }
210
+ else {
211
+ if ( result . rows . length > 0 ) {
212
+ //console.log("row length > 0 ")
213
+ resolve ( true ) ;
214
+ }
215
+ else {
216
+ //console.log("0")
217
+ resolve ( false ) ;
218
+ }
219
+ }
220
+ pgClient . end ( )
221
+ } )
222
+ } ) }
223
+ catch ( err ) {
224
+ const errmsg = `error-sync: Reconsiler2 : Error in setting up postgres client: "${ err . message } "`
225
+ logger . error ( errmsg )
226
+ logger . logFullError ( err )
227
+ await callposttoslack ( errmsg )
228
+ terminate ( )
229
+ }
230
+ }
231
+
232
+ //=================BEGIN HERE =======================
233
+ const terminate = ( ) => process . exit ( )
234
+
235
+ async function run ( ) {
236
+ logger . debug ( "Initialising Reconsiler1 setup..." )
237
+ await setupPgClient ( )
238
+ //logger.debug("Initialising Reconsiler2 setup...")
239
+ //callReconsiler2()
240
+ // terminate()
241
+ }
242
+ //execute
243
+ run ( )
0 commit comments