示例#1
0
def get_result(query, collection, projection, sort, limit, skip,
               exception_msg):
    try:
        cur = transactional_shim.find(collection, query, projection)

        if sort is None:
            ret = [util.deep_convert_to_unordered(i) for i in cur]
            ret.sort(cmp=util.mongo_compare_unordered_dict_items)
        elif isinstance(collection, MongoCollection):
            ret = copy.deepcopy([i for i in cur])
            for i, val in enumerate(ret):
                if '_id' in val:
                    val['_id'] = 0

            ret = util.MongoModelNondeterministicList(ret, sort, limit, skip,
                                                      query, projection,
                                                      collection.options)
            # print ret
        else:
            ret = [i for i in cur.sort(sort).skip(skip).limit(limit)]
            for i, val in enumerate(ret):
                if '_id' in val:
                    val['_id'] = 0
                # print '1====', i, ret[i]

        return ret

    except pymongo.errors.OperationFailure as e:
        exception_msg.append('Caught PyMongo error:\n\n'
                             '  Collection: %s\n' % str(collection) +
                             '  Exception: %s\n' % str(e) +
                             '  Query: %s\n' % str(query) +
                             '  Projection: %s\n' % str(projection) +
                             '  Sort: %s\n' % str(sort) +
                             '  Limit: %r\n' % limit + '  Skip: %r\n' % skip)
    except MongoModelException as e:
        exception_msg.append('Caught Mongo Model error:\n\n'
                             '  Collection: %s\n' % str(collection) +
                             '  Exception: %s\n' % str(e) +
                             '  Query: %s\n' % str(query) +
                             '  Projection: %s\n' % str(projection) +
                             '  Sort: %s\n' % str(sort) +
                             '  Limit: %r\n' % limit + '  Skip: %r\n' % skip)

    return list()
示例#2
0
def test_update(collections, verbose=False):
    okay = True
    for i in range(1, 10):
        update = gen.random_update(collections[0])

        util.trace('debug', '\n========== Update No.', i, '==========')
        util.trace('debug', 'Query:', update['query'])
        util.trace('debug', 'Update:', str(update['update']))
        util.trace('debug', 'Number results from collection: ',
                   gen.count_query_results(collections[0], update['query']))
        for item in transactional_shim.find(collections[0], update['query']):
            util.trace('debug', 'Find Result0:', item)

        exception = []
        exception_msg = []
        for coll in collections:
            try:
                if verbose:
                    all = [x for x in coll.find(dict())]
                    for item in transactional_shim.find(coll, update['query']):
                        print 'Before update doc:', item
                    print 'Before update coll size: ', len(all)

                transactional_shim.update(coll,
                                          update['query'],
                                          update['update'],
                                          upsert=update['upsert'],
                                          multi=update['multi'])

                if verbose:
                    all = [x for x in coll.find(dict())]
                    for item in coll.find(update['query']):
                        print 'After update doc:', item
                    print 'After update coll size: ', len(all)

            except pymongo.errors.OperationFailure as e:
                exception.append(e)
                exception_msg.append(
                    util.join_n(
                        'Caught PyMongo error while attempting update: %s' %
                        e[0], 'Query: %s' % update['query'],
                        'Update: %s' % update['update'],
                        'Upsert: {0}, Multi: {1}'.format(
                            update['upsert'], update['multi'])))
            except MongoModelException as e:
                exception.append(e)
                exception_msg.append(
                    util.join_n('Caught MongoModel error. Offending update(',
                                str(update['query']), str(update['update']),
                                str(update['upsert']), str(update['multi']),
                                ')'))

        if len(exception_msg) == 1:
            print 'Update: ' + str(update['update'])
            print '\033[91m', exception[0], '\033[0m'
            print '\033[91m', exception_msg[0], '\033[0m'
            return False

        if not check_query(dict(), collections[0], collections[1]):
            print 'Update: ' + str(update['update'])
            return False

    return okay