synapse 2.174.0__py311-none-any.whl → 2.175.0__py311-none-any.whl

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.

Potentially problematic release.


This version of synapse might be problematic. Click here for more details.

synapse/lib/layer.py CHANGED
@@ -227,6 +227,7 @@ STOR_TYPE_FLOAT64 = 22
227
227
  STOR_TYPE_HUGENUM = 23
228
228
 
229
229
  STOR_TYPE_MAXTIME = 24
230
+ STOR_TYPE_NDEF = 25
230
231
 
231
232
  # STOR_TYPE_TOMB = ??
232
233
  # STOR_TYPE_FIXED = ??
@@ -1300,6 +1301,27 @@ class StorTypeMsgp(StorType):
1300
1301
  def indx(self, valu):
1301
1302
  return (s_common.buid(valu),)
1302
1303
 
1304
+ class StorTypeNdef(StorType):
1305
+
1306
+ def __init__(self, layr):
1307
+ StorType.__init__(self, layr, STOR_TYPE_NDEF)
1308
+ self.lifters.update({
1309
+ '=': self._liftNdefEq,
1310
+ })
1311
+
1312
+ async def _liftNdefEq(self, liftby, valu, reverse=False):
1313
+ if reverse:
1314
+ scan = liftby.keyBuidsByDupsBack
1315
+ else:
1316
+ scan = liftby.keyBuidsByDups
1317
+
1318
+ indx = s_common.buid(valu)
1319
+ for item in scan(indx):
1320
+ yield item
1321
+
1322
+ def indx(self, valu):
1323
+ return (s_common.buid(valu),)
1324
+
1303
1325
  class StorTypeLatLon(StorType):
1304
1326
 
1305
1327
  def __init__(self, layr):
@@ -1459,6 +1481,7 @@ class Layer(s_nexus.Pusher):
1459
1481
  StorTypeHugeNum(self, STOR_TYPE_HUGENUM),
1460
1482
 
1461
1483
  StorTypeTime(self), # STOR_TYPE_MAXTIME
1484
+ StorTypeNdef(self),
1462
1485
  ]
1463
1486
 
1464
1487
  await self._initLayerStorage()
@@ -2689,6 +2712,7 @@ class Layer(s_nexus.Pusher):
2689
2712
 
2690
2713
  self.bytag = self.layrslab.initdb('bytag', dupsort=True)
2691
2714
  self.byform = self.layrslab.initdb('byform', dupsort=True)
2715
+ self.byndef = self.layrslab.initdb('byndef', dupsort=True)
2692
2716
  self.byprop = self.layrslab.initdb('byprop', dupsort=True)
2693
2717
  self.byarray = self.layrslab.initdb('byarray', dupsort=True)
2694
2718
  self.bytagprop = self.layrslab.initdb('bytagprop', dupsort=True)
@@ -3053,6 +3077,35 @@ class Layer(s_nexus.Pusher):
3053
3077
 
3054
3078
  yield None, buid, deepcopy(sode)
3055
3079
 
3080
+ async def liftByTags(self, tags):
3081
+ # todo: support form and reverse kwargs
3082
+
3083
+ genrs = []
3084
+
3085
+ for tag in tags:
3086
+ try:
3087
+ abrv = self.tagabrv.bytsToAbrv(tag.encode())
3088
+ genrs.append(s_coro.agen(self.layrslab.scanByPref(abrv, db=self.bytag)))
3089
+ except s_exc.NoSuchAbrv:
3090
+ continue
3091
+
3092
+ lastbuid = None
3093
+
3094
+ async for lkey, buid in s_common.merggenr2(genrs, cmprkey=lambda x: x[1]):
3095
+
3096
+ if buid == lastbuid:
3097
+ lastbuid = buid
3098
+ await asyncio.sleep(0)
3099
+ continue
3100
+
3101
+ lastbuid = buid
3102
+
3103
+ sode = self._getStorNode(buid)
3104
+ if sode is None: # pragma: no cover
3105
+ continue
3106
+
3107
+ yield None, buid, deepcopy(sode)
3108
+
3056
3109
  async def liftByTagValu(self, tag, cmpr, valu, form=None, reverse=False):
