@cloudant/couchbackup 2.9.10-SNAPSHOT.113 → 2.9.11-SNAPSHOT.115

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.
Files changed (433) hide show
  1. package/.scannerwork/report-task.txt +2 -2
  2. package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
  3. package/.scannerwork/scanner-report/analysis.log +1 -1
  4. package/.scannerwork/scanner-report/changesets-12.pb +1 -0
  5. package/.scannerwork/scanner-report/changesets-13.pb +1 -0
  6. package/.scannerwork/scanner-report/changesets-2.pb +1 -0
  7. package/.scannerwork/scanner-report/changesets-28.pb +1 -0
  8. package/.scannerwork/scanner-report/changesets-29.pb +1 -0
  9. package/.scannerwork/scanner-report/changesets-3.pb +1 -0
  10. package/.scannerwork/scanner-report/changesets-31.pb +1 -0
  11. package/.scannerwork/scanner-report/changesets-34.pb +1 -0
  12. package/.scannerwork/scanner-report/changesets-35.pb +1 -0
  13. package/.scannerwork/scanner-report/changesets-36.pb +1 -0
  14. package/.scannerwork/scanner-report/changesets-39.pb +1 -0
  15. package/.scannerwork/scanner-report/changesets-4.pb +1 -0
  16. package/.scannerwork/scanner-report/changesets-42.pb +1 -0
  17. package/.scannerwork/scanner-report/changesets-65.pb +1 -0
  18. package/.scannerwork/scanner-report/changesets-7.pb +1 -0
  19. package/.scannerwork/scanner-report/changesets-8.pb +1 -0
  20. package/.scannerwork/scanner-report/component-1.pb +2 -2
  21. package/.scannerwork/scanner-report/component-10.pb +1 -1
  22. package/.scannerwork/scanner-report/component-11.pb +1 -1
  23. package/.scannerwork/scanner-report/component-12.pb +1 -0
  24. package/.scannerwork/scanner-report/component-13.pb +1 -1
  25. package/.scannerwork/scanner-report/component-14.pb +1 -1
  26. package/.scannerwork/scanner-report/component-2.pb +1 -0
  27. package/.scannerwork/scanner-report/component-26.pb +1 -1
  28. package/.scannerwork/scanner-report/component-27.pb +1 -1
  29. package/.scannerwork/scanner-report/component-28.pb +1 -0
  30. package/.scannerwork/scanner-report/component-29.pb +1 -0
  31. package/.scannerwork/scanner-report/component-3.pb +1 -0
  32. package/.scannerwork/scanner-report/component-30.pb +1 -1
  33. package/.scannerwork/scanner-report/component-31.pb +1 -0
  34. package/.scannerwork/scanner-report/component-32.pb +1 -1
  35. package/.scannerwork/scanner-report/component-33.pb +1 -1
  36. package/.scannerwork/scanner-report/component-34.pb +1 -0
  37. package/.scannerwork/scanner-report/component-35.pb +1 -0
  38. package/.scannerwork/scanner-report/component-36.pb +1 -0
  39. package/.scannerwork/scanner-report/component-37.pb +1 -0
  40. package/.scannerwork/scanner-report/component-38.pb +1 -0
  41. package/.scannerwork/scanner-report/component-39.pb +1 -0
  42. package/.scannerwork/scanner-report/component-4.pb +1 -0
  43. package/.scannerwork/scanner-report/component-42.pb +1 -0
  44. package/.scannerwork/scanner-report/component-45.pb +1 -1
  45. package/.scannerwork/scanner-report/component-49.pb +1 -1
  46. package/.scannerwork/scanner-report/component-5.pb +1 -1
  47. package/.scannerwork/scanner-report/component-52.pb +1 -1
  48. package/.scannerwork/scanner-report/component-53.pb +1 -1
  49. package/.scannerwork/scanner-report/component-54.pb +1 -1
  50. package/.scannerwork/scanner-report/component-55.pb +1 -1
  51. package/.scannerwork/scanner-report/component-56.pb +1 -1
  52. package/.scannerwork/scanner-report/component-57.pb +1 -1
  53. package/.scannerwork/scanner-report/component-58.pb +1 -1
  54. package/.scannerwork/scanner-report/component-59.pb +1 -1
  55. package/.scannerwork/scanner-report/component-6.pb +1 -1
  56. package/.scannerwork/scanner-report/component-60.pb +1 -1
  57. package/.scannerwork/scanner-report/component-61.pb +1 -1
  58. package/.scannerwork/scanner-report/component-62.pb +1 -1
  59. package/.scannerwork/scanner-report/component-63.pb +1 -1
  60. package/.scannerwork/scanner-report/component-64.pb +1 -1
  61. package/.scannerwork/scanner-report/component-65.pb +1 -0
  62. package/.scannerwork/scanner-report/component-67.pb +1 -1
  63. package/.scannerwork/scanner-report/component-7.pb +1 -0
  64. package/.scannerwork/scanner-report/component-8.pb +1 -0
  65. package/.scannerwork/scanner-report/component-9.pb +1 -1
  66. package/.scannerwork/scanner-report/coverages-10.pb +0 -0
  67. package/.scannerwork/scanner-report/coverages-11.pb +0 -0
  68. package/.scannerwork/scanner-report/coverages-12.pb +0 -0
  69. package/.scannerwork/scanner-report/coverages-13.pb +0 -0
  70. package/.scannerwork/scanner-report/coverages-14.pb +0 -0
  71. package/.scannerwork/scanner-report/coverages-2.pb +0 -0
  72. package/.scannerwork/scanner-report/coverages-26.pb +0 -0
  73. package/.scannerwork/scanner-report/coverages-27.pb +0 -0
  74. package/.scannerwork/scanner-report/coverages-28.pb +0 -0
  75. package/.scannerwork/scanner-report/coverages-3.pb +0 -0
  76. package/.scannerwork/scanner-report/coverages-30.pb +0 -0
  77. package/.scannerwork/scanner-report/coverages-31.pb +0 -0
  78. package/.scannerwork/scanner-report/coverages-32.pb +0 -0
  79. package/.scannerwork/scanner-report/coverages-33.pb +0 -0
  80. package/.scannerwork/scanner-report/coverages-34.pb +0 -0
  81. package/.scannerwork/scanner-report/coverages-35.pb +0 -0
  82. package/.scannerwork/scanner-report/coverages-36.pb +0 -0
  83. package/.scannerwork/scanner-report/coverages-39.pb +0 -0
  84. package/.scannerwork/scanner-report/coverages-4.pb +0 -0
  85. package/.scannerwork/scanner-report/coverages-42.pb +0 -0
  86. package/.scannerwork/scanner-report/coverages-45.pb +0 -0
  87. package/.scannerwork/scanner-report/coverages-49.pb +0 -0
  88. package/.scannerwork/scanner-report/coverages-5.pb +0 -0
  89. package/.scannerwork/scanner-report/coverages-52.pb +0 -0
  90. package/.scannerwork/scanner-report/coverages-53.pb +0 -0
  91. package/.scannerwork/scanner-report/coverages-54.pb +0 -0
  92. package/.scannerwork/scanner-report/coverages-55.pb +0 -0
  93. package/.scannerwork/scanner-report/coverages-56.pb +0 -0
  94. package/.scannerwork/scanner-report/coverages-57.pb +0 -0
  95. package/.scannerwork/scanner-report/coverages-58.pb +0 -0
  96. package/.scannerwork/scanner-report/coverages-59.pb +0 -0
  97. package/.scannerwork/scanner-report/coverages-6.pb +0 -0
  98. package/.scannerwork/scanner-report/coverages-60.pb +0 -0
  99. package/.scannerwork/scanner-report/coverages-61.pb +0 -0
  100. package/.scannerwork/scanner-report/coverages-62.pb +0 -0
  101. package/.scannerwork/scanner-report/coverages-63.pb +0 -0
  102. package/.scannerwork/scanner-report/coverages-64.pb +0 -0
  103. package/.scannerwork/scanner-report/coverages-7.pb +0 -0
  104. package/.scannerwork/scanner-report/coverages-8.pb +0 -0
  105. package/.scannerwork/scanner-report/coverages-9.pb +0 -0
  106. package/.scannerwork/scanner-report/duplications-14.pb +3 -0
  107. package/.scannerwork/scanner-report/duplications-26.pb +2 -1
  108. package/.scannerwork/scanner-report/duplications-27.pb +2 -0
  109. package/.scannerwork/scanner-report/duplications-28.pb +2 -0
  110. package/.scannerwork/scanner-report/duplications-32.pb +0 -2
  111. package/.scannerwork/scanner-report/duplications-33.pb +0 -2
  112. package/.scannerwork/scanner-report/duplications-4.pb +3 -0
  113. package/.scannerwork/scanner-report/duplications-42.pb +2 -0
  114. package/.scannerwork/scanner-report/duplications-45.pb +2 -0
  115. package/.scannerwork/scanner-report/duplications-49.pb +0 -3
  116. package/.scannerwork/scanner-report/duplications-5.pb +0 -2
  117. package/.scannerwork/scanner-report/duplications-55.pb +2 -0
  118. package/.scannerwork/scanner-report/duplications-56.pb +0 -3
  119. package/.scannerwork/scanner-report/duplications-59.pb +0 -2
  120. package/.scannerwork/scanner-report/duplications-6.pb +0 -2
  121. package/.scannerwork/scanner-report/duplications-60.pb +2 -0
  122. package/.scannerwork/scanner-report/duplications-61.pb +0 -3
  123. package/.scannerwork/scanner-report/duplications-9.pb +2 -0
  124. package/.scannerwork/scanner-report/measures-10.pb +0 -0
  125. package/.scannerwork/scanner-report/measures-11.pb +0 -0
  126. package/.scannerwork/scanner-report/measures-12.pb +0 -0
  127. package/.scannerwork/scanner-report/measures-13.pb +0 -0
  128. package/.scannerwork/scanner-report/measures-14.pb +0 -0
  129. package/.scannerwork/scanner-report/measures-2.pb +0 -0
  130. package/.scannerwork/scanner-report/measures-26.pb +0 -0
  131. package/.scannerwork/scanner-report/measures-27.pb +0 -0
  132. package/.scannerwork/scanner-report/measures-28.pb +15 -0
  133. package/.scannerwork/scanner-report/measures-3.pb +0 -0
  134. package/.scannerwork/scanner-report/measures-30.pb +0 -0
  135. package/.scannerwork/scanner-report/measures-31.pb +0 -0
  136. package/.scannerwork/scanner-report/measures-32.pb +0 -0
  137. package/.scannerwork/scanner-report/measures-33.pb +0 -0
  138. package/.scannerwork/scanner-report/measures-34.pb +0 -0
  139. package/.scannerwork/scanner-report/measures-35.pb +0 -0
  140. package/.scannerwork/scanner-report/measures-36.pb +0 -0
  141. package/.scannerwork/scanner-report/measures-37.pb +0 -0
  142. package/.scannerwork/scanner-report/measures-38.pb +0 -0
  143. package/.scannerwork/scanner-report/measures-39.pb +0 -0
  144. package/.scannerwork/scanner-report/measures-4.pb +0 -0
  145. package/.scannerwork/scanner-report/measures-42.pb +0 -0
  146. package/.scannerwork/scanner-report/measures-45.pb +0 -0
  147. package/.scannerwork/scanner-report/measures-49.pb +0 -0
  148. package/.scannerwork/scanner-report/measures-5.pb +0 -0
  149. package/.scannerwork/scanner-report/measures-52.pb +0 -0
  150. package/.scannerwork/scanner-report/measures-53.pb +0 -0
  151. package/.scannerwork/scanner-report/measures-54.pb +0 -0
  152. package/.scannerwork/scanner-report/measures-55.pb +0 -0
  153. package/.scannerwork/scanner-report/measures-56.pb +0 -0
  154. package/.scannerwork/scanner-report/measures-57.pb +0 -0
  155. package/.scannerwork/scanner-report/measures-58.pb +0 -0
  156. package/.scannerwork/scanner-report/measures-59.pb +0 -0
  157. package/.scannerwork/scanner-report/measures-6.pb +0 -0
  158. package/.scannerwork/scanner-report/measures-60.pb +0 -0
  159. package/.scannerwork/scanner-report/measures-61.pb +0 -0
  160. package/.scannerwork/scanner-report/measures-62.pb +0 -0
  161. package/.scannerwork/scanner-report/measures-63.pb +0 -0
  162. package/.scannerwork/scanner-report/measures-64.pb +0 -0
  163. package/.scannerwork/scanner-report/measures-67.pb +0 -0
  164. package/.scannerwork/scanner-report/measures-7.pb +0 -0
  165. package/.scannerwork/scanner-report/measures-8.pb +0 -0
  166. package/.scannerwork/scanner-report/measures-9.pb +0 -0
  167. package/.scannerwork/scanner-report/metadata.pb +0 -0
  168. package/.scannerwork/scanner-report/source-10.txt +21 -62
  169. package/.scannerwork/scanner-report/source-11.txt +121 -93
  170. package/.scannerwork/scanner-report/source-12.txt +92 -0
  171. package/.scannerwork/scanner-report/source-13.txt +63 -509
  172. package/.scannerwork/scanner-report/source-14.txt +228 -64
  173. package/.scannerwork/scanner-report/source-2.txt +68 -0
  174. package/.scannerwork/scanner-report/source-26.txt +110 -71
  175. package/.scannerwork/scanner-report/source-27.txt +199 -78
  176. package/.scannerwork/scanner-report/source-28.txt +293 -0
  177. package/.scannerwork/scanner-report/source-3.txt +47 -0
  178. package/.scannerwork/scanner-report/source-30.txt +557 -350
  179. package/.scannerwork/scanner-report/source-31.txt +35 -0
  180. package/.scannerwork/scanner-report/source-32.txt +11 -268
  181. package/.scannerwork/scanner-report/source-33.txt +47 -124
  182. package/.scannerwork/scanner-report/source-34.txt +147 -0
  183. package/.scannerwork/scanner-report/source-35.txt +77 -0
  184. package/.scannerwork/scanner-report/source-36.txt +56 -0
  185. package/.scannerwork/scanner-report/source-37.txt +509 -0
  186. package/.scannerwork/scanner-report/source-38.txt +509 -0
  187. package/.scannerwork/scanner-report/source-39.txt +418 -0
  188. package/.scannerwork/scanner-report/source-4.txt +119 -0
  189. package/.scannerwork/scanner-report/source-42.txt +175 -0
  190. package/.scannerwork/scanner-report/source-45.txt +144 -579
  191. package/.scannerwork/scanner-report/source-49.txt +89 -219
  192. package/.scannerwork/scanner-report/source-5.txt +80 -170
  193. package/.scannerwork/scanner-report/source-52.txt +14 -51
  194. package/.scannerwork/scanner-report/source-53.txt +88 -69
  195. package/.scannerwork/scanner-report/source-54.txt +31 -32
  196. package/.scannerwork/scanner-report/source-55.txt +77 -132
  197. package/.scannerwork/scanner-report/source-56.txt +57 -96
  198. package/.scannerwork/scanner-report/source-57.txt +100 -50
  199. package/.scannerwork/scanner-report/source-58.txt +160 -45
  200. package/.scannerwork/scanner-report/source-59.txt +106 -202
  201. package/.scannerwork/scanner-report/source-6.txt +130 -149
  202. package/.scannerwork/scanner-report/source-60.txt +59 -19
  203. package/.scannerwork/scanner-report/source-61.txt +257 -107
  204. package/.scannerwork/scanner-report/source-62.txt +25 -13
  205. package/.scannerwork/scanner-report/source-63.txt +149 -19
  206. package/.scannerwork/scanner-report/source-64.txt +82 -78
  207. package/.scannerwork/scanner-report/source-67.txt +51 -393
  208. package/.scannerwork/scanner-report/source-7.txt +34 -0
  209. package/.scannerwork/scanner-report/{source-47.txt → source-8.txt} +7 -14
  210. package/.scannerwork/scanner-report/source-9.txt +130 -41
  211. package/.scannerwork/scanner-report/symbols-10.pb +11 -30
  212. package/.scannerwork/scanner-report/symbols-11.pb +116 -28
  213. package/.scannerwork/scanner-report/symbols-12.pb +60 -0
  214. package/.scannerwork/scanner-report/symbols-13.pb +43 -0
  215. package/.scannerwork/scanner-report/symbols-14.pb +393 -45
  216. package/.scannerwork/scanner-report/symbols-2.pb +36 -0
  217. package/.scannerwork/scanner-report/symbols-26.pb +97 -44
  218. package/.scannerwork/scanner-report/symbols-27.pb +417 -41
  219. package/.scannerwork/scanner-report/symbols-28.pb +486 -0
  220. package/.scannerwork/scanner-report/symbols-3.pb +27 -0
  221. package/.scannerwork/scanner-report/symbols-30.pb +1181 -537
  222. package/.scannerwork/scanner-report/symbols-31.pb +17 -0
  223. package/.scannerwork/scanner-report/symbols-32.pb +14 -486
  224. package/.scannerwork/scanner-report/symbols-33.pb +44 -101
  225. package/.scannerwork/scanner-report/symbols-34.pb +85 -0
  226. package/.scannerwork/scanner-report/symbols-35.pb +30 -0
  227. package/.scannerwork/scanner-report/symbols-36.pb +19 -0
  228. package/.scannerwork/scanner-report/symbols-39.pb +610 -0
  229. package/.scannerwork/scanner-report/symbols-4.pb +77 -0
  230. package/.scannerwork/scanner-report/symbols-42.pb +153 -0
  231. package/.scannerwork/scanner-report/symbols-45.pb +179 -1253
  232. package/.scannerwork/scanner-report/symbols-49.pb +27 -393
  233. package/.scannerwork/scanner-report/symbols-5.pb +69 -180
  234. package/.scannerwork/scanner-report/symbols-52.pb +13 -35
  235. package/.scannerwork/scanner-report/symbols-53.pb +59 -60
  236. package/.scannerwork/scanner-report/symbols-54.pb +19 -26
  237. package/.scannerwork/scanner-report/symbols-55.pb +43 -84
  238. package/.scannerwork/scanner-report/symbols-56.pb +41 -72
  239. package/.scannerwork/scanner-report/symbols-57.pb +30 -45
  240. package/.scannerwork/scanner-report/symbols-58.pb +143 -42
  241. package/.scannerwork/scanner-report/symbols-59.pb +32 -417
  242. package/.scannerwork/scanner-report/symbols-6.pb +107 -148
  243. package/.scannerwork/scanner-report/symbols-60.pb +41 -16
  244. package/.scannerwork/scanner-report/symbols-61.pb +353 -96
  245. package/.scannerwork/scanner-report/symbols-62.pb +18 -9
  246. package/.scannerwork/scanner-report/symbols-63.pb +126 -10
  247. package/.scannerwork/scanner-report/symbols-64.pb +41 -68
  248. package/.scannerwork/scanner-report/symbols-7.pb +10 -0
  249. package/.scannerwork/scanner-report/symbols-8.pb +9 -0
  250. package/.scannerwork/scanner-report/symbols-9.pb +102 -19
  251. package/.scannerwork/scanner-report/syntax-highlightings-10.pb +39 -83
  252. package/.scannerwork/scanner-report/syntax-highlightings-11.pb +99 -103
  253. package/.scannerwork/scanner-report/syntax-highlightings-12.pb +110 -0
  254. package/.scannerwork/scanner-report/syntax-highlightings-13.pb +71 -3736
  255. package/.scannerwork/scanner-report/syntax-highlightings-14.pb +296 -62
  256. package/.scannerwork/scanner-report/syntax-highlightings-2.pb +95 -0
  257. package/.scannerwork/scanner-report/syntax-highlightings-26.pb +149 -57
  258. package/.scannerwork/scanner-report/syntax-highlightings-27.pb +299 -84
  259. package/.scannerwork/scanner-report/syntax-highlightings-28.pb +659 -0
  260. package/.scannerwork/scanner-report/syntax-highlightings-3.pb +68 -0
  261. package/.scannerwork/scanner-report/syntax-highlightings-30.pb +637 -398
  262. package/.scannerwork/scanner-report/syntax-highlightings-31.pb +63 -0
  263. package/.scannerwork/scanner-report/syntax-highlightings-32.pb +21 -626
  264. package/.scannerwork/scanner-report/syntax-highlightings-33.pb +70 -187
  265. package/.scannerwork/scanner-report/syntax-highlightings-34.pb +191 -0
  266. package/.scannerwork/scanner-report/syntax-highlightings-35.pb +103 -0
  267. package/.scannerwork/scanner-report/syntax-highlightings-36.pb +82 -0
  268. package/.scannerwork/scanner-report/syntax-highlightings-37.pb +3748 -0
  269. package/.scannerwork/scanner-report/syntax-highlightings-38.pb +3746 -0
  270. package/.scannerwork/scanner-report/syntax-highlightings-39.pb +648 -0
  271. package/.scannerwork/scanner-report/syntax-highlightings-4.pb +158 -0
  272. package/.scannerwork/scanner-report/syntax-highlightings-42.pb +214 -0
  273. package/.scannerwork/scanner-report/syntax-highlightings-45.pb +152 -814
  274. package/.scannerwork/scanner-report/syntax-highlightings-49.pb +101 -292
  275. package/.scannerwork/scanner-report/syntax-highlightings-5.pb +67 -187
  276. package/.scannerwork/scanner-report/syntax-highlightings-52.pb +15 -65
  277. package/.scannerwork/scanner-report/syntax-highlightings-53.pb +92 -69
  278. package/.scannerwork/scanner-report/syntax-highlightings-54.pb +32 -36
  279. package/.scannerwork/scanner-report/syntax-highlightings-55.pb +56 -157
  280. package/.scannerwork/scanner-report/syntax-highlightings-56.pb +58 -121
  281. package/.scannerwork/scanner-report/syntax-highlightings-57.pb +83 -80
  282. package/.scannerwork/scanner-report/syntax-highlightings-58.pb +207 -46
  283. package/.scannerwork/scanner-report/syntax-highlightings-59.pb +92 -294
  284. package/.scannerwork/scanner-report/syntax-highlightings-6.pb +175 -166
  285. package/.scannerwork/scanner-report/syntax-highlightings-60.pb +45 -30
  286. package/.scannerwork/scanner-report/syntax-highlightings-61.pb +250 -147
  287. package/.scannerwork/scanner-report/syntax-highlightings-62.pb +20 -18
  288. package/.scannerwork/scanner-report/syntax-highlightings-63.pb +179 -16
  289. package/.scannerwork/scanner-report/syntax-highlightings-64.pb +84 -73
  290. package/.scannerwork/scanner-report/syntax-highlightings-67.pb +728 -3527
  291. package/.scannerwork/scanner-report/syntax-highlightings-7.pb +50 -0
  292. package/.scannerwork/scanner-report/syntax-highlightings-8.pb +48 -0
  293. package/.scannerwork/scanner-report/syntax-highlightings-9.pb +200 -55
  294. package/CHANGES.md +6 -2
  295. package/package.json +1 -1
  296. package/test-16-results.xml +146 -146
  297. package/test-18-results.xml +149 -149
  298. package/test-iam-18-results.xml +50 -50
  299. package/.scannerwork/scanner-report/changesets-15.pb +0 -1
  300. package/.scannerwork/scanner-report/changesets-16.pb +0 -1
  301. package/.scannerwork/scanner-report/changesets-17.pb +0 -1
  302. package/.scannerwork/scanner-report/changesets-18.pb +0 -1
  303. package/.scannerwork/scanner-report/changesets-19.pb +0 -1
  304. package/.scannerwork/scanner-report/changesets-20.pb +0 -1
  305. package/.scannerwork/scanner-report/changesets-21.pb +0 -1
  306. package/.scannerwork/scanner-report/changesets-22.pb +0 -1
  307. package/.scannerwork/scanner-report/changesets-23.pb +0 -1
  308. package/.scannerwork/scanner-report/changesets-24.pb +0 -1
  309. package/.scannerwork/scanner-report/changesets-25.pb +0 -1
  310. package/.scannerwork/scanner-report/changesets-46.pb +0 -1
  311. package/.scannerwork/scanner-report/changesets-47.pb +0 -1
  312. package/.scannerwork/scanner-report/changesets-48.pb +0 -1
  313. package/.scannerwork/scanner-report/changesets-50.pb +0 -1
  314. package/.scannerwork/scanner-report/changesets-51.pb +0 -1
  315. package/.scannerwork/scanner-report/component-15.pb +0 -1
  316. package/.scannerwork/scanner-report/component-16.pb +0 -1
  317. package/.scannerwork/scanner-report/component-17.pb +0 -1
  318. package/.scannerwork/scanner-report/component-18.pb +0 -1
  319. package/.scannerwork/scanner-report/component-19.pb +0 -1
  320. package/.scannerwork/scanner-report/component-20.pb +0 -1
  321. package/.scannerwork/scanner-report/component-21.pb +0 -1
  322. package/.scannerwork/scanner-report/component-22.pb +0 -1
  323. package/.scannerwork/scanner-report/component-23.pb +0 -1
  324. package/.scannerwork/scanner-report/component-24.pb +0 -1
  325. package/.scannerwork/scanner-report/component-25.pb +0 -1
  326. package/.scannerwork/scanner-report/component-46.pb +0 -1
  327. package/.scannerwork/scanner-report/component-47.pb +0 -1
  328. package/.scannerwork/scanner-report/component-48.pb +0 -1
  329. package/.scannerwork/scanner-report/component-50.pb +0 -1
  330. package/.scannerwork/scanner-report/component-51.pb +0 -1
  331. package/.scannerwork/scanner-report/component-68.pb +0 -1
  332. package/.scannerwork/scanner-report/coverages-15.pb +0 -0
  333. package/.scannerwork/scanner-report/coverages-16.pb +0 -0
  334. package/.scannerwork/scanner-report/coverages-17.pb +0 -0
  335. package/.scannerwork/scanner-report/coverages-18.pb +0 -0
  336. package/.scannerwork/scanner-report/coverages-19.pb +0 -0
  337. package/.scannerwork/scanner-report/coverages-20.pb +0 -0
  338. package/.scannerwork/scanner-report/coverages-21.pb +0 -0
  339. package/.scannerwork/scanner-report/coverages-22.pb +0 -0
  340. package/.scannerwork/scanner-report/coverages-23.pb +0 -0
  341. package/.scannerwork/scanner-report/coverages-24.pb +0 -0
  342. package/.scannerwork/scanner-report/coverages-46.pb +0 -0
  343. package/.scannerwork/scanner-report/coverages-47.pb +0 -0
  344. package/.scannerwork/scanner-report/coverages-48.pb +0 -0
  345. package/.scannerwork/scanner-report/coverages-51.pb +0 -0
  346. package/.scannerwork/scanner-report/duplications-24.pb +0 -2
  347. package/.scannerwork/scanner-report/duplications-50.pb +0 -0
  348. package/.scannerwork/scanner-report/duplications-51.pb +0 -0
  349. package/.scannerwork/scanner-report/measures-15.pb +0 -0
  350. package/.scannerwork/scanner-report/measures-16.pb +0 -0
  351. package/.scannerwork/scanner-report/measures-17.pb +0 -0
  352. package/.scannerwork/scanner-report/measures-18.pb +0 -0
  353. package/.scannerwork/scanner-report/measures-19.pb +0 -0
  354. package/.scannerwork/scanner-report/measures-20.pb +0 -0
  355. package/.scannerwork/scanner-report/measures-21.pb +0 -16
  356. package/.scannerwork/scanner-report/measures-22.pb +0 -0
  357. package/.scannerwork/scanner-report/measures-23.pb +0 -0
  358. package/.scannerwork/scanner-report/measures-24.pb +0 -0
  359. package/.scannerwork/scanner-report/measures-46.pb +0 -0
  360. package/.scannerwork/scanner-report/measures-47.pb +0 -0
  361. package/.scannerwork/scanner-report/measures-48.pb +0 -0
  362. package/.scannerwork/scanner-report/measures-51.pb +0 -0
  363. package/.scannerwork/scanner-report/measures-68.pb +0 -0
  364. package/.scannerwork/scanner-report/source-15.txt +0 -41
  365. package/.scannerwork/scanner-report/source-16.txt +0 -118
  366. package/.scannerwork/scanner-report/source-17.txt +0 -46
  367. package/.scannerwork/scanner-report/source-18.txt +0 -31
  368. package/.scannerwork/scanner-report/source-19.txt +0 -281
  369. package/.scannerwork/scanner-report/source-20.txt +0 -111
  370. package/.scannerwork/scanner-report/source-21.txt +0 -178
  371. package/.scannerwork/scanner-report/source-22.txt +0 -129
  372. package/.scannerwork/scanner-report/source-23.txt +0 -164
  373. package/.scannerwork/scanner-report/source-24.txt +0 -75
  374. package/.scannerwork/scanner-report/source-46.txt +0 -142
  375. package/.scannerwork/scanner-report/source-48.txt +0 -156
  376. package/.scannerwork/scanner-report/source-51.txt +0 -36
  377. package/.scannerwork/scanner-report/source-68.txt +0 -167
  378. package/.scannerwork/scanner-report/symbols-15.pb +0 -18
  379. package/.scannerwork/scanner-report/symbols-16.pb +0 -30
  380. package/.scannerwork/scanner-report/symbols-17.pb +0 -20
  381. package/.scannerwork/scanner-report/symbols-18.pb +0 -14
  382. package/.scannerwork/scanner-report/symbols-19.pb +0 -354
  383. package/.scannerwork/scanner-report/symbols-20.pb +0 -59
  384. package/.scannerwork/scanner-report/symbols-21.pb +0 -144
  385. package/.scannerwork/scanner-report/symbols-22.pb +0 -33
  386. package/.scannerwork/scanner-report/symbols-23.pb +0 -126
  387. package/.scannerwork/scanner-report/symbols-24.pb +0 -42
  388. package/.scannerwork/scanner-report/symbols-46.pb +0 -116
  389. package/.scannerwork/scanner-report/symbols-47.pb +0 -14
  390. package/.scannerwork/scanner-report/symbols-48.pb +0 -112
  391. package/.scannerwork/scanner-report/symbols-51.pb +0 -11
  392. package/.scannerwork/scanner-report/syntax-highlightings-15.pb +0 -50
  393. package/.scannerwork/scanner-report/syntax-highlightings-16.pb +0 -113
  394. package/.scannerwork/scanner-report/syntax-highlightings-17.pb +0 -64
  395. package/.scannerwork/scanner-report/syntax-highlightings-18.pb +0 -45
  396. package/.scannerwork/scanner-report/syntax-highlightings-19.pb +0 -285
  397. package/.scannerwork/scanner-report/syntax-highlightings-20.pb +0 -133
  398. package/.scannerwork/scanner-report/syntax-highlightings-21.pb +0 -243
  399. package/.scannerwork/scanner-report/syntax-highlightings-22.pb +0 -129
  400. package/.scannerwork/scanner-report/syntax-highlightings-23.pb +0 -213
  401. package/.scannerwork/scanner-report/syntax-highlightings-24.pb +0 -78
  402. package/.scannerwork/scanner-report/syntax-highlightings-46.pb +0 -134
  403. package/.scannerwork/scanner-report/syntax-highlightings-47.pb +0 -54
  404. package/.scannerwork/scanner-report/syntax-highlightings-48.pb +0 -223
  405. package/.scannerwork/scanner-report/syntax-highlightings-51.pb +0 -59
  406. package/.scannerwork/scanner-report/syntax-highlightings-68.pb +0 -949
  407. /package/.scannerwork/scanner-report/{coverages-50.pb → coverages-29.pb} +0 -0
  408. /package/.scannerwork/scanner-report/{coverages-25.pb → coverages-65.pb} +0 -0
  409. /package/.scannerwork/scanner-report/{duplications-15.pb → duplications-12.pb} +0 -0
  410. /package/.scannerwork/scanner-report/{duplications-16.pb → duplications-13.pb} +0 -0
  411. /package/.scannerwork/scanner-report/{duplications-17.pb → duplications-2.pb} +0 -0
  412. /package/.scannerwork/scanner-report/{duplications-18.pb → duplications-29.pb} +0 -0
  413. /package/.scannerwork/scanner-report/{duplications-19.pb → duplications-3.pb} +0 -0
  414. /package/.scannerwork/scanner-report/{duplications-20.pb → duplications-31.pb} +0 -0
  415. /package/.scannerwork/scanner-report/{duplications-21.pb → duplications-34.pb} +0 -0
  416. /package/.scannerwork/scanner-report/{duplications-22.pb → duplications-35.pb} +0 -0
  417. /package/.scannerwork/scanner-report/{duplications-23.pb → duplications-36.pb} +0 -0
  418. /package/.scannerwork/scanner-report/{duplications-25.pb → duplications-39.pb} +0 -0
  419. /package/.scannerwork/scanner-report/{duplications-46.pb → duplications-62.pb} +0 -0
  420. /package/.scannerwork/scanner-report/{duplications-47.pb → duplications-65.pb} +0 -0
  421. /package/.scannerwork/scanner-report/{duplications-48.pb → duplications-7.pb} +0 -0
  422. /package/.scannerwork/scanner-report/{issues-46.pb → issues-11.pb} +0 -0
  423. /package/.scannerwork/scanner-report/{issues-49.pb → issues-14.pb} +0 -0
  424. /package/.scannerwork/scanner-report/{issues-50.pb → issues-29.pb} +0 -0
  425. /package/.scannerwork/scanner-report/{issues-54.pb → issues-3.pb} +0 -0
  426. /package/.scannerwork/scanner-report/{measures-50.pb → measures-29.pb} +0 -0
  427. /package/.scannerwork/scanner-report/{measures-25.pb → measures-65.pb} +0 -0
  428. /package/.scannerwork/scanner-report/{source-50.txt → source-29.txt} +0 -0
  429. /package/.scannerwork/scanner-report/{source-25.txt → source-65.txt} +0 -0
  430. /package/.scannerwork/scanner-report/{symbols-50.pb → symbols-29.pb} +0 -0
  431. /package/.scannerwork/scanner-report/{symbols-25.pb → symbols-65.pb} +0 -0
  432. /package/.scannerwork/scanner-report/{syntax-highlightings-50.pb → syntax-highlightings-29.pb} +0 -0
  433. /package/.scannerwork/scanner-report/{syntax-highlightings-25.pb → syntax-highlightings-65.pb} +0 -0
