inlaweb-lib-dynamodb 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{dist/types/index.d.ts → index.d.ts} +2 -2
- package/{dist/index.js → index.js} +163 -106
- package/package.json +1 -1
- package/.vscode/launch.json +0 -22
- package/.vscode/task.json +0 -13
- package/coverage/clover.xml +0 -180
- package/coverage/coverage-final.json +0 -2
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -116
- package/coverage/lcov-report/index.ts.html +0 -1171
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -282
- package/jest.config.js +0 -9
- package/src/commons/types.ts +0 -71
- package/src/index.ts +0 -363
- package/tests/index.test.ts +0 -259
- package/tsconfig.json +0 -12
- /package/{dist/types/commons → commons}/types.d.ts +0 -0
- /package/{dist/commons → commons}/types.js +0 -0
|
@@ -5,14 +5,14 @@ export declare class DynamoLib {
|
|
|
5
5
|
private readonly logger;
|
|
6
6
|
constructor();
|
|
7
7
|
putItem(tableName: string, item: KeyValue): Promise<void>;
|
|
8
|
-
getItem<T>(tableName: string, key: KeyValue, projectionExpression?: string): Promise<T
|
|
8
|
+
getItem<T>(tableName: string, key: KeyValue, projectionExpression?: string): Promise<T>;
|
|
9
9
|
updateItem(params: InputUpdate): Promise<boolean>;
|
|
10
10
|
query<T>(params: {
|
|
11
11
|
tableName: string;
|
|
12
12
|
searchParameters: SearchParameters;
|
|
13
13
|
permission?: string;
|
|
14
14
|
username?: string;
|
|
15
|
-
}): Promise<T[]
|
|
15
|
+
}): Promise<T[]>;
|
|
16
16
|
private buildQueryParams;
|
|
17
17
|
private buildExpressions;
|
|
18
18
|
private buildFilterExpression;
|
|
@@ -20,41 +20,56 @@ class DynamoLib {
|
|
|
20
20
|
this.logger = new logger_1.Logger();
|
|
21
21
|
}
|
|
22
22
|
async putItem(tableName, item) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
try {
|
|
24
|
+
const params = {
|
|
25
|
+
TableName: tableName,
|
|
26
|
+
Item: item,
|
|
27
|
+
ReturnItemCollectionMetrics: "SIZE",
|
|
28
|
+
ReturnConsumedCapacity: "TOTAL",
|
|
29
|
+
};
|
|
30
|
+
this.logger.debug(`PutItem: ${JSON.stringify(params)}`);
|
|
31
|
+
const result = await this.docClient.send(new lib_dynamodb_1.PutCommand(params));
|
|
32
|
+
this.logger.debug(`PutItem Result: ${JSON.stringify(result)}`);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
this.logger.error(error.message);
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
32
38
|
}
|
|
33
39
|
async getItem(tableName, key, projectionExpression) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
try {
|
|
41
|
+
const params = {
|
|
42
|
+
TableName: tableName,
|
|
43
|
+
Key: key,
|
|
44
|
+
ReturnConsumedCapacity: "TOTAL",
|
|
45
|
+
};
|
|
46
|
+
const projection = this.buildProjectionExpression(projectionExpression);
|
|
47
|
+
if (projection) {
|
|
48
|
+
params.ProjectionExpression = projection.projectionExpression;
|
|
49
|
+
params.ExpressionAttributeNames = projection.expressionAttributeNames;
|
|
50
|
+
}
|
|
51
|
+
this.logger.debug(`GetItem: ${JSON.stringify(params)}`);
|
|
52
|
+
const response = await this.docClient.send(new lib_dynamodb_1.GetCommand(params));
|
|
53
|
+
this.logger.debug(`GetItem Result: ${JSON.stringify(response)}`);
|
|
48
54
|
return response.Item;
|
|
49
55
|
}
|
|
50
|
-
|
|
56
|
+
catch (error) {
|
|
57
|
+
this.logger.error(error.message);
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
51
60
|
}
|
|
52
61
|
async updateItem(params) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
try {
|
|
63
|
+
const itemUpdate = this.createUpdateParams(params);
|
|
64
|
+
this.logger.debug(`UpdateItem: ${JSON.stringify(itemUpdate.Update)}`);
|
|
65
|
+
const result = await this.docClient.send(new lib_dynamodb_1.UpdateCommand(itemUpdate.Update));
|
|
66
|
+
this.logger.debug(`UpdateItem Result: ${JSON.stringify(result)}`);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
this.logger.error(error.message);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
58
73
|
}
|
|
59
74
|
async query(params) {
|
|
60
75
|
try {
|
|
@@ -62,10 +77,7 @@ class DynamoLib {
|
|
|
62
77
|
this.logger.debug(`Query: ${JSON.stringify(parameters)}`);
|
|
63
78
|
const response = await this.docClient.send(new lib_dynamodb_1.QueryCommand(parameters));
|
|
64
79
|
this.logger.debug(`Query Result: ${JSON.stringify(response)}`);
|
|
65
|
-
|
|
66
|
-
return response.Items;
|
|
67
|
-
}
|
|
68
|
-
return;
|
|
80
|
+
return response.Items;
|
|
69
81
|
}
|
|
70
82
|
catch (error) {
|
|
71
83
|
this.logger.error(error.message);
|
|
@@ -78,8 +90,11 @@ class DynamoLib {
|
|
|
78
90
|
TableName: params.tableName,
|
|
79
91
|
KeyConditionExpression: "",
|
|
80
92
|
ExpressionAttributeNames: projection?.expressionAttributeNames || {},
|
|
81
|
-
ExpressionAttributeValues: {}
|
|
93
|
+
ExpressionAttributeValues: {},
|
|
82
94
|
};
|
|
95
|
+
if (projection) {
|
|
96
|
+
parameters.ProjectionExpression = projection.projectionExpression;
|
|
97
|
+
}
|
|
83
98
|
if (params.searchParameters.exclusiveStartKey) {
|
|
84
99
|
parameters.ExclusiveStartKey = params.searchParameters.exclusiveStartKey;
|
|
85
100
|
}
|
|
@@ -114,7 +129,8 @@ class DynamoLib {
|
|
|
114
129
|
break;
|
|
115
130
|
case "BETWEEN":
|
|
116
131
|
params.KeyConditionExpression += `#key${index} ${searchParameter.operator} :value${index} AND :value1${index}`;
|
|
117
|
-
params.ExpressionAttributeValues[`:value1${index}`] =
|
|
132
|
+
params.ExpressionAttributeValues[`:value1${index}`] =
|
|
133
|
+
searchParameter.value1;
|
|
118
134
|
break;
|
|
119
135
|
case "FILTER":
|
|
120
136
|
this.buildFilterExpression(searchParameter, index, params);
|
|
@@ -128,14 +144,14 @@ class DynamoLib {
|
|
|
128
144
|
}
|
|
129
145
|
buildFilterExpression(searchParameter, index, params) {
|
|
130
146
|
if (params.FilterExpression)
|
|
131
|
-
params.FilterExpression +=
|
|
147
|
+
params.FilterExpression += " and ";
|
|
132
148
|
else
|
|
133
|
-
params.FilterExpression =
|
|
149
|
+
params.FilterExpression = "";
|
|
134
150
|
switch (searchParameter.filterOperator) {
|
|
135
|
-
case
|
|
151
|
+
case "contains":
|
|
136
152
|
params.FilterExpression += `contains (#key${index}, :value${index})`;
|
|
137
153
|
break;
|
|
138
|
-
case
|
|
154
|
+
case "begins_with":
|
|
139
155
|
params.FilterExpression += `${searchParameter.filterOperator}(#key${index}, :value${index})`;
|
|
140
156
|
break;
|
|
141
157
|
case "attribute_not_exists":
|
|
@@ -166,19 +182,25 @@ class DynamoLib {
|
|
|
166
182
|
}
|
|
167
183
|
}
|
|
168
184
|
async saveBatch(table, items) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
185
|
+
try {
|
|
186
|
+
const executions = this.createBatch(items);
|
|
187
|
+
for (let i = 0; i < executions.length; i++) {
|
|
188
|
+
const params = {
|
|
189
|
+
RequestItems: {
|
|
190
|
+
[table]: executions[i],
|
|
191
|
+
},
|
|
192
|
+
ReturnConsumedCapacity: "TOTAL",
|
|
193
|
+
};
|
|
194
|
+
this.logger.debug(`BatchWrite: ${JSON.stringify(params)}`);
|
|
195
|
+
const response = await this.docClient.send(new lib_dynamodb_1.BatchWriteCommand(params));
|
|
196
|
+
this.logger.debug(`BatchWrite Result: ${JSON.stringify(response)}`);
|
|
197
|
+
}
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
this.logger.error(error.message);
|
|
202
|
+
throw error;
|
|
180
203
|
}
|
|
181
|
-
return true;
|
|
182
204
|
}
|
|
183
205
|
createBatch(items) {
|
|
184
206
|
const executions = [];
|
|
@@ -193,17 +215,23 @@ class DynamoLib {
|
|
|
193
215
|
return executions;
|
|
194
216
|
}
|
|
195
217
|
async writeTransactions(items, limit) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
218
|
+
try {
|
|
219
|
+
const executions = this.createWriteTransactions(items, limit);
|
|
220
|
+
for (let i = 0; i < executions.length; i++) {
|
|
221
|
+
const params = {
|
|
222
|
+
TransactItems: executions[i],
|
|
223
|
+
ReturnConsumedCapacity: "TOTAL",
|
|
224
|
+
};
|
|
225
|
+
this.logger.debug(`TransactWrite: ${JSON.stringify(params)}`);
|
|
226
|
+
const response = await this.docClient.send(new lib_dynamodb_1.TransactWriteCommand(params));
|
|
227
|
+
this.logger.debug(`TransactWrite Result: ${JSON.stringify(response)}`);
|
|
228
|
+
}
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
this.logger.error(error.message);
|
|
233
|
+
throw error;
|
|
205
234
|
}
|
|
206
|
-
return true;
|
|
207
235
|
}
|
|
208
236
|
createWriteTransactions(items, limit) {
|
|
209
237
|
const executions = [];
|
|
@@ -218,10 +246,12 @@ class DynamoLib {
|
|
|
218
246
|
return executions;
|
|
219
247
|
}
|
|
220
248
|
createUpdateParams(params) {
|
|
221
|
-
const { table, PK, SK, item, setAttributes, addAttributes, removeAttributes, username } = params;
|
|
249
|
+
const { table, PK, SK, item, setAttributes, addAttributes, removeAttributes, username, } = params;
|
|
222
250
|
// Se agregan los datos de auditoría para la actualización
|
|
223
251
|
item.updateUser = username;
|
|
224
|
-
item.updateDate = moment_timezone_1.default
|
|
252
|
+
item.updateDate = moment_timezone_1.default
|
|
253
|
+
.tz(new Date(), "America/Bogota")
|
|
254
|
+
.format("YYYY-MM-DD");
|
|
225
255
|
if (!setAttributes.includes("updateUser"))
|
|
226
256
|
setAttributes.push("updateUser");
|
|
227
257
|
if (!setAttributes.includes("updateDate"))
|
|
@@ -250,7 +280,8 @@ class DynamoLib {
|
|
|
250
280
|
this.formatUpdateExpressionRemove(itemUpdate, removeAttributes);
|
|
251
281
|
}
|
|
252
282
|
// Se remueve el espacio al final de la expresión
|
|
253
|
-
itemUpdate.Update.UpdateExpression =
|
|
283
|
+
itemUpdate.Update.UpdateExpression =
|
|
284
|
+
itemUpdate.Update.UpdateExpression.slice(0, -1);
|
|
254
285
|
return itemUpdate;
|
|
255
286
|
}
|
|
256
287
|
formatUpdateExpression(operation, updateObject, item, atributes) {
|
|
@@ -260,14 +291,18 @@ class DynamoLib {
|
|
|
260
291
|
let operationTemplate = templatesUpdateExpresion[operation];
|
|
261
292
|
// Se añaden los items afectados por la operación.
|
|
262
293
|
for (let atribute of atributes) {
|
|
263
|
-
if (typeof item[atribute] === "boolean" ||
|
|
294
|
+
if (typeof item[atribute] === "boolean" ||
|
|
295
|
+
typeof item[atribute] === "number" ||
|
|
296
|
+
item[atribute]) {
|
|
264
297
|
updateObject.Update.UpdateExpression += operationTemplate(atribute);
|
|
265
298
|
updateObject.Update.ExpressionAttributeNames[`#${atribute}`] = atribute;
|
|
266
|
-
updateObject.Update.ExpressionAttributeValues[`:${atribute}`] =
|
|
299
|
+
updateObject.Update.ExpressionAttributeValues[`:${atribute}`] =
|
|
300
|
+
item[atribute];
|
|
267
301
|
}
|
|
268
302
|
}
|
|
269
303
|
// Se remueve la coma final para evitar errores con el SDK.
|
|
270
|
-
updateObject.Update.UpdateExpression =
|
|
304
|
+
updateObject.Update.UpdateExpression =
|
|
305
|
+
updateObject.Update.UpdateExpression.slice(0, -1);
|
|
271
306
|
// Se añade un espacio para poder agregar nuevas operaciones.
|
|
272
307
|
updateObject.Update.UpdateExpression += " ";
|
|
273
308
|
}
|
|
@@ -283,53 +318,75 @@ class DynamoLib {
|
|
|
283
318
|
updateObject.Update.ExpressionAttributeNames[`#${atribute}`] = atribute;
|
|
284
319
|
}
|
|
285
320
|
// Se remueve la coma final para evitar errores con el SDK.
|
|
286
|
-
updateObject.Update.UpdateExpression =
|
|
321
|
+
updateObject.Update.UpdateExpression =
|
|
322
|
+
updateObject.Update.UpdateExpression.slice(0, -1);
|
|
287
323
|
// Se añade un espacio para poder agregar nuevas operaciones.
|
|
288
324
|
updateObject.Update.UpdateExpression += " ";
|
|
289
325
|
}
|
|
290
326
|
async getId(table, entity, username, quantity) {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
item
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
327
|
+
try {
|
|
328
|
+
let item = await this.getItem(table, { PK: "COUN", SK: entity }, "order");
|
|
329
|
+
if (!item) {
|
|
330
|
+
item = {
|
|
331
|
+
PK: "COUN",
|
|
332
|
+
SK: entity,
|
|
333
|
+
entity: "COUN",
|
|
334
|
+
order: 0,
|
|
335
|
+
creationUser: username,
|
|
336
|
+
creationDate: moment_timezone_1.default
|
|
337
|
+
.tz(new Date(), "America/Bogota")
|
|
338
|
+
.format("YYYY-MM-DD"),
|
|
339
|
+
};
|
|
340
|
+
await this.putItem(table, item);
|
|
341
|
+
}
|
|
342
|
+
const params = {
|
|
343
|
+
TableName: table,
|
|
344
|
+
Key: { PK: "COUN", SK: entity },
|
|
345
|
+
UpdateExpression: `SET #id = #id + :increment`,
|
|
346
|
+
ExpressionAttributeNames: { "#id": "order" },
|
|
347
|
+
ExpressionAttributeValues: { ":increment": quantity || 1 },
|
|
348
|
+
ReturnValues: "UPDATED_OLD",
|
|
300
349
|
};
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
const result = await this.docClient.send(new lib_dynamodb_1.UpdateCommand(params));
|
|
313
|
-
this.logger.debug(`GetId Result: ${JSON.stringify(result)}`);
|
|
314
|
-
if (result.Attributes)
|
|
315
|
-
return result.Attributes.order + 1;
|
|
316
|
-
return 1;
|
|
350
|
+
this.logger.debug(`GetId: ${JSON.stringify(params)}`);
|
|
351
|
+
const result = await this.docClient.send(new lib_dynamodb_1.UpdateCommand(params));
|
|
352
|
+
this.logger.debug(`GetId Result: ${JSON.stringify(result)}`);
|
|
353
|
+
if (result.Attributes)
|
|
354
|
+
return result.Attributes.order + 1;
|
|
355
|
+
return 1;
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
this.logger.error(error.message);
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
317
361
|
}
|
|
318
362
|
async validatePermission(table, entity, action, profile) {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
363
|
+
try {
|
|
364
|
+
let result;
|
|
365
|
+
let searchParameters = {
|
|
366
|
+
indexName: "GSI2",
|
|
367
|
+
parameters: [
|
|
368
|
+
{ name: "entity", value: "PERM", operator: "=" },
|
|
369
|
+
{
|
|
370
|
+
name: "relation2",
|
|
371
|
+
value: `${profile}|${entity}|${action}`,
|
|
372
|
+
operator: "=",
|
|
373
|
+
},
|
|
374
|
+
],
|
|
375
|
+
};
|
|
376
|
+
let permissionQuery = await this.query({
|
|
377
|
+
tableName: table,
|
|
378
|
+
searchParameters,
|
|
379
|
+
});
|
|
380
|
+
if (permissionQuery && permissionQuery.length > 0) {
|
|
381
|
+
result = permissionQuery[0];
|
|
382
|
+
return result.type === "ALL" ? "ALL" : "OWNS";
|
|
383
|
+
}
|
|
384
|
+
throw new Error("UNAUTHORIZE_REQUEST");
|
|
385
|
+
}
|
|
386
|
+
catch (error) {
|
|
387
|
+
this.logger.error(error.message);
|
|
388
|
+
throw error;
|
|
331
389
|
}
|
|
332
|
-
throw new Error("UNAUTHORIZE_REQUEST");
|
|
333
390
|
}
|
|
334
391
|
}
|
|
335
392
|
exports.DynamoLib = DynamoLib;
|
package/package.json
CHANGED
package/.vscode/launch.json
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"configurations": [
|
|
3
|
-
{
|
|
4
|
-
"type": "node",
|
|
5
|
-
"request": "launch",
|
|
6
|
-
"name": "Launch Program",
|
|
7
|
-
"program": "${workspaceFolder}/${input:programPath}",
|
|
8
|
-
"preLaunchTask": "build"
|
|
9
|
-
}
|
|
10
|
-
],
|
|
11
|
-
"inputs": [
|
|
12
|
-
{
|
|
13
|
-
"type": "pickString",
|
|
14
|
-
"id": "programPath",
|
|
15
|
-
"description": "Select the entry point for your program",
|
|
16
|
-
"options": [
|
|
17
|
-
"dist/index.js",
|
|
18
|
-
"src/index.ts"
|
|
19
|
-
]
|
|
20
|
-
}
|
|
21
|
-
]
|
|
22
|
-
}
|
package/.vscode/task.json
DELETED
package/coverage/clover.xml
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<coverage generated="1742306457851" clover="3.2.0">
|
|
3
|
-
<project timestamp="1742306457851" name="All files">
|
|
4
|
-
<metrics statements="171" coveredstatements="171" conditionals="52" coveredconditionals="52" methods="25" coveredmethods="25" elements="248" coveredelements="248" complexity="0" loc="171" ncloc="171" packages="1" files="1" classes="1"/>
|
|
5
|
-
<file name="index.ts" path="/media/jfmedinae/9E32FD7232FD502F/Windows/Proyectos/Commons/inlaweb-lib-dynamodb/src/index.ts">
|
|
6
|
-
<metrics statements="171" coveredstatements="171" conditionals="52" coveredconditionals="52" methods="25" coveredmethods="25"/>
|
|
7
|
-
<line num="1" count="1" type="stmt"/>
|
|
8
|
-
<line num="2" count="1" type="stmt"/>
|
|
9
|
-
<line num="3" count="1" type="stmt"/>
|
|
10
|
-
<line num="5" count="1" type="stmt"/>
|
|
11
|
-
<line num="7" count="1" type="stmt"/>
|
|
12
|
-
<line num="8" count="6" type="stmt"/>
|
|
13
|
-
<line num="9" count="1" type="stmt"/>
|
|
14
|
-
<line num="10" count="1" type="stmt"/>
|
|
15
|
-
<line num="13" count="1" type="stmt"/>
|
|
16
|
-
<line num="19" count="20" type="stmt"/>
|
|
17
|
-
<line num="20" count="20" type="stmt"/>
|
|
18
|
-
<line num="21" count="20" type="stmt"/>
|
|
19
|
-
<line num="25" count="1" type="stmt"/>
|
|
20
|
-
<line num="31" count="1" type="stmt"/>
|
|
21
|
-
<line num="32" count="1" type="stmt"/>
|
|
22
|
-
<line num="33" count="1" type="stmt"/>
|
|
23
|
-
<line num="37" count="2" type="stmt"/>
|
|
24
|
-
<line num="42" count="2" type="stmt"/>
|
|
25
|
-
<line num="43" count="2" type="cond" truecount="1" falsecount="0"/>
|
|
26
|
-
<line num="44" count="1" type="stmt"/>
|
|
27
|
-
<line num="45" count="1" type="stmt"/>
|
|
28
|
-
<line num="47" count="2" type="stmt"/>
|
|
29
|
-
<line num="48" count="2" type="stmt"/>
|
|
30
|
-
<line num="49" count="2" type="stmt"/>
|
|
31
|
-
<line num="50" count="2" type="cond" truecount="1" falsecount="0"/>
|
|
32
|
-
<line num="51" count="1" type="stmt"/>
|
|
33
|
-
<line num="53" count="1" type="stmt"/>
|
|
34
|
-
<line num="57" count="1" type="stmt"/>
|
|
35
|
-
<line num="58" count="1" type="stmt"/>
|
|
36
|
-
<line num="59" count="1" type="stmt"/>
|
|
37
|
-
<line num="60" count="1" type="stmt"/>
|
|
38
|
-
<line num="61" count="1" type="stmt"/>
|
|
39
|
-
<line num="65" count="8" type="stmt"/>
|
|
40
|
-
<line num="66" count="8" type="stmt"/>
|
|
41
|
-
<line num="67" count="8" type="stmt"/>
|
|
42
|
-
<line num="68" count="8" type="stmt"/>
|
|
43
|
-
<line num="69" count="7" type="stmt"/>
|
|
44
|
-
<line num="70" count="7" type="cond" truecount="1" falsecount="0"/>
|
|
45
|
-
<line num="71" count="6" type="stmt"/>
|
|
46
|
-
<line num="73" count="1" type="stmt"/>
|
|
47
|
-
<line num="75" count="1" type="stmt"/>
|
|
48
|
-
<line num="76" count="1" type="stmt"/>
|
|
49
|
-
<line num="82" count="8" type="stmt"/>
|
|
50
|
-
<line num="84" count="8" type="stmt"/>
|
|
51
|
-
<line num="91" count="8" type="cond" truecount="1" falsecount="0"/>
|
|
52
|
-
<line num="92" count="3" type="stmt"/>
|
|
53
|
-
<line num="94" count="8" type="cond" truecount="1" falsecount="0"/>
|
|
54
|
-
<line num="95" count="3" type="stmt"/>
|
|
55
|
-
<line num="97" count="8" type="cond" truecount="1" falsecount="0"/>
|
|
56
|
-
<line num="98" count="3" type="stmt"/>
|
|
57
|
-
<line num="100" count="8" type="cond" truecount="1" falsecount="0"/>
|
|
58
|
-
<line num="101" count="8" type="stmt"/>
|
|
59
|
-
<line num="104" count="8" type="cond" truecount="3" falsecount="0"/>
|
|
60
|
-
<line num="105" count="1" type="stmt"/>
|
|
61
|
-
<line num="113" count="8" type="stmt"/>
|
|
62
|
-
<line num="114" count="15" type="stmt"/>
|
|
63
|
-
<line num="117" count="8" type="stmt"/>
|
|
64
|
-
<line num="125" count="15" type="cond" truecount="3" falsecount="0"/>
|
|
65
|
-
<line num="127" count="15" type="cond" truecount="4" falsecount="0"/>
|
|
66
|
-
<line num="129" count="1" type="stmt"/>
|
|
67
|
-
<line num="130" count="1" type="stmt"/>
|
|
68
|
-
<line num="132" count="1" type="stmt"/>
|
|
69
|
-
<line num="133" count="1" type="stmt"/>
|
|
70
|
-
<line num="134" count="1" type="stmt"/>
|
|
71
|
-
<line num="136" count="6" type="stmt"/>
|
|
72
|
-
<line num="137" count="6" type="stmt"/>
|
|
73
|
-
<line num="139" count="7" type="stmt"/>
|
|
74
|
-
<line num="140" count="7" type="stmt"/>
|
|
75
|
-
<line num="143" count="15" type="stmt"/>
|
|
76
|
-
<line num="144" count="15" type="stmt"/>
|
|
77
|
-
<line num="152" count="6" type="cond" truecount="2" falsecount="0"/>
|
|
78
|
-
<line num="153" count="2" type="stmt"/>
|
|
79
|
-
<line num="155" count="6" type="cond" truecount="5" falsecount="0"/>
|
|
80
|
-
<line num="157" count="1" type="stmt"/>
|
|
81
|
-
<line num="158" count="1" type="stmt"/>
|
|
82
|
-
<line num="160" count="1" type="stmt"/>
|
|
83
|
-
<line num="161" count="1" type="stmt"/>
|
|
84
|
-
<line num="163" count="1" type="stmt"/>
|
|
85
|
-
<line num="164" count="1" type="stmt"/>
|
|
86
|
-
<line num="166" count="1" type="stmt"/>
|
|
87
|
-
<line num="167" count="1" type="stmt"/>
|
|
88
|
-
<line num="169" count="2" type="stmt"/>
|
|
89
|
-
<line num="170" count="2" type="stmt"/>
|
|
90
|
-
<line num="175" count="10" type="cond" truecount="1" falsecount="0"/>
|
|
91
|
-
<line num="176" count="9" type="stmt"/>
|
|
92
|
-
<line num="178" count="1" type="stmt"/>
|
|
93
|
-
<line num="179" count="1" type="cond" truecount="1" falsecount="0"/>
|
|
94
|
-
<line num="180" count="1" type="stmt"/>
|
|
95
|
-
<line num="181" count="1" type="stmt"/>
|
|
96
|
-
<line num="182" count="1" type="stmt"/>
|
|
97
|
-
<line num="183" count="2" type="stmt"/>
|
|
98
|
-
<line num="184" count="2" type="stmt"/>
|
|
99
|
-
<line num="186" count="1" type="stmt"/>
|
|
100
|
-
<line num="187" count="1" type="stmt"/>
|
|
101
|
-
<line num="192" count="1" type="stmt"/>
|
|
102
|
-
<line num="193" count="1" type="stmt"/>
|
|
103
|
-
<line num="194" count="1" type="stmt"/>
|
|
104
|
-
<line num="200" count="1" type="stmt"/>
|
|
105
|
-
<line num="201" count="1" type="stmt"/>
|
|
106
|
-
<line num="202" count="1" type="stmt"/>
|
|
107
|
-
<line num="204" count="1" type="stmt"/>
|
|
108
|
-
<line num="208" count="1" type="stmt"/>
|
|
109
|
-
<line num="209" count="1" type="stmt"/>
|
|
110
|
-
<line num="210" count="1" type="stmt"/>
|
|
111
|
-
<line num="211" count="1" type="stmt"/>
|
|
112
|
-
<line num="213" count="1" type="stmt"/>
|
|
113
|
-
<line num="214" count="2" type="stmt"/>
|
|
114
|
-
<line num="215" count="2" type="stmt"/>
|
|
115
|
-
<line num="217" count="1" type="stmt"/>
|
|
116
|
-
<line num="221" count="1" type="stmt"/>
|
|
117
|
-
<line num="222" count="1" type="stmt"/>
|
|
118
|
-
<line num="223" count="1" type="stmt"/>
|
|
119
|
-
<line num="227" count="1" type="stmt"/>
|
|
120
|
-
<line num="228" count="1" type="stmt"/>
|
|
121
|
-
<line num="229" count="1" type="stmt"/>
|
|
122
|
-
<line num="231" count="1" type="stmt"/>
|
|
123
|
-
<line num="235" count="1" type="stmt"/>
|
|
124
|
-
<line num="236" count="1" type="stmt"/>
|
|
125
|
-
<line num="237" count="1" type="stmt"/>
|
|
126
|
-
<line num="238" count="1" type="stmt"/>
|
|
127
|
-
<line num="240" count="1" type="stmt"/>
|
|
128
|
-
<line num="241" count="2" type="stmt"/>
|
|
129
|
-
<line num="242" count="2" type="stmt"/>
|
|
130
|
-
<line num="244" count="1" type="stmt"/>
|
|
131
|
-
<line num="248" count="2" type="stmt"/>
|
|
132
|
-
<line num="250" count="2" type="stmt"/>
|
|
133
|
-
<line num="251" count="2" type="stmt"/>
|
|
134
|
-
<line num="252" count="2" type="cond" truecount="1" falsecount="0"/>
|
|
135
|
-
<line num="253" count="2" type="cond" truecount="1" falsecount="0"/>
|
|
136
|
-
<line num="255" count="2" type="stmt"/>
|
|
137
|
-
<line num="266" count="2" type="cond" truecount="3" falsecount="0"/>
|
|
138
|
-
<line num="267" count="2" type="stmt"/>
|
|
139
|
-
<line num="270" count="2" type="cond" truecount="3" falsecount="0"/>
|
|
140
|
-
<line num="271" count="1" type="stmt"/>
|
|
141
|
-
<line num="274" count="2" type="cond" truecount="3" falsecount="0"/>
|
|
142
|
-
<line num="275" count="1" type="stmt"/>
|
|
143
|
-
<line num="278" count="2" type="stmt"/>
|
|
144
|
-
<line num="279" count="2" type="stmt"/>
|
|
145
|
-
<line num="284" count="3" type="stmt"/>
|
|
146
|
-
<line num="286" count="3" type="stmt"/>
|
|
147
|
-
<line num="288" count="3" type="stmt"/>
|
|
148
|
-
<line num="289" count="7" type="cond" truecount="4" falsecount="0"/>
|
|
149
|
-
<line num="290" count="7" type="stmt"/>
|
|
150
|
-
<line num="291" count="7" type="stmt"/>
|
|
151
|
-
<line num="292" count="7" type="stmt"/>
|
|
152
|
-
<line num="296" count="3" type="stmt"/>
|
|
153
|
-
<line num="298" count="3" type="stmt"/>
|
|
154
|
-
<line num="302" count="1" type="stmt"/>
|
|
155
|
-
<line num="304" count="1" type="stmt"/>
|
|
156
|
-
<line num="306" count="1" type="stmt"/>
|
|
157
|
-
<line num="308" count="1" type="stmt"/>
|
|
158
|
-
<line num="309" count="1" type="stmt"/>
|
|
159
|
-
<line num="310" count="1" type="stmt"/>
|
|
160
|
-
<line num="313" count="1" type="stmt"/>
|
|
161
|
-
<line num="315" count="1" type="stmt"/>
|
|
162
|
-
<line num="319" count="2" type="stmt"/>
|
|
163
|
-
<line num="320" count="2" type="cond" truecount="1" falsecount="0"/>
|
|
164
|
-
<line num="321" count="2" type="stmt"/>
|
|
165
|
-
<line num="329" count="2" type="stmt"/>
|
|
166
|
-
<line num="331" count="2" type="stmt"/>
|
|
167
|
-
<line num="339" count="2" type="stmt"/>
|
|
168
|
-
<line num="340" count="2" type="stmt"/>
|
|
169
|
-
<line num="341" count="2" type="stmt"/>
|
|
170
|
-
<line num="342" count="2" type="cond" truecount="1" falsecount="0"/>
|
|
171
|
-
<line num="343" count="1" type="stmt"/>
|
|
172
|
-
<line num="349" count="3" type="stmt"/>
|
|
173
|
-
<line num="356" count="3" type="stmt"/>
|
|
174
|
-
<line num="357" count="3" type="cond" truecount="3" falsecount="0"/>
|
|
175
|
-
<line num="358" count="2" type="stmt"/>
|
|
176
|
-
<line num="359" count="2" type="cond" truecount="2" falsecount="0"/>
|
|
177
|
-
<line num="361" count="1" type="stmt"/>
|
|
178
|
-
</file>
|
|
179
|
-
</project>
|
|
180
|
-
</coverage>
|