3057
3110
 
3058
3111
  try:
@@ -3304,7 +3357,7 @@ class Layer(s_nexus.Pusher):
3304
3357
  changes = []
3305
3358
  for edit in edits:
3306
3359
 
3307
- delt = self.editors[edit[0]](buid, form, edit, sode, meta)
3360
+ delt = await self.editors[edit[0]](buid, form, edit, sode, meta)
3308
3361
  if delt and edit[2]:
3309
3362
  nodeedits.extend(edit[2])
3310
3363
 
@@ -3338,22 +3391,22 @@ class Layer(s_nexus.Pusher):
3338
3391
  def mayDelBuid(self, buid, sode):
3339
3392
 
3340
3393
  if sode.get('valu'):
3341
- return
3394
+ return False
3342
3395
 
3343
3396
  if sode.get('props'):
3344
- return
3397
+ return False
3345
3398
 
3346
3399
  if sode.get('tags'):
3347
- return
3400
+ return False
3348
3401
 
3349
3402
  if sode.get('tagprops'):
3350
- return
3403
+ return False
3351
3404
 
3352
3405
  if self.dataslab.prefexists(buid, self.nodedata):
3353
- return
3406
+ return False
3354
3407
 
3355
3408
  if self.layrslab.prefexists(buid, db=self.edgesn1):
3356
- return
3409
+ return False
3357
3410
 
3358
3411
  # no more refs in this layer. time to pop it...
3359
3412
  try:
@@ -3365,6 +3418,8 @@ class Layer(s_nexus.Pusher):
3365
3418
  self.buidcache.pop(buid, None)
3366
3419
  self.layrslab.delete(buid, db=self.bybuidv3)
3367
3420
 
3421
+ return True
3422
+
3368
3423
  async def storNodeEditsNoLift(self, nodeedits, meta):
