
Research
/Security News
Malicious npm Packages Target WhatsApp Developers with Remote Kill Switch
Two npm packages masquerading as WhatsApp developer libraries include a kill switch that deletes all files if the phone number isn’t whitelisted.
Асинхронный Python-клиент для Key-Value базы данных AcapellaDB.
Для начала работы необходимо создать сессию:
>>> session = Session(host = 'localhost', port = 12000)
Базовые GET/SET операции с ключами производятся с помощью класса Entry:
>>> # создание объекта Entry, ключи являются массивом строк
>>> entry = session.entry(["foo", "bar"])
>>> # установка значения
>>> await entry.set("value 1")
>>> # установка значения с условием совпадения версии
>>> await entry.cas("value 2")
>>> # получение значения по ключу и сохранение в Entry
>>> entry = await session.get_entry(["foo", "bar"])
>>> print(f'value = "{entry.value}", version = {entry.version}')
value = "value 2", version = 2
Для хранения сложных структур данных введены две части ключа: partition
и clustering
. Первый используется для распределения данных по кластеру. Все clustering-ключи в пределах одного partition-ключа лежат вместе на каждой реплике, что обеспечивает возможность выборок и batch-запросов.
Пример работы со списком пользователей внутри одного partition'а:
>>> # создание списка
>>> await session.entry(partition = ["users"], clustering = ["first"]).set({
>>> 'age': 25
>>> })
>>> await session.entry(partition = ["users"], clustering = ["second"]).set({
>>> 'age': 32
>>> })
>>> await session.entry(partition = ["users"], clustering = ["third"]).set({
>>> 'age': 21
>>> })
>>> # выборка всех пользователей
>>> data = await session.range(partition = ["users"])
>>> for e in data:
>>> print(f'{e.key[0]}: {e.value.age}')
first: 25
second: 32
third: 21
>>> # выборка первых 2-х пользователей
>>> data = await session.range(partition = ["users"], limit = 2)
>>> for e in data:
>>> print(f'{e.key[0]}: {e.value.age}')
first: 25
second: 32
Пример работы с очередью:
>>> # запись событий в очередь по 10 штук
>>> for i in range(10):
>>> # записи производятся в батч, а потом выполняется один запрос
>>> batch = BatchManual()
>>> for i in range(10):
>>> key = str(uuid1())
>>> e = session.entry(partition = ["queue-1"], clustering = [key])
>>> await e.set(value = i, batch = batch)
>>> # выполнение батча
>>> await batch.send()
>>> # чтение событий из очереди по 10 штук
>>> first = []
>>> for i in rannge(10):
>>> data = await session.range(partition = ["queue-1"], first = first, limit = 10)
>>> for e in data:
>>> print(f'{e.key}: {e.value}')
>>> first = data[len(data) - 1].key
>>>
['be2a5d92-8cc0-11e7-8bb2-40e230b5623b']: 0
['be2a6058-8cc0-11e7-8bb2-40e230b5623b']: 1
['be2a61f2-8cc0-11e7-8bb2-40e230b5623b']: 2
...
['be2ae000-8cc0-11e7-8bb2-40e230b5623b']: 99
>>> # выборка всех событий за определённый интервал времени
>>> data = await session.range(
>>> partition = ["queue-1"],
>>> first = ['be2a61f2-8cc0-11e7-8bb2-40e230b5623b'],
>>> last = ['be2a7fac-8cc0-11e7-8bb2-40e230b5623b']
>>> )
Для работы с деревьями (DT, Distributed Tree) используются классы Tree и Cursor:
>>> # создание дерева
>>> tree = session.tree(["test", "tree"])
>>> # заполнение дерева
>>> await tree.cursor(["a"]).set("1")
>>> await tree.cursor(["b"]).set("2")
>>> await tree.cursor(["c"]).set("3")
>>> await tree.cursor(["d"]).set("4")
>>> await tree.cursor(["e"]).set("5")
>>> # получение следующего ключа в дереве
>>> next = await tree.cursor(["b"]).next() # next.key = ["c"]
>>> # получение предыдущего ключа в дереве
>>> prev = await tree.cursor(["b"]).next() # next.key = ["a"]
>>> # выборка данных по заданным ограничениям
>>> data = await tree.range(first = ["a"], last = ["d"], limit = 2)
>>> print([e.key for e in data])
[['b'], ['c']]
Так же для всех операций доступен транзакционный режим. Транзакции можно использовать в двух режимах:
>>> async with session.transaction() as tx:
>>> # использование транзакции
>>> entry = await tx.get_entry(["foo", "bar"])
>>> await entry.cas("value 3")
>>> # создание транзакции
>>> tx = await session.transaction_manual()
>>> try:
>>> # использование транзакции
>>> entry = await tx.get_entry(["foo", "bar"])
>>> await entry.cas("value 3")
>>> # commit, если не произошло исключений
>>> await tx.commit()
>>> except Exception:
>>> # rollback, если произошла какая-либо ошибка
>>> await tx.rollback()
Больше примеров использования можно найти в тестах.
FAQs
Python client for AcapellaDB database
We found that acapelladb demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
Two npm packages masquerading as WhatsApp developer libraries include a kill switch that deletes all files if the phone number isn’t whitelisted.
Research
/Security News
Socket uncovered 11 malicious Go packages using obfuscated loaders to fetch and execute second-stage payloads via C2 domains.
Security News
TC39 advances 11 JavaScript proposals, with two moving to Stage 4, bringing better math, binary APIs, and more features one step closer to the ECMAScript spec.