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.
@@ -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#line141">line 141</a>
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 00:29:00 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
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>
@@ -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 00:29:00 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
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>
@@ -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 00:29:00 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
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"> &rarr; {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"> &rarr; {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 00:29:00 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
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 00:29:00 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
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 &amp;&amp; typeof r === 'object' &amp;&amp; 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-serv-orm",
3
- "version": "1.1.17",
3
+ "version": "1.1.18",
4
4
  "main": "dist/w-serv-orm.umd.js",
5
5
  "dependencies": {
6
6
  "json5": "^2.2.3",
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視為無效輸入而不寫入),多筆批次中之空物件列則補。
@@ -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) => {