3369
3424
  '''
3370
3425
  Execute a series of node edit operations.
@@ -3374,7 +3429,7 @@ class Layer(s_nexus.Pusher):
3374
3429
  self._reqNotReadOnly()
3375
3430
  await self._push('edits', nodeedits, meta)
3376
3431
 
3377
- def _editNodeAdd(self, buid, form, edit, sode, meta):
3432
+ async def _editNodeAdd(self, buid, form, edit, sode, meta):
3378
3433
 
3379
3434
  valt = edit[1]
3380
3435
  valu, stortype = valt
@@ -3393,6 +3448,7 @@ class Layer(s_nexus.Pusher):
3393
3448
 
3394
3449
  for indx in self.getStorIndx(stortype, valu):
3395
3450
  self.layrslab.put(abrv + indx, buid, db=self.byarray)
3451
+ await asyncio.sleep(0)
3396
3452
 
3397
3453
  for indx in self.getStorIndx(STOR_TYPE_MSGP, valu):
3398
3454
  self.layrslab.put(abrv + indx, buid, db=self.byprop)
@@ -3415,20 +3471,17 @@ class Layer(s_nexus.Pusher):
3415
3471
  tick = s_common.now()
3416
3472
 
3417
3473
  edit = (EDIT_PROP_SET, ('.created', tick, None, STOR_TYPE_MINTIME), ())
3418
- retn.extend(self._editPropSet(buid, form, edit, sode, meta))
3474
+ retn.extend(await self._editPropSet(buid, form, edit, sode, meta))
3419
3475
 
3420
3476
  return retn
3421
3477
 
3422
- def _editNodeDel(self, buid, form, edit, sode, meta):
3478
+ async def _editNodeDel(self, buid, form, edit, sode, meta):
3423
3479
 
3424
- valt = sode.pop('valu', None)
3480
+ valt = sode.get('valu', None)
3425
3481
  if valt is None:
3426
- # TODO tombstone
3427
3482
  self.mayDelBuid(buid, sode)
3428
3483
  return ()
3429
3484
 
3430
- self.setSodeDirty(buid, sode, form)
3431
-
3432
3485
  valu, stortype = valt
3433
3486
 
3434
3487
  abrv = self.setPropAbrv(form, None)
@@ -3437,6 +3490,7 @@ class Layer(s_nexus.Pusher):
3437
3490
 
3438
3491
  for indx in self.getStorIndx(stortype, valu):
3439
3492
  self.layrslab.delete(abrv + indx, buid, db=self.byarray)
3493
+ await asyncio.sleep(0)
3440
3494
 
3441
3495
  for indx in self.getStorIndx(STOR_TYPE_MSGP, valu):
3442
3496
  self.layrslab.delete(abrv + indx, buid, db=self.byprop)
@@ -3456,13 +3510,16 @@ class Layer(s_nexus.Pusher):
3456
3510
 
3457
3511
  self.buidcache.pop(buid, None)
3458
3512
 
3459
- self.mayDelBuid(buid, sode)
3513
+ sode.pop('valu', None)
3514
+
3515
+ if not self.mayDelBuid(buid, sode):
3516
+ self.setSodeDirty(buid, sode, form)
3460
3517
 
3461
3518
  return (
3462
3519
  (EDIT_NODE_DEL, (valu, stortype), ()),
3463
3520
  )
3464
3521
 
3465
- def _editPropSet(self, buid, form, edit, sode, meta):
3522
+ async def _editPropSet(self, buid, form, edit, sode, meta):
3466
3523
 
3467
3524
  prop, valu, oldv, stortype = edit[1]
3468
3525
 
@@ -3491,11 +3548,18 @@ class Layer(s_nexus.Pusher):
3491
3548
 
3492
3549
  if oldt & STOR_FLAG_ARRAY:
3493
3550
 
3551
+ realtype = oldt & 0x7fff
3552
+
3494
3553
  for oldi in self.getStorIndx(oldt, oldv):
3495
3554
  self.layrslab.delete(abrv + oldi, buid, db=self.byarray)
3496
3555
  if univabrv is not None:
3497
3556
  self.layrslab.delete(univabrv + oldi, buid, db=self.byarray)
3498
3557
 
3558
+ if realtype == STOR_TYPE_NDEF:
3559
+ self.layrslab.delete(oldi, buid + abrv, db=self.byndef)
3560
+
3561
+ await asyncio.sleep(0)
3562
+
3499
3563
  for indx in self.getStorIndx(STOR_TYPE_MSGP, oldv):
3500
3564
  self.layrslab.delete(abrv + indx, buid, db=self.byprop)
3501
3565
  if univabrv is not None:
@@ -3508,6 +3572,9 @@ class Layer(s_nexus.Pusher):
3508
3572
  if univabrv is not None:
3509
3573
  self.layrslab.delete(univabrv + oldi, buid, db=self.byprop)
3510
3574
 
3575
+ if oldt == STOR_TYPE_NDEF:
3576
+ self.layrslab.delete(oldi, buid + abrv, db=self.byndef)
3577
+
3511
3578
  if sode.get('form') is None:
3512
3579
  formabrv = self.setPropAbrv(form, None)
3513
3580
  self.layrslab.put(formabrv, buid, db=self.byform)
@@ -3517,11 +3584,18 @@ class Layer(s_nexus.Pusher):
3517
3584
 
3518
3585
  if stortype & STOR_FLAG_ARRAY:
3519
3586
 
3587
+ realtype = stortype & 0x7fff
3588
+
3520
3589
  for indx in self.getStorIndx(stortype, valu):
3521
3590
  self.layrslab.put(abrv + indx, buid, db=self.byarray)
3522
3591
  if univabrv is not None:
3523
3592
  self.layrslab.put(univabrv + indx, buid, db=self.byarray)
3524
3593
 
3594
+ if realtype == STOR_TYPE_NDEF:
3595
+ self.layrslab.put(indx, buid + abrv, db=self.byndef)
3596
+
3597
+ await asyncio.sleep(0)
3598
+
3525
3599
  for indx in self.getStorIndx(STOR_TYPE_MSGP, valu):
3526
3600
  self.layrslab.put(abrv + indx, buid, db=self.byprop)
3527
3601
  if univabrv is not None:
@@ -3534,11 +3608,14 @@ class Layer(s_nexus.Pusher):
3534
3608
  if univabrv is not None:
3535
3609
  self.layrslab.put(univabrv + indx, buid, db=self.byprop)
3536
3610
 
3611
+ if stortype == STOR_TYPE_NDEF:
3612
+ self.layrslab.put(indx, buid + abrv, db=self.byndef)
3613
+
3537
3614
  return (
3538
3615
  (EDIT_PROP_SET, (prop, valu, oldv, stortype), ()),
3539
3616
  )
3540
3617
 
3541
- def _editPropDel(self, buid, form, edit, sode, meta):
3618
+ async def _editPropDel(self, buid, form, edit, sode, meta):
3542
3619
 
3543
3620
  prop, oldv, stortype = edit[1]
3544
3621
 
@@ -3548,14 +3625,11 @@ class Layer(s_nexus.Pusher):
3548
3625
  if prop[0] == '.': # '.' to detect universal props (as quickly as possible)
3549
3626
  univabrv = self.setPropAbrv(None, prop)
3550
3627
 
3551
- valt = sode['props'].pop(prop, None)
3628
+ valt = sode['props'].get(prop, None)
3552
3629
  if valt is None:
3553
- # FIXME tombstone
3554
3630
  self.mayDelBuid(buid, sode)
3555
3631
  return ()
3556
3632
 
3557
- self.setSodeDirty(buid, sode, form)
3558
-
3559
3633
  valu, stortype = valt
3560
3634
 
3561
3635
  if stortype & STOR_FLAG_ARRAY:
@@ -3568,6 +3642,11 @@ class Layer(s_nexus.Pusher):
3568
3642
  if univabrv is not None:
3569
3643
  self.layrslab.delete(univabrv + indx, buid, db=self.byarray)
3570
3644
 
3645
+ if realtype == STOR_TYPE_NDEF:
3646
+ self.layrslab.delete(indx, buid + abrv, db=self.byndef)
3647
+
3648
+ await asyncio.sleep(0)
3649
+
3571
3650
  for indx in self.getStorIndx(STOR_TYPE_MSGP, valu):
3572
3651
  self.layrslab.delete(abrv + indx, buid, db=self.byprop)
3573
3652
  if univabrv is not None:
@@ -3580,12 +3659,19 @@ class Layer(s_nexus.Pusher):
3580
3659
  if univabrv is not None:
3581
3660
  self.layrslab.delete(univabrv + indx, buid, db=self.byprop)
3582
3661
 
3583
- self.mayDelBuid(buid, sode)
3662
+ if stortype == STOR_TYPE_NDEF:
3663
+ self.layrslab.delete(indx, buid + abrv, db=self.byndef)
3664
+
3665
+ sode['props'].pop(prop, None)
3666
+
3667
+ if not self.mayDelBuid(buid, sode):
3668
+ self.setSodeDirty(buid, sode, form)
3669
+
3584
3670
  return (
3585
3671
  (EDIT_PROP_DEL, (prop, valu, stortype), ()),
3586
3672
  )
3587
3673
 
3588
- def _editTagSet(self, buid, form, edit, sode, meta):
3674
+ async def _editTagSet(self, buid, form, edit, sode, meta):
3589
3675
 
3590
3676
  if form is None: # pragma: no cover
3591
3677
  logger.warning(f'Invalid tag set edit, form is None: {edit}')
@@ -3618,7 +3704,7 @@ class Layer(s_nexus.Pusher):
3618
3704
  (EDIT_TAG_SET, (tag, valu, oldv), ()),
3619
3705
  )
3620
3706
 
3621
- def _editTagDel(self, buid, form, edit, sode, meta):
3707
+ async def _editTagDel(self, buid, form, edit, sode, meta):
3622
3708
 
3623
3709
  tag, oldv = edit[1]
3624
3710
  formabrv = self.setPropAbrv(form, None)
@@ -3640,7 +3726,7 @@ class Layer(s_nexus.Pusher):
3640
3726
  (EDIT_TAG_DEL, (tag, oldv), ()),
3641
3727
  )
3642
3728
 
3643
- def _editTagPropSet(self, buid, form, edit, sode, meta):
3729
+ async def _editTagPropSet(self, buid, form, edit, sode, meta):
3644
3730
 
3645
3731
  if form is None: # pragma: no cover
3646
3732
  logger.warning(f'Invalid tagprop set edit, form is None: {edit}')
@@ -3692,7 +3778,7 @@ class Layer(s_nexus.Pusher):
3692
3778
  (EDIT_TAGPROP_SET, (tag, prop, valu, oldv, stortype), ()),
3693
3779
  )
3694
3780
 
3695
- def _editTagPropDel(self, buid, form, edit, sode, meta):
3781
+ async def _editTagPropDel(self, buid, form, edit, sode, meta):
3696
3782
  tag, prop, valu, stortype = edit[1]
3697
3783
 
3698
3784
  tp_dict = sode['tagprops'].get(tag)
@@ -3721,7 +3807,7 @@ class Layer(s_nexus.Pusher):
3721
3807
  (EDIT_TAGPROP_DEL, (tag, prop, oldv, oldt), ()),
3722
3808
  )
3723
3809
 
3724
- def _editNodeDataSet(self, buid, form, edit, sode, meta):
3810
+ async def _editNodeDataSet(self, buid, form, edit, sode, meta):
3725
3811
 
3726
3812
  name, valu, oldv = edit[1]
3727
3813
  abrv = self.setPropAbrv(name, None)
@@ -3746,7 +3832,7 @@ class Layer(s_nexus.Pusher):
3746
3832
  (EDIT_NODEDATA_SET, (name, valu, oldv), ()),
3747
3833
  )
3748
3834
 
3749
- def _editNodeDataDel(self, buid, form, edit, sode, meta):
3835
+ async def _editNodeDataDel(self, buid, form, edit, sode, meta):
3750
3836
 
3751
3837
  name, valu = edit[1]
3752
3838
  abrv = self.setPropAbrv(name, None)
@@ -3764,7 +3850,7 @@ class Layer(s_nexus.Pusher):
3764
3850
  (EDIT_NODEDATA_DEL, (name, oldv), ()),
3765
3851
  )
3766
3852
 
3767
- def _editNodeEdgeAdd(self, buid, form, edit, sode, meta):
3853
+ async def _editNodeEdgeAdd(self, buid, form, edit, sode, meta):
3768
3854
 
3769
3855
  if form is None: # pragma: no cover
3770
3856
  logger.warning(f'Invalid node edge edit, form is None: {edit}')
@@ -3795,7 +3881,7 @@ class Layer(s_nexus.Pusher):
3795
3881
  (EDIT_EDGE_ADD, (verb, n2iden), ()),
3796
3882
  )
3797
3883
 
3798
- def _editNodeEdgeDel(self, buid, form, edit, sode, meta):
3884
+ async def _editNodeEdgeDel(self, buid, form, edit, sode, meta):
3799
3885
 
3800
3886
  verb, n2iden = edit[1]
3801
3887
 
@@ -3862,6 +3948,10 @@ class Layer(s_nexus.Pusher):
3862
3948
  verb = lkey[32:].decode()
3863
3949
  yield verb, s_common.ehex(n2buid)
3864
3950
 
3951
+ async def iterNodeEdgeVerbsN1(self, buid):
3952
+ for lkey in self.layrslab.scanKeysByPref(buid, db=self.edgesn1, nodup=True):
3953
+ yield lkey[32:].decode()
3954
+
3865
3955
  async def iterNodeEdgesN2(self, buid, verb=None):
3866
3956
  pref = buid
3867
3957
  if verb is not None:
@@ -3879,6 +3969,10 @@ class Layer(s_nexus.Pusher):
3879
3969
  lkey = buid1 + verb.encode()
3880
3970
  return self.layrslab.hasdup(lkey, buid2, db=self.edgesn1)
3881
3971
 
3972
+ async def getNdefRefs(self, buid):
3973
+ for _, byts in self.layrslab.scanByDups(buid, db=self.byndef):
3974
+ yield byts[:32], byts[32:]
3975
+
3882
3976
  async def iterFormRows(self, form, stortype=None, startvalu=None):
3883
3977
  '''
