Пример #1
0
    def test_update_and_read(self):
        where_column_value_pairs = [('id', 2)]
        with database_context.WriteTransaction(self.dc) as context:
            db_class_unsharded.VtUnsharded.update_columns(
                context.get_cursor(),
                where_column_value_pairs,
                msg="test update")

        with database_context.ReadFromMaster(self.dc) as context:
            rows = db_class_unsharded.VtUnsharded.select_by_id(
                context.get_cursor(), 2)
            self.assertEqual(len(rows), 1, "wrong number of rows fetched")
            self.assertEqual(rows[0].msg, "test update", "wrong row fetched")
Пример #2
0
 def setUp(self):
     self.vtgate_addrs = {
         "vt": [
             utils.vtgate.addr(),
         ]
     }
     self.dc = database_context.DatabaseContext(self.vtgate_addrs)
     self.all_ids = []
     with database_context.WriteTransaction(self.dc) as context:
         for x in xrange(20):
             ret_id = db_class_unsharded.VtUnsharded.insert(
                 context.get_cursor(), msg="test message")
             self.all_ids.append(ret_id)
Пример #3
0
    def update_columns(self):
        with database_context.WriteTransaction(self.dc) as context:
            user_id = self.user_id_list[1]
            where_column_value_pairs = [
                ('id', user_id),
            ]
            entity_id_map = {'id': user_id}
            new_username = '******' % user_id
            update_cols = [
                ('username', new_username),
            ]
            db_class_sharded.VtUser.update_columns(
                context.get_cursor(entity_id_map=entity_id_map),
                where_column_value_pairs,
                update_column_value_pairs=update_cols)
            # verify the updated value.
            where_column_value_pairs = [
                ('id', user_id),
            ]
            rows = db_class_sharded.VtUser.select_by_columns(
                context.get_cursor(entity_id_map={'id': user_id}),
                where_column_value_pairs)
            self.assertEqual(len(rows), 1, "wrong number of rows fetched")
            self.assertEqual(new_username, rows[0].username)

            where_column_value_pairs = [
                ('user_id', user_id),
            ]
            entity_id_map = {'user_id': user_id}
            new_email = '*****@*****.**' % user_id
            m = hashlib.md5()
            m.update(new_email)
            email_hash = m.digest()
            update_cols = [('email', new_email), ('email_hash', email_hash)]
            db_class_sharded.VtUserEmail.update_columns(
                context.get_cursor(entity_id_map={'user_id': user_id}),
                where_column_value_pairs,
                update_column_value_pairs=update_cols)

        # verify the updated value.
        with database_context.ReadFromMaster(self.dc) as context:
            where_column_value_pairs = [
                ('user_id', user_id),
            ]
            entity_id_map = dict(where_column_value_pairs)
            rows = db_class_sharded.VtUserEmail.select_by_ids(
                context.get_cursor(entity_id_map=entity_id_map),
                where_column_value_pairs)
            self.assertEqual(len(rows), 1, "wrong number of rows fetched")
            self.assertEqual(new_email, rows[0].email)
        self.user_id_list.sort()
Пример #4
0
 def tearDown(self):
     with database_context.WriteTransaction(self.dc) as context:
         for uid in self.user_id_list:
             try:
                 db_class_sharded.VtUser.delete_by_columns(
                     context.get_cursor(entity_id_map={'id': uid}), [
                         ('id', uid),
                     ])
                 db_class_sharded.VtUserEmail.delete_by_columns(
                     context.get_cursor(entity_id_map={'user_id': uid}), [
                         ('user_id', uid),
                     ])
             except dbexceptions.DatabaseError as e:
                 if str(e) == "DB Row not found":
                     pass
Пример #5
0
    def test_update_and_read(self):
        id_val = self.all_ids[0]
        where_column_value_pairs = [('id', id_val)]
        with database_context.WriteTransaction(self.dc) as context:
            update_cols = [
                ('msg', 'test update'),
            ]
            db_class_unsharded.VtUnsharded.update_columns(
                context.get_cursor(),
                where_column_value_pairs,
                update_column_value_pairs=update_cols)

        with database_context.ReadFromMaster(self.dc) as context:
            rows = db_class_unsharded.VtUnsharded.select_by_id(
                context.get_cursor(), id_val)
            self.assertEqual(len(rows), 1, 'wrong number of rows fetched')
            self.assertEqual(rows[0].msg, 'test update', 'wrong row fetched')
Пример #6
0
    def populate_tables(self):
        self.user_id_list = []
        self.song_id_list = []
        self.user_song_map = {}
        r = random.Random()
        # This should create the lookup entries and sharding key.
        with database_context.WriteTransaction(self.dc) as context:
            for x in xrange(20):
                # vt_user - EntityRangeSharded; creates username:user_id lookup
                user_id = db_class_sharded.VtUser.insert(context.get_cursor(),
                                                         username="******" % x,
                                                         msg="test message")
                self.user_id_list.append(user_id)

                # vt_user_email - RangeSharded; references user_id:keyspace_id hash
                email = '*****@*****.**' % x
                m = hashlib.md5()
                m.update(email)
                email_hash = m.digest()
                entity_id_map = {'user_id': user_id}
                db_class_sharded.VtUserEmail.insert(
                    context.get_cursor(entity_id_map=entity_id_map),
                    user_id=user_id,
                    email=email,
                    email_hash=email_hash)

                # vt_song - EntityRangeSharded; creates song_id:user_id lookup
                num_songs_for_user = r.randint(1, 5)
                for i in xrange(num_songs_for_user):
                    song_id = db_class_sharded.VtSong.insert(
                        context.get_cursor(),
                        user_id=user_id,
                        title="Test Song")
                    self.song_id_list.append(song_id)
                    self.user_song_map.setdefault(user_id, []).append(song_id)

                    # vt_song_detail - RangeSharded; references song_id:user_id lookup
                    entity_id_map = {'song_id': song_id}
                    db_class_sharded.VtSongDetail.insert(
                        context.get_cursor(entity_id_map=entity_id_map),
                        song_id=song_id,
                        album_name="Test album",
                        artist="Test artist")