@@ -1,4 +1,4 @@
1
- // Copyright © 2018, 2021 IBM Corp. All rights reserved.
1
+ // Copyright © 2017, 2022 IBM Corp. All rights reserved.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -11,82 +11,101 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
-
15
- /* global describe it */
16
14
  'use strict';
17
15
 
18
16
  const fs = require('fs');
19
- const readline = require('readline');
20
- const u = require('./citestutils.js');
21
- const uuid = require('uuid').v4;
17
+ const liner = require('./liner.js');
18
+ const change = require('./change.js');
19
+ const error = require('./error.js');
20
+ const debug = require('debug')('couchbackup:spoolchanges');
22
21
 
23
- const params = { useApi: true };
22
+ /**
23
+ * Write log file for all changes from a database, ready for downloading
24
+ * in batches.
25
+ *
26
+ * @param {string} dbUrl - URL of database
27
+ * @param {string} log - path to log file to use
28
+ * @param {number} bufferSize - the number of changes per batch/log line
29
+ * @param {function(err)} callback - a callback to run on completion
30
+ */
31
+ module.exports = function(db, log, bufferSize, ee, callback) {
32
+ // list of document ids to process
33
+ const buffer = [];
34
+ let batch = 0;
35
+ let lastSeq = null;
36
+ const logStream = fs.createWriteStream(log);
37
+ let pending = 0;
38
+ // The number of changes to fetch per request
39
+ const limit = 100000;
24
40
 
25
- describe(u.scenario('Concurrent database backups', params), function() {
26
- it('should run concurrent API database backups correctly #slower', function(done) {
27
- // Allow up to 900 s to backup and compare (it should be much faster)!
28
- u.setTimeout(this, 900);
41
+ // send documents ids to the queue in batches of bufferSize + the last batch
42
+ const processBuffer = function(lastOne) {
43
+ if (buffer.length >= bufferSize || (lastOne && buffer.length > 0)) {
44
+ debug('writing', buffer.length, 'changes to the backup file');
45
+ const b = { docs: buffer.splice(0, bufferSize), batch: batch };
46
+ logStream.write(':t batch' + batch + ' ' + JSON.stringify(b.docs) + '\n');
47
+ ee.emit('changes', batch);
48
+ batch++;
49
+ }
50
+ };
29
51
 
30
- let doneCount = 0;
31
- let doneErr;
32
- const finished = function(err) {
33
- doneCount++;
34
- if (doneCount === 2) {
35
- done(doneErr || err);
52
+ // called once per received change
53
+ const onChange = function(c) {
54
+ if (c) {
55
+ if (c.error) {
56
+ ee.emit('error', new error.BackupError('InvalidChange', `Received invalid change: ${c}`));
57
+ } else if (c.changes) {
58
+ const obj = { id: c.id };
59
+ buffer.push(obj);
60
+ processBuffer(false);
61
+ } else if (c.last_seq) {
62
+ lastSeq = c.last_seq;
63
+ pending = c.pending;
36
64
  }
37
- doneErr = err;
38
- };
39
-
40
- const checkForEmptyBatches = function(fileName, cb) {
41
- let foundEmptyBatch = false;
42
-
43
- const rd = readline.createInterface({
44
- input: fs.createReadStream(fileName),
45
- output: fs.createWriteStream('/dev/null'),
46
- terminal: false
47
- });
48
-
49
- rd.on('line', function(line) {
50
- if (JSON.parse(line).length === 0) {
51
- // Note: Empty batch arrays indicate that the running backup is
52
- // incorrectly sharing a log file with another ongoing backup job.
53
- foundEmptyBatch = true;
54
- }
55
- });
56
-
57
- rd.on('close', function() {
58
- if (foundEmptyBatch) {
59
- cb(new Error(`Log file '${fileName}' contains empty batches`));
60
- } else {
61
- cb();
62
- }
63
- });
64
- };
65
+ }
66
+ };
65
67
 
66
- // [1] Run 'largedb2g' database backup
67
- const actualBackup1 = `./${uuid()}`;
68
- const output1 = fs.createWriteStream(actualBackup1);
69
- output1.on('open', function() {
70
- u.testBackup(params, 'largedb2g', output1, function(err) {
71
- if (err) {
72
- finished(err);
73
- } else {
74
- checkForEmptyBatches(actualBackup1, finished);
68
+ function getChanges(since = 0) {
69
+ debug('making changes request since ' + since);
70
+ return db.service.postChangesAsStream({ db: db.db, since: since, limit: limit, seqInterval: limit })
71
+ .then(response => {
72
+ response.result.pipe(liner())
73
+ .on('error', function(err) {
74
+ logStream.end();
75
+ callback(err);
76
+ })
77
+ .pipe(change(onChange))
78
+ .on('error', function(err) {
79
+ logStream.end();
80
+ callback(err);
81
+ })
82
+ .on('finish', function() {
83
+ processBuffer(true);
84
+ if (!lastSeq) {
85
+ logStream.end();
86
+ debug('changes request terminated before last_seq was sent');
87
+ callback(new error.BackupError('SpoolChangesError', 'Changes request terminated before last_seq was sent'));
88
+ } else {
89
+ debug(`changes request completed with last_seq: ${lastSeq} and ${pending} changes pending.`);
90
+ if (pending > 0) {
91
+ // Return the next promise
92
+ return getChanges(lastSeq);
93
+ } else {
94
+ debug('finished streaming database changes');
95
+ logStream.end(':changes_complete ' + lastSeq + '\n', 'utf8', callback);
96
+ }
97
+ }
98
+ });
99
+ })
100
+ .catch(err => {
101
+ logStream.end();
102
+ if (err.status && err.status >= 400) {
103
+ callback(error.convertResponseError(err));
104
+ } else if (err.name !== 'SpoolChangesError') {
105
+ callback(new error.BackupError('SpoolChangesError', `Failed changes request - ${err.message}`));
75
106
  }
76
107
  });
77
- });
108
+ }
78
109
 
79
- // [2] Run 'largedb1g' database backup
80
- const actualBackup2 = `./${uuid()}`;
81
- const output2 = fs.createWriteStream(actualBackup2);
82
- output2.on('open', function() {
83
- u.testBackup(params, 'largedb1g', output2, function(err) {
84
- if (err) {
85
- finished(err);
86
- } else {
87
- checkForEmptyBatches(actualBackup2, finished);
88
- }
89
- });
90
- });
91
- });
92
- });
110
+ getChanges();
111
+ };
@@ -1,4 +1,4 @@
1
- // Copyright © 2017, 2018 IBM Corp. All rights reserved.
1
+ // Copyright © 2017 IBM Corp. All rights reserved.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -11,37 +11,36 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
-
15
- /* global describe it */
16
14
  'use strict';
17
15
 
18
- const assert = require('assert');
19
- const fs = require('fs');
20
- const u = require('./citestutils.js');
16
+ // stolen from http://strongloop.com/strongblog/practical-examples-of-the-new-node-js-streams-api/
17
+ const stream = require('stream');
18
+
19
+ module.exports = function() {
20
+ const liner = new stream.Transform({ objectMode: true });
21
+
22
+ liner._transform = function(chunk, encoding, done) {
23
+ let data = chunk.toString();
24
+ if (this._lastLineData) {
25
+ data = this._lastLineData + data;
26
+ }
27
+
28
+ const lines = data.split('\n');
29
+ this._lastLineData = lines.splice(lines.length - 1, 1)[0];
30
+
31
+ for (const i in lines) {
32
+ this.push(lines[i]);
33
+ }
34
+ done();
35
+ };
36
+
37
+ liner._flush = function(done) {
38
+ if (this._lastLineData) {
39
+ this.push(this._lastLineData);
40
+ }
41
+ this._lastLineData = null;
42
+ done();
43
+ };
21
44
 
22
- describe('Write error tests', function() {
23
- it('calls callback with error set when stream is not writeable', function(done) {
24
- u.setTimeout(this, 10);
25
- const dirname = fs.mkdtempSync('test_backup_');
26
- // make temp dir read only
27
- fs.chmodSync(dirname, 0o444);
28
- const filename = dirname + '/test.backup';
29
- const backupStream = fs.createWriteStream(filename, { flags: 'w' });
30
- const params = { useApi: true };
31
- // try to do backup and check err was set in callback
32
- u.testBackup(params, 'animaldb', backupStream, function(resultErr) {
33
- let err = null;
34
- try {
35
- // cleanup temp dir
36
- fs.rmdirSync(dirname);
37
- // error should have been set
38
- assert.ok(resultErr);
39
- assert.strictEqual(resultErr.code, 'EACCES');
40
- } catch (thrownErr) {
41
- err = thrownErr;
42
- } finally {
43
- done(err);
44
- }
45
- });
46
- });
47
- });
45
+ return liner;
46
+ };
@@ -1,4 +1,4 @@
1
- // Copyright © 2017, 2021 IBM Corp. All rights reserved.
1
+ // Copyright © 2017 IBM Corp. All rights reserved.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -11,137 +11,82 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
-
15
- /* global describe it beforeEach */
16
14
  'use strict';
17
15
 
18
- const assert = require('assert');
19
16
  const fs = require('fs');
20
- const nock = require('nock');
21
- const request = require('../includes/request.js');
22
- const writer = require('../includes/writer.js');
23
- const noopEmitter = new (require('events')).EventEmitter();
24
- const liner = require('../includes/liner.js');
25
-
26
- const longTestTimeout = 3000;
27
-
28
- // The writer expects a line-by-line stream so this utility function does that
29
- // processing for the tests (which normally happens in the internal restore
30
- // function).
31
- function testLinestream(fixture = './test/fixtures/animaldb_expected.json') {
32
- return fs.createReadStream(fixture)
33
- .pipe(liner());
34
- }
35
-
36
- describe('#unit Check database restore writer', function() {
37
- const dbUrl = 'http://localhost:5984/animaldb';
38
- const db = request.client(dbUrl, { parallelism: 1 });
39
-
40
- beforeEach('Reset nocks', function() {
41
- nock.cleanAll();
42
- });
43
-
44
- it('should complete successfully', function(done) {
45
- nock(dbUrl)
46
- .post('/_bulk_docs')
47
- .reply(200, []); // success
48
-
49
- testLinestream()
50
- .pipe(writer(db, 500, 1, noopEmitter))
51
- .on('error', function(err) {
52
- done(err);
53
- })
54
- .on('finished', function(data) {
55
- assert.strictEqual(data.total, 15);
56
- assert.ok(nock.isDone());
57
- done();
58
- });
59
- });
60
-
61
- it('should terminate on a fatal error', function(done) {
62
- nock(dbUrl)
63
- .post('/_bulk_docs')
64
- .reply(401, { error: 'Unauthorized' }); // fatal error
65
-
66
- testLinestream()
67
- .pipe(writer(db, 500, 1, noopEmitter))
68
- .on('error', function(err) {
69
- assert.strictEqual(err.name, 'Unauthorized');
70
- assert.strictEqual(err.message, 'Access is denied due to invalid credentials.');
71
- assert.ok(nock.isDone());
72
- done();
73
- });
74
- });
75
-
76
- it('should retry on transient errors', function(done) {
77
- nock(dbUrl)
78
- .post('/_bulk_docs')
79
- .reply(429, { error: 'Too Many Requests' }) // transient error
80
- .post('/_bulk_docs')
81
- .reply(500, { error: 'Internal Server Error' }) // transient error
82
- .post('/_bulk_docs')
83
- .reply(200, { ok: true }); // third time lucky success
84
-
85
- testLinestream()
86
- .pipe(writer(db, 500, 1, noopEmitter))
87
- .on('error', function(err) {
88
- done(err);
89
- })
90
- .on('finished', function(data) {
91
- assert.strictEqual(data.total, 15);
92
- assert.ok(nock.isDone());
93
- done();
94
- });
95
- }).timeout(longTestTimeout);
96
-
97
- it('should fail after 3 transient errors', function(done) {
98
- nock(dbUrl)
99
- .post('/_bulk_docs')
100
- .reply(429, { error: 'Too Many Requests' }) // transient error
101
- .post('/_bulk_docs')
102
- .reply(500, { error: 'Internal Server Error' }) // transient error
103
- .post('/_bulk_docs')
104
- .reply(503, { error: 'Service Unavailable' }); // Final transient error
105
-
106
- testLinestream()
107
- .pipe(writer(db, 500, 1, noopEmitter))
108
- .on('error', function(err) {
109
- assert.strictEqual(err.name, 'HTTPFatalError');
110
- assert.strictEqual(err.message, `503 : post ${dbUrl}/_bulk_docs - Error: Service Unavailable`);
111
- assert.ok(nock.isDone());
112
- done();
113
- });
114
- }).timeout(longTestTimeout);
115
-
116
- it('should restore shallow backups without rev info successfully', function(done) {
117
- nock(dbUrl)
118
- .post('/_bulk_docs')
119
- .reply(200, [{ ok: true, id: 'foo', rev: '1-abc' }]); // success
120
-
121
- testLinestream('./test/fixtures/animaldb_old_shallow.json')
122
- .pipe(writer(db, 500, 1, noopEmitter))
123
- .on('error', function(err) {
124
- done(err);
125
- })
126
- .on('finished', function(data) {
127
- assert.strictEqual(data.total, 11);
128
- assert.ok(nock.isDone());
129
- done();
130
- });
131
- });
132
-
133
- it('should get a batch error for non-empty array response with new_edits false', function(done) {
134
- nock(dbUrl)
135
- .post('/_bulk_docs')
136
- .reply(200, [{ id: 'foo', error: 'foo', reason: 'bar' }]);
137
-
138
- testLinestream()
139
- .pipe(writer(db, 500, 1, noopEmitter))
140
- .on('error', function(err) {
141
- assert.strictEqual(err.name, 'Error');
142
- assert.strictEqual(err.message, 'Error writing batch with new_edits:false and 1 items');
143
- assert.ok(nock.isDone());
144
- done();
145
- });
146
- });
147
- });
17
+ const stream = require('stream');
18
+ const liner = require('./liner.js');
19
+
20
+ const onLine = function(onCommand, getDocs) {
21
+ const change = new stream.Transform({ objectMode: true });
22
+
23
+ change._transform = function(line, encoding, done) {
24
+ if (line && line[0] === ':') {
25
+ const obj = {
26
+ command: null,
27
+ batch: null,
28
+ docs: []
29
+ };
30
+
31
+ let matches;
32
+
33
+ // extract command
34
+ matches = line.match(/^:([a-z_]+) ?/);
35
+ if (matches) {
36
+ obj.command = matches[1];
37
+ }
38
+
39
+ // extract batch
40
+ matches = line.match(/ batch([0-9]+)/);
41
+ if (matches) {
42
+ obj.batch = parseInt(matches[1]);
43
+ }
44
+
45
+ // extract doc ids
46
+ if (getDocs && obj.command === 't') {
47
+ const json = line.replace(/^.* batch[0-9]+ /, '').trim();
48
+ obj.docs = JSON.parse(json);
49
+ }
50
+ onCommand(obj);
51
+ }
52
+ done();
53
+ };
54
+ return change;
55
+ };
56
+
57
+ /**
58
+ * Generate a list of remaining batches from a download file.
59
+ *
60
+ * @param {string} log - log file name
61
+ * @param {function} callback - callback with err, {changesComplete: N, batches: N}.
62
+ * changesComplete signifies whether the log file appeared to
63
+ * have completed reading the changes feed (contains :changes_complete).
64
+ * batches are remaining batch IDs for download.
65
+ */
66
+ module.exports = function(log, callback) {
67
+ // our sense of state
68
+ const state = {
69
+
70
+ };
71
+ let changesComplete = false;
72
+
73
+ // called with each line from the log file
74
+ const onCommand = function(obj) {
75
+ if (obj.command === 't') {
76
+ state[obj.batch] = true;
77
+ } else if (obj.command === 'd') {
78
+ delete state[obj.batch];
79
+ } else if (obj.command === 'changes_complete') {
80
+ changesComplete = true;
81
+ }
82
+ };
83
+
84
+ // stream through the previous log file
85
+ fs.createReadStream(log)
86
+ .pipe(liner())
87
+ .pipe(onLine(onCommand, false))
88
+ .on('finish', function() {
89
+ const obj = { changesComplete: changesComplete, batches: state };
90
+ callback(null, obj);
91
+ });
92
+ };
@@ -1,4 +1,4 @@
1
- // Copyright © 2017 IBM Corp. All rights reserved.
1
+ // Copyright © 2017, 2022 IBM Corp. All rights reserved.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -11,109 +11,70 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
-
15
- /* global describe it */
16
14
  'use strict';
17
15
 
18
- const assert = require('assert');
19
- const fs = require('fs');
20
- const u = require('./citestutils.js');
16
+ const async = require('async');
17
+ const error = require('./error.js');
18
+ const events = require('events');
21
19
 
22
- [{ useApi: true }, { useApi: false }].forEach(function(params) {
23
- describe(u.scenario('Resume tests', params), function() {
24
- it('should create a log file', function(done) {
25
- // Allow up to 90 s for this test
26
- u.setTimeout(this, 60);
20
+ module.exports = function(db, options) {
21
+ const ee = new events.EventEmitter();
22
+ const start = new Date().getTime();
23
+ let batch = 0;
24
+ let hasErrored = false;
25
+ let startKey = null;
26
+ let total = 0;
27
27
 
28
- const actualBackup = `./${this.fileName}`;
29
- const logFile = `./${this.fileName}` + '.log';
30
- // Use abort parameter to terminate the backup a given number of ms after
31
- // the first data write to the output file.
32
- const p = u.p(params, { opts: { log: logFile } });
33
- u.testBackupToFile(p, 'animaldb', actualBackup, function(err) {
34
- if (err) {
35
- done(err);
36
- } else {
37
- // Assert the log file exists
38
- try {
39
- assert.ok(fs.existsSync(logFile), 'The log file should exist.');
40
- done();
41
- } catch (err) {
42
- done(err);
43
- }
44
- }
45
- });
46
- });
28
+ async.doUntil(
29
+ function(callback) {
30
+ // Note, include_docs: true is set automatically when using the
31
+ // fetch function.
32
+ const opts = { db: db.db, limit: options.bufferSize, includeDocs: true };
47
33
 
48
- it('should restore corrupted animaldb to a database correctly', function(done) {
49
- // Allow up to 60 s to restore and compare (again it should be faster)!
50
- u.setTimeout(this, 60);
51
- const input = fs.createReadStream('./test/fixtures/animaldb_corrupted.json');
52
- const dbName = this.dbName;
53
- input.on('open', function() {
54
- u.testRestore(params, input, dbName, function(err) {
55
- if (err) {
56
- done(err);
34
+ // To avoid double fetching a document solely for the purposes of getting
35
+ // the next ID to use as a startKey for the next page we instead use the
36
+ // last ID of the current page and append the lowest unicode sort
37
+ // character.
38
+ if (startKey) opts.startKey = `${startKey}\0`;
39
+ db.service.postAllDocs(opts).then(response => {
40
+ const body = response.result;
41
+ if (!body.rows) {
42
+ ee.emit('error', new error.BackupError(
43
+ 'AllDocsError', 'ERROR: Invalid all docs response'));
44
+ callback();
45
+ } else {
46
+ if (body.rows.length < opts.limit) {
47
+ startKey = null; // last batch
57
48
  } else {
58
- u.dbCompare('animaldb', dbName, done);
49
+ startKey = body.rows[opts.limit - 1].id;
59
50
  }
60
- });
61
- });
62
- });
63
51
 
64
- it('should restore resumed animaldb with blank line to a database correctly', function(done) {
65
- // Allow up to 60 s to restore and compare (again it should be faster)!
66
- u.setTimeout(this, 60);
67
- const input = fs.createReadStream('./test/fixtures/animaldb_resumed_blank.json');
68
- const dbName = this.dbName;
69
- input.on('open', function() {
70
- u.testRestore(params, input, dbName, function(err) {
71
- if (err) {
72
- done(err);
73
- } else {
74
- u.dbCompare('animaldb', dbName, done);
52
+ const docs = [];
53
+ body.rows.forEach(function(doc) {
54
+ docs.push(doc.doc);
55
+ });
56
+
57
+ if (docs.length > 0) {
58
+ ee.emit('received', {
59
+ batch: batch++,
60
+ data: docs,
61
+ length: docs.length,
62
+ time: (new Date().getTime() - start) / 1000,
63
+ total: total += docs.length
64
+ });
75
65
  }
76
- });
66
+ callback();
67
+ }
68
+ }).catch(err => {
69
+ err = error.convertResponseError(err);
70
+ ee.emit('error', err);
71
+ hasErrored = true;
72
+ callback();
77
73
  });
78
- });
79
- });
80
- });
81
-
82
- describe('Resume tests', function() {
83
- // Currently cannot abort API backups, when we do this test should be run for
84
- // both API and CLI
85
- it('should correctly backup and restore backup10m', function(done) {
86
- // Allow up to 90 s for this test
87
- u.setTimeout(this, 90);
88
-
89
- const actualBackup = `./${this.fileName}`;
90
- const logFile = `./${this.fileName}` + '.log';
91
- // Use abort parameter to terminate the backup a given number of ms after
92
- // the first data write to the output file.
93
- const p = u.p(params, { abort: true }, { opts: { log: logFile } });
94
- const restoreDb = this.dbName;
95
- // Set the database doc count as fewer than this should be written during
96
- // resumed backup.
97
- p.exclusiveMaxExpected = 5096;
98
-
99
- u.testBackupAbortResumeRestore(p, 'backup10m', actualBackup, restoreDb, done);
100
- });
101
- // Note --output is only valid for CLI usage, this test should only run for CLI
102
- const params = { useApi: false };
103
- it('should correctly backup and restore backup10m using --output', function(done) {
104
- // Allow up to 90 s for this test
105
- u.setTimeout(this, 90);
106
-
107
- const actualBackup = `./${this.fileName}`;
108
- const logFile = `./${this.fileName}` + '.log';
109
- // Use abort parameter to terminate the backup a given number of ms after
110
- // the first data write to the output file.
111
- const p = u.p(params, { abort: true }, { opts: { output: actualBackup, log: logFile } });
112
- const restoreDb = this.dbName;
113
- // Set the database doc count as fewer than this should be written during
114
- // resumed backup.
115
- p.exclusiveMaxExpected = 5096;
74
+ },
75
+ function(callback) { callback(null, hasErrored || startKey == null); },
76
+ function() { ee.emit('finished', { total: total }); }
77
+ );
116
78
 
117
- u.testBackupAbortResumeRestore(p, 'backup10m', actualBackup, restoreDb, done);
118
- });
119
- });
79
+ return ee;
80
+ };