3884
3978
  Yields buid, valu tuples of nodes of a single form, optionally (re)starting at startvalu.
synapse/lib/link.py CHANGED
@@ -303,10 +303,11 @@ class Link(s_base.Base):
303
303
  raise
304
304
 
305
305
  except Exception as e:
306
+ mesg = f'rx error {e} link={self.getAddrInfo()}'
306
307
  if isinstance(e, (BrokenPipeError, ConnectionResetError)):
307
- logger.warning('rx error: %s', e)
308
+ logger.warning(mesg)
308
309
  else:
309
- logger.exception('rx error')
310
+ logger.exception(mesg)
310
311
  await self.fini()
311
312
  return None
312
313
 
synapse/lib/modelrev.py CHANGED
@@ -8,7 +8,7 @@ import synapse.lib.layer as s_layer
8
8
 
9
9
  logger = logging.getLogger(__name__)
10
10
 
11
- maxvers = (0, 2, 25)
11
+ maxvers = (0, 2, 26)
12
12
 
13
13
  class ModelRev:
14
14
 
@@ -39,6 +39,7 @@ class ModelRev:
39
39
  ((0, 2, 23), self.revModel_0_2_23),
40
40
  ((0, 2, 24), self.revModel_0_2_24),
41
41
  ((0, 2, 25), self.revModel_0_2_25),
