Commit cb55eb268e00465115d69aaff61ce97b2cdb6fab
1 parent
0ae77a92f0
Exists in
master
lru-cache untuk reverseUrlCache
Showing 2 changed files with 19 additions and 1 deletions Inline Diff
neoxmlinutil.js
1 | var oracledb = require('oracledb'); | 1 | var oracledb = require('oracledb'); |
2 | var LRU = require('lru-cache'); | ||
2 | 3 | ||
3 | var config = require("./config.json"); | 4 | var config = require("./config.json"); |
4 | var logger = console; | 5 | var logger = console; |
5 | 6 | ||
6 | var oraCon; | 7 | var oraCon; |
7 | 8 | ||
9 | var reverseUrlCache = LRU({max: 30, maxAge: 60 * 1000}); | ||
10 | |||
8 | function init(options) { | 11 | function init(options) { |
9 | if (options && options.logger) { | 12 | if (options && options.logger) { |
10 | logger = options.logger; | 13 | logger = options.logger; |
11 | } | 14 | } |
12 | } | 15 | } |
13 | 16 | ||
14 | function connectToOracle(callback) { | 17 | function connectToOracle(callback) { |
15 | oracledb.getConnection(config.oracle, function(err, connection) { | 18 | oracledb.getConnection(config.oracle, function(err, connection) { |
16 | if (err) { | 19 | if (err) { |
17 | logger.warn('Can not connect to oracle db: ' + err); | 20 | logger.warn('Can not connect to oracle db: ' + err); |
18 | process.exit(1); | 21 | process.exit(1); |
19 | } | 22 | } |
20 | 23 | ||
21 | oraCon = connection; | 24 | oraCon = connection; |
22 | logger.info("Oracle db connected") | 25 | logger.info("Oracle db connected") |
23 | 26 | ||
24 | if (callback) { | 27 | if (callback) { |
25 | callback(null, oraCon); | 28 | callback(null, oraCon); |
26 | } | 29 | } |
27 | }) | 30 | }) |
28 | } | 31 | } |
29 | 32 | ||
30 | function getTransactionIdFromMessage(message) { | 33 | function getTransactionIdFromMessage(message) { |
31 | try { | 34 | try { |
32 | var matches = message.match(/ID=(\d+)/); | 35 | var matches = message.match(/ID=(\d+)/); |
33 | return matches[1]; | 36 | return matches[1]; |
34 | } | 37 | } |
35 | catch(err) { | 38 | catch(err) { |
36 | return '0'; | 39 | return '0'; |
37 | } | 40 | } |
38 | } | 41 | } |
39 | 42 | ||
40 | function getReverseUrl(msisdn, callback) { | 43 | function getReverseUrlFromDb(msisdn, callback) { |
41 | oraCon.execute( | 44 | oraCon.execute( |
42 | "SELECT trim(A.MSISDN) MSISDN, trim(B.REVERSE_URL) REVERSE_URL FROM T_STORE_USER_MSISDN A, T_STORE_USER B WHERE A.STORE_ID = B.STORE_ID AND A.USER_NAME = B.USER_NAME AND B.REVERSE_URL IS NOT NULL AND A.MSISDN = :msisdn", | 45 | "SELECT trim(A.MSISDN) MSISDN, trim(B.REVERSE_URL) REVERSE_URL FROM T_STORE_USER_MSISDN A, T_STORE_USER B WHERE A.STORE_ID = B.STORE_ID AND A.USER_NAME = B.USER_NAME AND B.REVERSE_URL IS NOT NULL AND A.MSISDN = :msisdn", |
43 | [msisdn], | 46 | [msisdn], |
44 | function(err, result) { | 47 | function(err, result) { |
45 | if (err) { | 48 | if (err) { |
46 | logger.warn('Error retrieving reverse url from oracle: ' + err); | 49 | logger.warn('Error retrieving reverse url from oracle: ' + err); |
47 | callback(err); | 50 | callback(err); |
48 | return; | 51 | return; |
49 | } | 52 | } |
50 | 53 | ||
51 | var rowCount = result.rows.length; | 54 | var rowCount = result.rows.length; |
52 | 55 | ||
53 | var retval = []; | 56 | var retval = []; |
54 | for (var i = 0; i < rowCount; i++) { | 57 | for (var i = 0; i < rowCount; i++) { |
55 | retval.push(result.rows[i][1]); | 58 | retval.push(result.rows[i][1]); |
56 | } | 59 | } |
57 | 60 | ||
61 | if (retval.length) { | ||
62 | reverseUrlCache.set(msisdn, retval); | ||
63 | } | ||
64 | |||
58 | callback(null, retval); | 65 | callback(null, retval); |
59 | } | 66 | } |
60 | ); | 67 | ); |
61 | } | 68 | } |
62 | 69 | ||
70 | function getReverseUrl(msisdn, callback) { | ||
71 | var urls = reverseUrlCache.get(msisdn); | ||
72 | |||
73 | if (!urls) { | ||
74 | getReverseUrlFromDb(msisdn, callback); | ||
75 | } else { | ||
76 | callback(null, retval); | ||
77 | } | ||
78 | } | ||
79 | |||
63 | function getRequestIdFromResponseMessage(message) { | 80 | function getRequestIdFromResponseMessage(message) { |
64 | try { | 81 | try { |
65 | var tokens = message.split('.'); | 82 | var tokens = message.split('.'); |
66 | return tokens[4]; | 83 | return tokens[4]; |
67 | } | 84 | } |
68 | catch(err) { | 85 | catch(err) { |
69 | return; | 86 | return; |
70 | } | 87 | } |
71 | 88 | ||
72 | } | 89 | } |
73 | 90 | ||
74 | exports.init = init; | 91 | exports.init = init; |
75 | exports.connectToOracle = connectToOracle; | 92 | exports.connectToOracle = connectToOracle; |
76 | exports.getReverseUrl = getReverseUrl; | 93 | exports.getReverseUrl = getReverseUrl; |
77 | exports.getTransactionIdFromMessage = getTransactionIdFromMessage; | 94 | exports.getTransactionIdFromMessage = getTransactionIdFromMessage; |
78 | exports.getRequestIdFromResponseMessage = getRequestIdFromResponseMessage; | 95 | exports.getRequestIdFromResponseMessage = getRequestIdFromResponseMessage; |
79 | 96 |
package.json
1 | { | 1 | { |
2 | "name": "sate24-neoxmlin", | 2 | "name": "sate24-neoxmlin", |
3 | "version": "1.0.0", | 3 | "version": "1.0.0", |
4 | "description": "Drop-in replacement for ST24 XML-RPC in", | 4 | "description": "Drop-in replacement for ST24 XML-RPC in", |
5 | "main": "index.js", | 5 | "main": "index.js", |
6 | "scripts": { | 6 | "scripts": { |
7 | "test": "mocha" | 7 | "test": "mocha" |
8 | }, | 8 | }, |
9 | "repository": { | 9 | "repository": { |
10 | "type": "git", | 10 | "type": "git", |
11 | "url": "git@gitlab.kodesumber.com:reload97/sate24-neoxmlin.git" | 11 | "url": "git@gitlab.kodesumber.com:reload97/sate24-neoxmlin.git" |
12 | }, | 12 | }, |
13 | "keywords": [ | 13 | "keywords": [ |
14 | "r97", | 14 | "r97", |
15 | "reload97", | 15 | "reload97", |
16 | "st24", | 16 | "st24", |
17 | "ppob", | 17 | "ppob", |
18 | "xmlrpc", | 18 | "xmlrpc", |
19 | "xmlin" | 19 | "xmlin" |
20 | ], | 20 | ], |
21 | "author": "Adhidarma Hadiwinoto <me@adhisimon.org>", | 21 | "author": "Adhidarma Hadiwinoto <me@adhisimon.org>", |
22 | "license": "ISC", | 22 | "license": "ISC", |
23 | "dependencies": { | 23 | "dependencies": { |
24 | "lru-cache": "^4.0.1", | ||
24 | "oracledb": "^1.9.3", | 25 | "oracledb": "^1.9.3", |
25 | "request": "^2.72.0", | 26 | "request": "^2.72.0", |
26 | "strftime": "^0.9.2", | 27 | "strftime": "^0.9.2", |
27 | "winston": "^2.2.0", | 28 | "winston": "^2.2.0", |
28 | "winston-daily-rotate-file": "^1.1.1", | 29 | "winston-daily-rotate-file": "^1.1.1", |
29 | "xml2js": "^0.4.16", | 30 | "xml2js": "^0.4.16", |
30 | "xmlrpc": "^1.3.1" | 31 | "xmlrpc": "^1.3.1" |
31 | }, | 32 | }, |
32 | "devDependencies": { | 33 | "devDependencies": { |
33 | "should": "^9.0.0" | 34 | "should": "^9.0.0" |
34 | } | 35 | } |
35 | } | 36 | } |
36 | 37 |