w-serv-orm 1.1.17 → 1.1.18
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/README.md +1 -0
- package/dist/w-serv-orm.umd.js +2 -2
- package/dist/w-serv-orm.umd.js.map +1 -1
- package/docs/WServOrm.html +5 -3
- package/docs/WServOrm.mjs.html +4 -2
- package/docs/baseline.mjs.html +2 -2
- package/docs/global.html +166 -2
- package/docs/index.html +2 -2
- package/docs/isOrmFail.mjs.html +102 -0
- package/package.json +1 -1
- package/src/WServOrm.mjs +2 -0
- package/src/genTestData.mjs +6 -0
- package/src/getDb.mjs +1 -1
- package/src/getDbBackupAndRecover.mjs +44 -0
- package/src/getMapOrm.mjs +41 -2
- package/src/isOrmFail.mjs +30 -0
- package/test/api-procOrm.test.mjs +142 -0
- package/test/unit-getDb.test.mjs +78 -0
- package/test/unit-isOrmFail.test.mjs +35 -0
- package/test/unit-mapOrm.test.mjs +213 -0
- package/test/unit-ormsites.test.mjs +61 -0
package/docs/WServOrm.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#isOrmFail">isOrmFail</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -78,6 +78,8 @@
|
|
|
78
78
|
<p>每次呼叫各自建立資料表ORM、設定與擴充函數,同一行程內之多個實例互不干擾;同一url與db之資料庫資源能否並存,依所用ORM而定。</p>
|
|
79
79
|
<p>procOrm之save、del與mix,於ORM回傳之逐筆結果有任一筆ok為0(單筆失敗)時reject,訊息列出失敗筆之主鍵,如'failed to save data: id[b]'(超過100字元者截斷顯示;無有效主鍵者以data[k]列其於輸入內之位置,k自0起;超過10筆者只列前10筆並附總筆數),錯誤原文另由console.log輸出。
|
|
80
80
|
單筆失敗不中斷整批,故reject時其餘筆數已寫入。
|
|
81
|
+
寫入類函數之回傳凡可表達失敗者一律檢查,失敗即reject或拋錯,不當成功(規則帳本R-ORM-RESULT-01):save、del與mix之del、diff若ORM改回聚合物件而ok為0(非契約形狀,無從逐筆列出)亦視為失敗,以固定字串'failed to save data'、'failed to delete data'、'failed to update data'reject,mix之del、diff遇此視為整批性錯誤而立即reject,後續步驟不執行;delAll依契約回傳聚合物件且ok恆為1(錯誤皆整批reject),ok為0(或回傳逐筆陣列而任一筆ok為0)以固定字串'failed to delete data'reject;讀取類select之回傳為數據列(列內欄位可能名為ok),失敗只以reject表達,不檢查ok。
|
|
82
|
+
insert(含mix之新增)依ORM契約回傳聚合物件且ok恆為1(錯誤皆整批reject);ORM若resolve聚合物件而ok為0,或回傳逐筆陣列(非insert契約形狀)而任一筆ok為0(違約或他種後端),亦視為失敗,以固定字串'failed to insert data'reject(錯誤原文另由console.log輸出),已寫入之筆無從回復;mix之新增遇此視為整批性錯誤而立即reject,後續del、diff步驟不執行。回傳undefined、null、無ok鍵之物件、空陣列或逐筆皆ok非0之陣列者不檢查,維持舊行為;略過既有主鍵(n為0、ok為1)為正常結果。備份還原(recover)之逐表insert同此判準,失敗時於該表停止並以Error reject(訊息為'failed to recover data into table[表名]: '接ORM回傳原文,逐筆陣列則列失敗筆{k,id,err},至多前10筆並附總筆數,另列先前已寫入之表),之後之表不寫入,先前之表與該表已被ORM寫入之筆無從回復。
|
|
81
83
|
mix之各步驟遇單筆失敗不中斷後續步驟,待全部步驟完成後一併reject;遇整批性錯誤則立即reject,後續步驟不執行。mix於resolve時回傳各步驟所處理之列之id(依add、del、diff之序串接,del之列不分是否命中)。</p>
|
|
82
84
|
<p>insert、save與mix之新增、修改,數據未帶有效主鍵(未給、null、空字串,或非字串非數字之值,含NaN與±Infinity)者,若資料表之主鍵欄為id且為字串型(或型別未知;型別如STRING(36)者以括號前之字判定),由本套件產生主鍵(同各ORM之genIDSeq)並於resolve時回傳;單一空物件與只含一個空物件之陣列不補(ORM視為無效輸入而不寫入),多筆批次中之空物件列則補。
|
|
83
85
|
主鍵欄為字串型(或型別未知)之資料表,主鍵為有限數字者一律以其字串形式處置(如123視為'123'):寫入、resolve回傳、del與mix之刪除,以及select、delAll條件中主鍵之比較($eq、$ne、$gt、$gte、$lt、$lte、$in、$nin,含$and、$or之內)皆同,故以數字或其字串形式寫入、查詢與刪除者為同一筆,範圍比較依字串之字典序;主鍵欄為整數型者不轉型。轉型只作用於procOrm,經woItems直接操作者不轉型。舊版w-orm-mongodb(2025-04-29以前)保留之數字主鍵資料,以數字查詢將查不到。
|
|
@@ -109,7 +111,7 @@ insert、save與mix之新增、修改,寫入前各欄位之字串皆經wsemi
|
|
|
109
111
|
|
|
110
112
|
<dt class="tag-source">Source:</dt>
|
|
111
113
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
112
|
-
<a href="WServOrm.mjs.html">WServOrm.mjs</a>, <a href="WServOrm.mjs.html#
|
|
114
|
+
<a href="WServOrm.mjs.html">WServOrm.mjs</a>, <a href="WServOrm.mjs.html#line143">line 143</a>
|
|
113
115
|
</li></ul></dd>
|
|
114
116
|
|
|
115
117
|
|
|
@@ -452,7 +454,7 @@ insert、save與mix之新增、修改,寫入前各欄位之字串皆經wsemi
|
|
|
452
454
|
<br class="clear">
|
|
453
455
|
|
|
454
456
|
<footer>
|
|
455
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026
|
|
457
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 14:34:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
456
458
|
</footer>
|
|
457
459
|
|
|
458
460
|
<script>prettyPrint();</script>
|
package/docs/WServOrm.mjs.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#isOrmFail">isOrmFail</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -92,6 +92,8 @@ function mkErrBaseline(c) {
|
|
|
92
92
|
*
|
|
93
93
|
* procOrm之save、del與mix,於ORM回傳之逐筆結果有任一筆ok為0(單筆失敗)時reject,訊息列出失敗筆之主鍵,如'failed to save data: id[b]'(超過100字元者截斷顯示;無有效主鍵者以data[k]列其於輸入內之位置,k自0起;超過10筆者只列前10筆並附總筆數),錯誤原文另由console.log輸出。
|
|
94
94
|
* 單筆失敗不中斷整批,故reject時其餘筆數已寫入。
|
|
95
|
+
* 寫入類函數之回傳凡可表達失敗者一律檢查,失敗即reject或拋錯,不當成功(規則帳本R-ORM-RESULT-01):save、del與mix之del、diff若ORM改回聚合物件而ok為0(非契約形狀,無從逐筆列出)亦視為失敗,以固定字串'failed to save data'、'failed to delete data'、'failed to update data'reject,mix之del、diff遇此視為整批性錯誤而立即reject,後續步驟不執行;delAll依契約回傳聚合物件且ok恆為1(錯誤皆整批reject),ok為0(或回傳逐筆陣列而任一筆ok為0)以固定字串'failed to delete data'reject;讀取類select之回傳為數據列(列內欄位可能名為ok),失敗只以reject表達,不檢查ok。
|
|
96
|
+
* insert(含mix之新增)依ORM契約回傳聚合物件且ok恆為1(錯誤皆整批reject);ORM若resolve聚合物件而ok為0,或回傳逐筆陣列(非insert契約形狀)而任一筆ok為0(違約或他種後端),亦視為失敗,以固定字串'failed to insert data'reject(錯誤原文另由console.log輸出),已寫入之筆無從回復;mix之新增遇此視為整批性錯誤而立即reject,後續del、diff步驟不執行。回傳undefined、null、無ok鍵之物件、空陣列或逐筆皆ok非0之陣列者不檢查,維持舊行為;略過既有主鍵(n為0、ok為1)為正常結果。備份還原(recover)之逐表insert同此判準,失敗時於該表停止並以Error reject(訊息為'failed to recover data into table[表名]: '接ORM回傳原文,逐筆陣列則列失敗筆{k,id,err},至多前10筆並附總筆數,另列先前已寫入之表),之後之表不寫入,先前之表與該表已被ORM寫入之筆無從回復。
|
|
95
97
|
* mix之各步驟遇單筆失敗不中斷後續步驟,待全部步驟完成後一併reject;遇整批性錯誤則立即reject,後續步驟不執行。mix於resolve時回傳各步驟所處理之列之id(依add、del、diff之序串接,del之列不分是否命中)。
|
|
96
98
|
*
|
|
97
99
|
* insert、save與mix之新增、修改,數據未帶有效主鍵(未給、null、空字串,或非字串非數字之值,含NaN與±Infinity)者,若資料表之主鍵欄為id且為字串型(或型別未知;型別如STRING(36)者以括號前之字判定),由本套件產生主鍵(同各ORM之genIDSeq)並於resolve時回傳;單一空物件與只含一個空物件之陣列不補(ORM視為無效輸入而不寫入),多筆批次中之空物件列則補。
|
|
@@ -290,7 +292,7 @@ export default WServOrm
|
|
|
290
292
|
<br class="clear">
|
|
291
293
|
|
|
292
294
|
<footer>
|
|
293
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026
|
|
295
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 14:34:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
294
296
|
</footer>
|
|
295
297
|
|
|
296
298
|
<script>prettyPrint();</script>
|
package/docs/baseline.mjs.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#isOrmFail">isOrmFail</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -611,7 +611,7 @@ export { BASELINE_VERSION, BASELINE_REJECT, cyrb53, checkContract, digestRow, bu
|
|
|
611
611
|
<br class="clear">
|
|
612
612
|
|
|
613
613
|
<footer>
|
|
614
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026
|
|
614
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 14:34:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
615
615
|
</footer>
|
|
616
616
|
|
|
617
617
|
<script>prettyPrint();</script>
|
package/docs/global.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#isOrmFail">isOrmFail</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -1409,6 +1409,170 @@ rowsNow 內之主鍵缺漏或重複拋 key 為 'rowsInvalid' 之Error(庫內資
|
|
|
1409
1409
|
|
|
1410
1410
|
|
|
1411
1411
|
|
|
1412
|
+
<h4 class="name" id="isOrmFail"><span class="type-signature"></span>isOrmFail<span class="signature">(r)</span><span class="type-signature"> → {Boolean}</span></h4>
|
|
1413
|
+
|
|
1414
|
+
|
|
1415
|
+
|
|
1416
|
+
|
|
1417
|
+
|
|
1418
|
+
|
|
1419
|
+
<dl class="details">
|
|
1420
|
+
|
|
1421
|
+
<dt class="tag-description">Description:</dt>
|
|
1422
|
+
<dd class="tag-description"><ul class="dummy"><li><p>判斷ORM寫入類函數(insert、save、del、delAll)之回傳結果是否回報失敗</p>
|
|
1423
|
+
<p>依w-orm系列規格,insert與delAll回傳聚合物件且ok恆為1,save與del回傳逐筆陣列,錯誤皆整批reject;單筆失敗者(save、del)於該筆以ok為0回報。
|
|
1424
|
+
本函數不論函數與形狀一律判讀:回傳為聚合物件(非null、非陣列之物件)而ok為0者(ORM違約或他種後端)視為失敗;
|
|
1425
|
+
回傳為逐筆陣列而任一筆ok為0者(同getItemsFail之判讀)視為失敗。
|
|
1426
|
+
其餘(undefined、null、無ok鍵之物件、空陣列、元素皆ok非0或非物件之陣列、ok為1含略過既有主鍵或未命中之n為0)不視為失敗,維持舊行為。
|
|
1427
|
+
讀取函數(select)之回傳為數據列,列內欄位可能名為ok,不得以本函數判讀。
|
|
1428
|
+
供procOrm之寫入類各模式、mix之各步驟、備份還原與測試數據寫入共用。</p></li></ul></dd>
|
|
1429
|
+
|
|
1430
|
+
|
|
1431
|
+
|
|
1432
|
+
<dt class="tag-source">Source:</dt>
|
|
1433
|
+
<dd class="tag-source"><ul class="dummy"><li>
|
|
1434
|
+
<a href="isOrmFail.mjs.html">isOrmFail.mjs</a>, <a href="isOrmFail.mjs.html#line18">line 18</a>
|
|
1435
|
+
</li></ul></dd>
|
|
1436
|
+
|
|
1437
|
+
|
|
1438
|
+
|
|
1439
|
+
|
|
1440
|
+
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
|
|
1444
|
+
|
|
1445
|
+
|
|
1446
|
+
|
|
1447
|
+
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
|
|
1453
|
+
|
|
1454
|
+
|
|
1455
|
+
|
|
1456
|
+
|
|
1457
|
+
|
|
1458
|
+
|
|
1459
|
+
|
|
1460
|
+
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
|
|
1464
|
+
|
|
1465
|
+
|
|
1466
|
+
|
|
1467
|
+
</dl>
|
|
1468
|
+
|
|
1469
|
+
|
|
1470
|
+
|
|
1471
|
+
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
|
|
1481
|
+
<h5 class="h5-parameters">Parameters:</h5>
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
<table class="params">
|
|
1485
|
+
<thead>
|
|
1486
|
+
<tr>
|
|
1487
|
+
|
|
1488
|
+
<th>Name</th>
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
<th>Type</th>
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
<th class="last">Description</th>
|
|
1498
|
+
</tr>
|
|
1499
|
+
</thead>
|
|
1500
|
+
|
|
1501
|
+
<tbody>
|
|
1502
|
+
|
|
1503
|
+
|
|
1504
|
+
<tr>
|
|
1505
|
+
|
|
1506
|
+
<td class="name"><code>r</code></td>
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
<td class="type">
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
<span class="param-type">*</span>
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
</td>
|
|
1518
|
+
|
|
1519
|
+
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
|
|
1523
|
+
<td class="description last"><p>輸入ORM寫入類函數之回傳結果</p></td>
|
|
1524
|
+
</tr>
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
</tbody>
|
|
1528
|
+
</table>
|
|
1529
|
+
|
|
1530
|
+
|
|
1531
|
+
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
|
|
1535
|
+
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
|
|
1545
|
+
<h5 class="h5-returns">Returns:</h5>
|
|
1546
|
+
|
|
1547
|
+
|
|
1548
|
+
<div class="param-desc">
|
|
1549
|
+
<p>回傳是否回報失敗</p>
|
|
1550
|
+
</div>
|
|
1551
|
+
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
<dl class="param-type">
|
|
1555
|
+
<dt>
|
|
1556
|
+
Type
|
|
1557
|
+
</dt>
|
|
1558
|
+
<dd>
|
|
1559
|
+
|
|
1560
|
+
<span class="param-type">Boolean</span>
|
|
1561
|
+
|
|
1562
|
+
|
|
1563
|
+
|
|
1564
|
+
</dd>
|
|
1565
|
+
</dl>
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
|
|
1569
|
+
|
|
1570
|
+
|
|
1571
|
+
|
|
1572
|
+
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
|
|
1412
1576
|
<h4 class="name" id="pickWriteRow"><span class="type-signature"></span>pickWriteRow<span class="signature">(row, contract)</span><span class="type-signature"> → {Object}</span></h4>
|
|
1413
1577
|
|
|
1414
1578
|
|
|
@@ -1609,7 +1773,7 @@ rowsNow 內之主鍵缺漏或重複拋 key 為 'rowsInvalid' 之Error(庫內資
|
|
|
1609
1773
|
<br class="clear">
|
|
1610
1774
|
|
|
1611
1775
|
<footer>
|
|
1612
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026
|
|
1776
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 14:34:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1613
1777
|
</footer>
|
|
1614
1778
|
|
|
1615
1779
|
<script>prettyPrint();</script>
|
package/docs/index.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#isOrmFail">isOrmFail</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
<br class="clear">
|
|
72
72
|
|
|
73
73
|
<footer>
|
|
74
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 14:34:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
75
75
|
</footer>
|
|
76
76
|
|
|
77
77
|
<script>prettyPrint();</script>
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>isOrmFail.mjs - Documentation</title>
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
<script src="scripts/prettify/prettify.js"></script>
|
|
10
|
+
<script src="scripts/prettify/lang-css.js"></script>
|
|
11
|
+
<!--[if lt IE 9]>
|
|
12
|
+
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
13
|
+
<![endif]-->
|
|
14
|
+
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
|
|
15
|
+
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
|
|
16
|
+
<script src="scripts/nav.js" defer></script>
|
|
17
|
+
|
|
18
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
|
|
22
|
+
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
|
|
23
|
+
<label for="nav-trigger" class="navicon-button x">
|
|
24
|
+
<div class="navicon"></div>
|
|
25
|
+
</label>
|
|
26
|
+
|
|
27
|
+
<label for="nav-trigger" class="overlay"></label>
|
|
28
|
+
|
|
29
|
+
<nav >
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WServOrm.html">WServOrm</a></li></ul><h3>Global</h3><ul><li><a href="global.html#buildBaseline">buildBaseline</a></li><li><a href="global.html#checkContract">checkContract</a></li><li><a href="global.html#compareBaseline">compareBaseline</a></li><li><a href="global.html#cyrb53">cyrb53</a></li><li><a href="global.html#digestRow">digestRow</a></li><li><a href="global.html#getRejectKey">getRejectKey</a></li><li><a href="global.html#isBaselineValid">isBaselineValid</a></li><li><a href="global.html#isOrmFail">isOrmFail</a></li><li><a href="global.html#pickWriteRow">pickWriteRow</a></li></ul>
|
|
33
|
+
|
|
34
|
+
</nav>
|
|
35
|
+
|
|
36
|
+
<div id="main">
|
|
37
|
+
|
|
38
|
+
<h1 class="page-title">isOrmFail.mjs</h1>
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<section>
|
|
47
|
+
<article>
|
|
48
|
+
<pre class="prettyprint source linenums"><code>import size from 'lodash-es/size.js'
|
|
49
|
+
import getItemsFail from 'w-data-collector/src/getItemsFail.mjs'
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 判斷ORM寫入類函數(insert、save、del、delAll)之回傳結果是否回報失敗
|
|
54
|
+
*
|
|
55
|
+
* 依w-orm系列規格,insert與delAll回傳聚合物件且ok恆為1,save與del回傳逐筆陣列,錯誤皆整批reject;單筆失敗者(save、del)於該筆以ok為0回報。
|
|
56
|
+
* 本函數不論函數與形狀一律判讀:回傳為聚合物件(非null、非陣列之物件)而ok為0者(ORM違約或他種後端)視為失敗;
|
|
57
|
+
* 回傳為逐筆陣列而任一筆ok為0者(同getItemsFail之判讀)視為失敗。
|
|
58
|
+
* 其餘(undefined、null、無ok鍵之物件、空陣列、元素皆ok非0或非物件之陣列、ok為1含略過既有主鍵或未命中之n為0)不視為失敗,維持舊行為。
|
|
59
|
+
* 讀取函數(select)之回傳為數據列,列內欄位可能名為ok,不得以本函數判讀。
|
|
60
|
+
* 供procOrm之寫入類各模式、mix之各步驟、備份還原與測試數據寫入共用。
|
|
61
|
+
*
|
|
62
|
+
* @param {*} r 輸入ORM寫入類函數之回傳結果
|
|
63
|
+
* @returns {Boolean} 回傳是否回報失敗
|
|
64
|
+
*/
|
|
65
|
+
function isOrmFail(r) {
|
|
66
|
+
|
|
67
|
+
//check, 逐筆陣列
|
|
68
|
+
if (Array.isArray(r)) {
|
|
69
|
+
return size(getItemsFail(r, [])) > 0
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//check, 聚合物件
|
|
73
|
+
return r !== null && typeof r === 'object' && r.ok === 0
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
export default isOrmFail
|
|
78
|
+
</code></pre>
|
|
79
|
+
</article>
|
|
80
|
+
</section>
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<br class="clear">
|
|
90
|
+
|
|
91
|
+
<footer>
|
|
92
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Oct 23 2026 14:34:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
93
|
+
</footer>
|
|
94
|
+
|
|
95
|
+
<script>prettyPrint();</script>
|
|
96
|
+
<script src="scripts/polyfill.js"></script>
|
|
97
|
+
<script src="scripts/linenumber.js"></script>
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
</body>
|
|
102
|
+
</html>
|
package/package.json
CHANGED
package/src/WServOrm.mjs
CHANGED
|
@@ -45,6 +45,8 @@ function mkErrBaseline(c) {
|
|
|
45
45
|
*
|
|
46
46
|
* procOrm之save、del與mix,於ORM回傳之逐筆結果有任一筆ok為0(單筆失敗)時reject,訊息列出失敗筆之主鍵,如'failed to save data: id[b]'(超過100字元者截斷顯示;無有效主鍵者以data[k]列其於輸入內之位置,k自0起;超過10筆者只列前10筆並附總筆數),錯誤原文另由console.log輸出。
|
|
47
47
|
* 單筆失敗不中斷整批,故reject時其餘筆數已寫入。
|
|
48
|
+
* 寫入類函數之回傳凡可表達失敗者一律檢查,失敗即reject或拋錯,不當成功(規則帳本R-ORM-RESULT-01):save、del與mix之del、diff若ORM改回聚合物件而ok為0(非契約形狀,無從逐筆列出)亦視為失敗,以固定字串'failed to save data'、'failed to delete data'、'failed to update data'reject,mix之del、diff遇此視為整批性錯誤而立即reject,後續步驟不執行;delAll依契約回傳聚合物件且ok恆為1(錯誤皆整批reject),ok為0(或回傳逐筆陣列而任一筆ok為0)以固定字串'failed to delete data'reject;讀取類select之回傳為數據列(列內欄位可能名為ok),失敗只以reject表達,不檢查ok。
|
|
49
|
+
* insert(含mix之新增)依ORM契約回傳聚合物件且ok恆為1(錯誤皆整批reject);ORM若resolve聚合物件而ok為0,或回傳逐筆陣列(非insert契約形狀)而任一筆ok為0(違約或他種後端),亦視為失敗,以固定字串'failed to insert data'reject(錯誤原文另由console.log輸出),已寫入之筆無從回復;mix之新增遇此視為整批性錯誤而立即reject,後續del、diff步驟不執行。回傳undefined、null、無ok鍵之物件、空陣列或逐筆皆ok非0之陣列者不檢查,維持舊行為;略過既有主鍵(n為0、ok為1)為正常結果。備份還原(recover)之逐表insert同此判準,失敗時於該表停止並以Error reject(訊息為'failed to recover data into table[表名]: '接ORM回傳原文,逐筆陣列則列失敗筆{k,id,err},至多前10筆並附總筆數,另列先前已寫入之表),之後之表不寫入,先前之表與該表已被ORM寫入之筆無從回復。
|
|
48
50
|
* mix之各步驟遇單筆失敗不中斷後續步驟,待全部步驟完成後一併reject;遇整批性錯誤則立即reject,後續步驟不執行。mix於resolve時回傳各步驟所處理之列之id(依add、del、diff之序串接,del之列不分是否命中)。
|
|
49
51
|
*
|
|
50
52
|
* insert、save與mix之新增、修改,數據未帶有效主鍵(未給、null、空字串,或非字串非數字之值,含NaN與±Infinity)者,若資料表之主鍵欄為id且為字串型(或型別未知;型別如STRING(36)者以括號前之字判定),由本套件產生主鍵(同各ORM之genIDSeq)並於resolve時回傳;單一空物件與只含一個空物件之陣列不補(ORM視為無效輸入而不寫入),多筆批次中之空物件列則補。
|
package/src/genTestData.mjs
CHANGED
|
@@ -4,6 +4,7 @@ import isbol from 'wsemi/src/isbol.mjs'
|
|
|
4
4
|
import isfun from 'wsemi/src/isfun.mjs'
|
|
5
5
|
import pmSeries from 'wsemi/src/pmSeries.mjs'
|
|
6
6
|
import getItemsFail from 'w-data-collector/src/getItemsFail.mjs'
|
|
7
|
+
import isOrmFail from './isOrmFail.mjs'
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
async function genTestData(ds, woItems, opt = {}) {
|
|
@@ -54,6 +55,11 @@ async function genTestData(ds, woItems, opt = {}) {
|
|
|
54
55
|
throw new Error(`failed to write test data into table[${k}]: ${JSON.stringify(fails)}`)
|
|
55
56
|
}
|
|
56
57
|
|
|
58
|
+
//check, 回傳聚合物件而ok為0(非契約形狀)者無從逐筆列出, 仍視為失敗, 內文列ORM回傳原文(R-ORM-RESULT-01)
|
|
59
|
+
if (isOrmFail(rss)) {
|
|
60
|
+
throw new Error(`failed to write test data into table[${k}]: ${JSON.stringify(rss)}`)
|
|
61
|
+
}
|
|
62
|
+
|
|
57
63
|
if (bLog) {
|
|
58
64
|
console.log(`${k}.funTest and save`, rs)
|
|
59
65
|
}
|
package/src/getDb.mjs
CHANGED
|
@@ -109,7 +109,7 @@ async function backup(woItems, opt = {}) {
|
|
|
109
109
|
|
|
110
110
|
|
|
111
111
|
async function recover(woItems, fp, opt = {}) {
|
|
112
|
-
//由備份檔以insert還原各資料表; 主鍵已存在者略過, 故資料表須先清空; 逐表寫入,
|
|
112
|
+
//由備份檔以insert還原各資料表; 主鍵已存在者略過, 故資料表須先清空; 逐表寫入, 中途失敗(含insert回報ok為0, 見isOrmFail)時先前之表已寫入, 之後之表不寫入
|
|
113
113
|
//失敗時印log後reject原錯誤; bRela為true時須提供opt.ds與opt.genModelsByTabs以產生model
|
|
114
114
|
|
|
115
115
|
//bRela, 是否為關聯資料庫
|
|
@@ -4,6 +4,8 @@ import trim from 'lodash-es/trim.js'
|
|
|
4
4
|
import size from 'lodash-es/size.js'
|
|
5
5
|
import get from 'lodash-es/get.js'
|
|
6
6
|
import each from 'lodash-es/each.js'
|
|
7
|
+
import join from 'lodash-es/join.js'
|
|
8
|
+
import take from 'lodash-es/take.js'
|
|
7
9
|
import pmSeries from 'wsemi/src/pmSeries.mjs'
|
|
8
10
|
import fsIsFile from 'wsemi/src/fsIsFile.mjs'
|
|
9
11
|
import iseobj from 'wsemi/src/iseobj.mjs'
|
|
@@ -12,6 +14,37 @@ import isestr from 'wsemi/src/isestr.mjs'
|
|
|
12
14
|
import isfun from 'wsemi/src/isfun.mjs'
|
|
13
15
|
import isbol from 'wsemi/src/isbol.mjs'
|
|
14
16
|
import j2o from 'wsemi/src/j2o.mjs'
|
|
17
|
+
import getItemsFail from 'w-data-collector/src/getItemsFail.mjs'
|
|
18
|
+
import isOrmFail from './isOrmFail.mjs'
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
function getMsgFail(name, r, data, written) {
|
|
22
|
+
//還原失敗之訊息(Error.message, 伺服器端工具, 同genTestData含ORM回傳原文): 失敗表名, 聚合物件則列其原文, 逐筆陣列則列失敗筆{k,id,err}(僅前nShow筆並附總筆數), 另列先前已寫入之表
|
|
23
|
+
|
|
24
|
+
//nShow
|
|
25
|
+
let nShow = 10
|
|
26
|
+
|
|
27
|
+
//detail
|
|
28
|
+
let detail = null
|
|
29
|
+
if (Array.isArray(r)) {
|
|
30
|
+
let fails = getItemsFail(r, data)
|
|
31
|
+
detail = JSON.stringify(take(fails, nShow))
|
|
32
|
+
if (size(fails) > nShow) {
|
|
33
|
+
detail += `, ... (${size(fails)} in total)`
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
detail = JSON.stringify(r)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
//msg
|
|
41
|
+
let msg = `failed to recover data into table[${name}]: ${detail}`
|
|
42
|
+
if (size(written) > 0) {
|
|
43
|
+
msg += `; tables already written: ${join(written, ', ')}`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return msg
|
|
47
|
+
}
|
|
15
48
|
|
|
16
49
|
|
|
17
50
|
async function backup(woItems) {
|
|
@@ -87,6 +120,9 @@ async function recover(fp, woItems, genModels, needCreateStorage = false) {
|
|
|
87
120
|
genModels()
|
|
88
121
|
}
|
|
89
122
|
|
|
123
|
+
//written, 已完成insert之資料表(逐表寫入, 中途失敗時先前之表已寫入, 失敗訊息列出供營運者清理)
|
|
124
|
+
let written = []
|
|
125
|
+
|
|
90
126
|
//funTest
|
|
91
127
|
await pmSeries(rs, async (v) => {
|
|
92
128
|
console.log('recover...', v.name)
|
|
@@ -98,6 +134,14 @@ async function recover(fp, woItems, genModels, needCreateStorage = false) {
|
|
|
98
134
|
let r = null
|
|
99
135
|
if (size(v.data) > 0) {
|
|
100
136
|
r = await woItems[v.name].insert(v.data) //需人工先清空資料庫, 用insert匯入比較快
|
|
137
|
+
|
|
138
|
+
//check, ORM回報失敗(聚合物件ok為0, 或逐筆陣列任一筆ok為0)不得當成功: 於此表停止, 之後之表不寫入; 此表已被ORM寫入之筆與先前之表無從回復
|
|
139
|
+
if (isOrmFail(r)) {
|
|
140
|
+
console.log(`${v.name}.insert fail`, r)
|
|
141
|
+
throw new Error(getMsgFail(v.name, r, v.data, written))
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
written.push(v.name)
|
|
101
145
|
}
|
|
102
146
|
return r
|
|
103
147
|
})
|
package/src/getMapOrm.mjs
CHANGED
|
@@ -16,6 +16,7 @@ import isestr from 'wsemi/src/isestr.mjs'
|
|
|
16
16
|
import isnum from 'wsemi/src/isnum.mjs'
|
|
17
17
|
import clearXSS from 'wsemi/src/clearXSS.mjs'
|
|
18
18
|
import getItemsFail from 'w-data-collector/src/getItemsFail.mjs'
|
|
19
|
+
import isOrmFail from './isOrmFail.mjs'
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
function getMsgFail(msg, fails) {
|
|
@@ -1299,8 +1300,13 @@ async function execMapOrm(ds, woItems, userId, woName, mode, input, opt) {
|
|
|
1299
1300
|
return Promise.reject(err)
|
|
1300
1301
|
}
|
|
1301
1302
|
|
|
1303
|
+
//check, insert之錯誤皆屬整批性而reject, 其回傳為聚合物件且ok恆為1; 聚合結果ok為0或逐筆陣列任一筆ok為0者(ORM違約, 見isOrmFail)視為失敗, 不可回成功, 以固定字串整批reject
|
|
1304
|
+
if (mode === 'insert' && isOrmFail(r)) {
|
|
1305
|
+
console.log(`${woName}.insert fail`, r)
|
|
1306
|
+
return Promise.reject('failed to insert data')
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1302
1309
|
//check, save單筆失敗時整批仍resolve並以該筆ok為0回報, 須逐筆檢查
|
|
1303
|
-
//insert之錯誤皆屬整批性而reject, 其回傳為聚合物件而非逐筆陣列, 故不須檢查
|
|
1304
1310
|
if (mode === 'save') {
|
|
1305
1311
|
let fails = getItemsFail(r, input)
|
|
1306
1312
|
if (size(fails) > 0) {
|
|
@@ -1308,6 +1314,12 @@ async function execMapOrm(ds, woItems, userId, woName, mode, input, opt) {
|
|
|
1308
1314
|
return Promise.reject(getMsgFail('failed to save data', getItemsFail(r, inputOrig)))
|
|
1309
1315
|
}
|
|
1310
1316
|
|
|
1317
|
+
//check, 回傳聚合物件而ok為0(非契約形狀)者無從逐筆列出, 仍視為失敗, 固定字串reject(R-ORM-RESULT-01); 陣列形之失敗已於上方列出
|
|
1318
|
+
if (isOrmFail(r)) {
|
|
1319
|
+
console.log(`${woName}.save fail`, r)
|
|
1320
|
+
return Promise.reject('failed to save data')
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1311
1323
|
//check, 只改不增者之事後偵測: 逐筆n為0表檢查後、寫入前該列被他方刪除(表鎖紀律被破壞), 已寫入之筆無從回復, 仍回報rowNotFound
|
|
1312
1324
|
if (optProc.mustExist && hasNoHit(r, null)) {
|
|
1313
1325
|
console.log(`${woName}.save row not found after check`)
|
|
@@ -1380,6 +1392,11 @@ async function execMapOrm(ds, woItems, userId, woName, mode, input, opt) {
|
|
|
1380
1392
|
console.log(`${woName}.del fail`, fails)
|
|
1381
1393
|
err = getMsgFail('failed to delete data', fails)
|
|
1382
1394
|
}
|
|
1395
|
+
else if (isOrmFail(r)) {
|
|
1396
|
+
//回傳聚合物件而ok為0(非契約形狀)者無從逐筆列出, 仍視為失敗, 固定字串(R-ORM-RESULT-01)
|
|
1397
|
+
console.log(`${woName}.del fail`, r)
|
|
1398
|
+
err = 'failed to delete data'
|
|
1399
|
+
}
|
|
1383
1400
|
}
|
|
1384
1401
|
|
|
1385
1402
|
//check, 刪除回報未命中者之事後偵測: 逐筆nDeleted或n為0表檢查後、刪除前該列被他方刪除(表鎖紀律被破壞), 已刪除之筆無從回復, 仍回報rowNotFound
|
|
@@ -1405,6 +1422,12 @@ async function execMapOrm(ds, woItems, userId, woName, mode, input, opt) {
|
|
|
1405
1422
|
err = 'failed to delete data'
|
|
1406
1423
|
})
|
|
1407
1424
|
|
|
1425
|
+
//check, delAll契約為聚合物件且ok恆為1(錯誤皆整批reject); ok為0或逐筆陣列任一筆ok為0者(ORM違約, 見isOrmFail)視為失敗, 不可回成功(R-ORM-RESULT-01)
|
|
1426
|
+
if (!isestr(err) && isOrmFail(r)) {
|
|
1427
|
+
console.log(`${woName}.delAll fail`, r)
|
|
1428
|
+
err = 'failed to delete data'
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1408
1431
|
}
|
|
1409
1432
|
else if (mode === 'mix') {
|
|
1410
1433
|
|
|
@@ -1539,7 +1562,7 @@ async function execMapOrm(ds, woItems, userId, woName, mode, input, opt) {
|
|
|
1539
1562
|
}
|
|
1540
1563
|
|
|
1541
1564
|
//insert
|
|
1542
|
-
await wo.insert(add)
|
|
1565
|
+
let rsAdd = await wo.insert(add)
|
|
1543
1566
|
.catch((msg) => {
|
|
1544
1567
|
console.log(`${woName}.insert catch`, msg)
|
|
1545
1568
|
err = 'failed to insert data'
|
|
@@ -1550,6 +1573,12 @@ async function execMapOrm(ds, woItems, userId, woName, mode, input, opt) {
|
|
|
1550
1573
|
return Promise.reject(err)
|
|
1551
1574
|
}
|
|
1552
1575
|
|
|
1576
|
+
//check, 同單獨insert, 回報失敗者(isOrmFail)視為整批性失敗, 立即reject, 後續步驟不執行
|
|
1577
|
+
if (isOrmFail(rsAdd)) {
|
|
1578
|
+
console.log(`${woName}.insert fail`, rsAdd)
|
|
1579
|
+
return Promise.reject('failed to insert data')
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1553
1582
|
//r
|
|
1554
1583
|
rt = map(add, (v) => {
|
|
1555
1584
|
return { id: v.id } //僅回傳id避免大量數據時造成負擔
|
|
@@ -1578,6 +1607,11 @@ async function execMapOrm(ds, woItems, userId, woName, mode, input, opt) {
|
|
|
1578
1607
|
console.log(`${woName}.del fail`, fails)
|
|
1579
1608
|
msgsFail.push(getMsgFail('failed to delete data', fails))
|
|
1580
1609
|
}
|
|
1610
|
+
else if (isOrmFail(rs)) {
|
|
1611
|
+
//回傳聚合物件而ok為0(非契約形狀)者無從逐筆列出, 視為該步驟整批性失敗, 立即reject, 後續步驟不執行(R-ORM-RESULT-01)
|
|
1612
|
+
console.log(`${woName}.del fail`, rs)
|
|
1613
|
+
return Promise.reject('failed to delete data')
|
|
1614
|
+
}
|
|
1581
1615
|
|
|
1582
1616
|
//r
|
|
1583
1617
|
rt = map(del, (v) => {
|
|
@@ -1613,6 +1647,11 @@ async function execMapOrm(ds, woItems, userId, woName, mode, input, opt) {
|
|
|
1613
1647
|
console.log(`${woName}.save fail`, fails)
|
|
1614
1648
|
msgsFail.push(getMsgFail('failed to update data', getItemsFail(rs, diffOrig)))
|
|
1615
1649
|
}
|
|
1650
|
+
else if (isOrmFail(rs)) {
|
|
1651
|
+
//同上, 回傳聚合物件而ok為0(非契約形狀)者立即reject(R-ORM-RESULT-01)
|
|
1652
|
+
console.log(`${woName}.save fail`, rs)
|
|
1653
|
+
return Promise.reject('failed to update data')
|
|
1654
|
+
}
|
|
1616
1655
|
|
|
1617
1656
|
//r
|
|
1618
1657
|
rt = map(diff, (v) => {
|