Пример #1
0
async def query_create(
    conn,
    organization_id: OrganizationID,
    author: DeviceID,
    realm_id: UUID,
    encryption_revision: int,
    vlob_id: UUID,
    timestamp: pendulum.DateTime,
    blob: bytes,
) -> None:
    await _check_realm_and_write_access(conn, organization_id, author,
                                        realm_id, encryption_revision)

    # Actually create the vlob
    try:
        vlob_atom_internal_id = await conn.fetchval(*_q_create(
            organization_id=organization_id,
            author=author,
            realm_id=realm_id,
            encryption_revision=encryption_revision,
            vlob_id=vlob_id,
            blob=blob,
            blob_len=len(blob),
            timestamp=timestamp,
        ))

    except UniqueViolationError:
        raise VlobAlreadyExistsError()

    await query_vlob_updated(conn, vlob_atom_internal_id, organization_id,
                             author, realm_id, vlob_id)
Пример #2
0
    async def create(
        self,
        organization_id: OrganizationID,
        id: UUID,
        rts: str,
        wts: str,
        blob: bytes,
        author: DeviceID,
        notify_beacon: UUID = None,
    ) -> None:
        async with self.dbh.pool.acquire() as conn:
            async with conn.transaction():
                try:
                    result = await conn.execute(
                        """
INSERT INTO vlobs (
    organization, vlob_id, rts, wts, version, blob, author
)
SELECT
    _id,
    $2, $3, $4,
    1,
    $5,
    (
        SELECT _id
        FROM devices
        WHERE
            device_id = $6
            AND organization = organizations._id
    )
FROM organizations
WHERE organization_id = $1
""",
                        organization_id,
                        id,
                        rts,
                        wts,
                        blob,
                        author,
                    )
                except UniqueViolationError:
                    raise VlobAlreadyExistsError()

                if result != "INSERT 0 1":
                    raise VlobError(f"Insertion error: {result}")

                if notify_beacon:
                    await self.beacon_component.ll_update(
                        conn, organization_id, notify_beacon, id, 1, author)
Пример #3
0
    async def create(
        self,
        organization_id: OrganizationID,
        author: DeviceID,
        realm_id: UUID,
        encryption_revision: int,
        vlob_id: UUID,
        timestamp: pendulum.DateTime,
        blob: bytes,
    ) -> None:
        self._check_realm_write_access(organization_id, realm_id,
                                       author.user_id, encryption_revision)

        key = (organization_id, vlob_id)
        if key in self._vlobs:
            raise VlobAlreadyExistsError()

        self._vlobs[key] = Vlob(realm_id, [(blob, author, timestamp)])

        await self._update_changes(organization_id, author, realm_id, vlob_id)
Пример #4
0
    async def create(
        self,
        organization_id: OrganizationID,
        id: UUID,
        rts: str,
        wts: str,
        blob: bytes,
        author: DeviceID,
        notify_beacon: UUID = None,
    ) -> None:
        vlobs = self._organizations[organization_id]

        vlob = MemoryVlob(id, rts, wts)
        vlob.blob_versions.append((blob, author))
        if vlob.id in vlobs:
            raise VlobAlreadyExistsError()
        vlobs[vlob.id] = vlob

        if notify_beacon:
            await self.beacon_component.update(organization_id, notify_beacon, id, 1, author)
Пример #5
0
    async def create(
        self,
        organization_id: OrganizationID,
        author: DeviceID,
        realm_id: UUID,
        encryption_revision: int,
        vlob_id: UUID,
        timestamp: pendulum.Pendulum,
        blob: bytes,
    ) -> None:
        async with self.dbh.pool.acquire() as conn, conn.transaction():
            await _check_realm_and_write_access(
                conn, organization_id, author, realm_id, encryption_revision
            )

            # Actually create the vlob
            try:
                query = """
INSERT INTO vlob_atom (
    organization,
    vlob_encryption_revision,
    vlob_id,
    version,
    blob,
    size,
    author,
    created_on
)
SELECT
    ({}),
    ({}),
    $5,
    1,
    $6,
    $7,
    ({}),
    $8
RETURNING _id
""".format(
                    q_organization_internal_id(organization_id=Parameter("$1")),
                    Query.from_(t_vlob_encryption_revision)
                    .where(
                        (
                            t_vlob_encryption_revision.realm
                            == q_realm_internal_id(
                                organization_id=Parameter("$1"), realm_id=Parameter("$3")
                            )
                        )
                        & (t_vlob_encryption_revision.encryption_revision == Parameter("$4"))
                    )
                    .select("_id"),
                    q_device_internal_id(
                        organization_id=Parameter("$1"), device_id=Parameter("$2")
                    ),
                )

                vlob_atom_internal_id = await conn.fetchval(
                    query,
                    organization_id,
                    author,
                    realm_id,
                    encryption_revision,
                    vlob_id,
                    blob,
                    len(blob),
                    timestamp,
                )

            except UniqueViolationError:
                raise VlobAlreadyExistsError()

            await _vlob_updated(
                conn, vlob_atom_internal_id, organization_id, author, realm_id, vlob_id
            )