42
+ ((0, 2, 26), self.revModel_0_2_26),
42
43
  )
43
44
 
44
45
  async def _uniqSortArray(self, todoprops, layers):
@@ -769,6 +770,19 @@ class ModelRev:
769
770
  await self._normPropValu(layers, 'ou:conference:names')
770
771
  await self._propArrayToForm(layers, 'ou:conference:names', 'entity:name')
771
772
 
773
+ async def revModel_0_2_26(self, layers):
774
+ for name, prop in list(self.core.model.props.items()):
775
+ if prop.isform:
776
+ continue
777
+
778
+ stortype = prop.type.stortype
779
+ if stortype & s_layer.STOR_FLAG_ARRAY:
780
+ stortype = stortype & 0x7fff
781
+
782
+ if stortype == s_layer.STOR_TYPE_NDEF:
783
+ logger.info(f'Updating ndef indexing for {name}')
784
+ await self._updatePropStortype(layers, prop.full)
785
+
772
786
  async def runStorm(self, text, opts=None):
773
787
  '''
774
788
  Run storm code in a schedcoro and log the output messages.
synapse/lib/snap.py CHANGED
@@ -1602,6 +1602,19 @@ class Snap(s_base.Base):
1602
1602
  last = verb
1603
1603
  yield verb
1604
1604
 
1605
+ async def getNdefRefs(self, buid):
1606
+ last = None
1607
+ gens = [layr.getNdefRefs(buid) for layr in self.layers]
1608
+
1609
+ async for refsbuid, _ in s_common.merggenr2(gens):
1610
+ if refsbuid == last:
1611
+ continue
1612
+
1613
+ await asyncio.sleep(0)
1614
+ last = refsbuid
1615
+
1616
+ yield refsbuid
1617
+
1605
1618
  async def hasNodeData(self, buid, name):
1606
1619
  '''
1607
1620
  Return True if the buid has nodedata set on it under the given name