Пример #7
0
  def delete_columns(self):
    user_id = self.user_id_list[-1]
    with database_context.WriteTransaction(self.dc) as context:
      where_column_value_pairs = [('id', user_id),]
      entity_id_map = {'id': user_id}
      db_class_sharded.VtUser.delete_by_columns(context.get_cursor(entity_id_map=entity_id_map),
                                             where_column_value_pairs)

      where_column_value_pairs = [('user_id', user_id),]
      entity_id_map = {'user_id': user_id}
      db_class_sharded.VtUserEmail.delete_by_columns(context.get_cursor(entity_id_map=entity_id_map),
                                                  where_column_value_pairs)

    with database_context.ReadFromMaster(self.dc) as context:
      rows = db_class_sharded.VtUser.select_by_columns(
          context.get_cursor(entity_id_map=entity_id_map),
          where_column_value_pairs)
      self.assertEqual(len(rows), 0, "wrong number of rows fetched")

      rows = db_class_sharded.VtUserEmail.select_by_ids(
          context.get_cursor(entity_id_map=entity_id_map),
          where_column_value_pairs)
      self.assertEqual(len(rows), 0, "wrong number of rows fetched")
    self.user_id_list = self.user_id_list[:-1]
Пример #8
0
  def populate_tables(self):
    # vt_user
    user_id_list = []
    # This should create the lookup entries and sharding key.
    with database_context.WriteTransaction(self.dc) as context:
      for x in xrange(20):
        # vt_user - EntityRangeSharded
        user_id = db_class_sharded.VtUser.insert(context.get_cursor(),
                                       username="******" % x, msg=str(x))
        user_id_list.append(user_id)

        # vt_user_email - RangeSharded
        email = '*****@*****.**' % x
        m = hashlib.md5()
        m.update(email)
        email_hash = m.digest()
        entity_id_map={'user_id':user_id}
        db_class_sharded.VtUserEmail.insert(
            context.get_cursor(entity_id_map=entity_id_map),
            user_id=user_id, email=email,
            email_hash=email_hash)
    # vt_song
    # vt_song_detail
    return user_id_list
Пример #9
0
    def test_batch_write(self):
        # TODO(sougou): fix
        return
        # 1. Create DMLs using DB Classes.
        query_list = []
        bv_list = []
        # Update VtUser table.
        user_id = self.user_id_list[1]
        where_column_value_pairs = (('id', user_id), )
        entity_id_map = dict(where_column_value_pairs)
        new_username = '******' % user_id
        update_cols = [
            ('username', new_username),
        ]
        q, bv = db_class_sharded.VtUser.create_update_query(
            where_column_value_pairs, update_column_value_pairs=update_cols)
        query_list.append(q)
        bv_list.append(bv)
        # Update VtUserEmail table.
        where_column_value_pairs = [
            ('user_id', user_id),
        ]
        new_email = '*****@*****.**' % user_id
        m = hashlib.md5()
        m.update(new_email)
        email_hash = m.digest()
        update_cols = [('email', new_email), ('email_hash', email_hash)]
        q, bv = db_class_sharded.VtUserEmail.create_update_query(
            where_column_value_pairs, update_column_value_pairs=update_cols)
        query_list.append(q)
        bv_list.append(bv)
        # Delete a VtSong row
        where_column_value_pairs = [
            ('user_id', user_id),
        ]
        q, bv = db_class_sharded.VtSong.create_delete_query(
            where_column_value_pairs)
        query_list.append(q)
        bv_list.append(bv)
        with database_context.WriteTransaction(self.dc) as context:
            # 2. Routing for query_list is done by associating
            # the common entity_id to the cursor.
            # NOTE: cursor creation needs binding to a particular db class,
            # so we create a writable cursor using the common entity (user_id).
            # This entity_id is used to derive the keyspace_id for routing the dmls.
            entity_id_map = {'id': user_id}
            cursor = context.get_cursor(entity_id_map=entity_id_map)(
                db_class_sharded.VtUser)
            # 3. Execute the writable batch query.
            results = db_object.execute_batch_write(cursor, query_list,
                                                    bv_list)

            # 4. Verify results
            self.assertEqual(len(results), len(query_list))
            self.assertEqual(results[0]['rowcount'], 1,
                             "VtUser update didn't update 1 row")
            self.assertEqual(results[1]['rowcount'], 1,
                             "VtUserEmail update didn't update 1 row")
            self.assertEqual(
                results[2]['rowcount'], len(self.user_song_map[user_id]),
                "VtSong deleted '%d' rows, expected '%d'" %
                (results[2]['rowcount'], len(self.user_song_map[user_id])))