示例#1
0
def group_function(query, sql, arg_offset, later, user, after_data, op, auth_add, writer, config=None):
	l = len(query) - arg_offset
	sys.stderr.write("len %s\n" %(l))
	if l == 1:
		if op == "stat":
			return_document([{"name":"stat"}], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
			return {"done":True}
		if query[arg_offset] == '-any-':
			sql = "select myemsl.groups.name from myemsl.group_items, myemsl.groups, (%s) as d where myemsl.group_items.item_id = d.item_id and myemsl.group_items.group_id = myemsl.groups.group_id and myemsl.groups.name != '' group by myemsl.groups.name" %(sql)
		else:
			sql = "select myemsl.groups.name from myemsl.group_items, myemsl.groups, (%s) as d where myemsl.group_items.item_id = d.item_id and myemsl.group_items.group_id = myemsl.groups.group_id and myemsl.groups.name != '' and myemsl.groups.type = '%s' group by myemsl.groups.name" %(sql, pg_escape_string(query[arg_offset]))
		sys.stderr.write("SQL: %s\n" %(sql))
		cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
		cursor = cnx.cursor()
		cursor.execute(sql)
		rows = cursor.fetchall()
		dirs = []
		for row in rows:
			dirs.append({"name":row[0]})
		if len(dirs) == 0:
			dirs = None
		return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op, False, user, writer)
		return {"done":True}
	elif l < 2:
		if op == "stat":
			return_document([{"name":"stat"}], None, None, DOCUMENT_FILTERS, True, op, auth_add, user, writer)
			return {"done":True}
		sql = "select myemsl.groups.type from myemsl.group_items, myemsl.groups, (%s) as d where myemsl.group_items.item_id = d.item_id and myemsl.group_items.group_id = myemsl.groups.group_id and myemsl.groups.name != '' group by myemsl.groups.type" %(sql)
		sys.stderr.write("SQL: %s\n" %(sql))
		cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
		cursor = cnx.cursor()
		cursor.execute(sql)
		rows = cursor.fetchall()
		dirs = []
		for row in rows:
			dirs.append({"name":row[0]})
		if len(dirs) == 0:
			dirs = None
		return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op, False, user, writer)
		return {"done":True}
	if len(query) - arg_offset == 2 and op == "stat":
		return_document([{"name":"stat"}], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
		return {"done":True}
	qry_string = ''
	if query[arg_offset] != '-any-' or query[arg_offset + 1] != '-any-':
		qry_string = ' where '
		if query[arg_offset + 1] != '-any-':
			qry_string += "myemsl.groups.name = '%s'" %(pg_escape_string(query[arg_offset + 1]))
			if query[arg_offset] != '-any-':
				qry_string += ' and '
		if query[arg_offset] != '-any-':
			qry_string += "myemsl.groups.type = '%s'" %(pg_escape_string(query[arg_offset]))
	sql = """
select type, name, subdir, transaction, files.item_id, aged from (%s) as files, (select item_id from myemsl.group_items, (with recursive t(group_id) as (select myemsl.groups.group_id from myemsl.groups%s union all select child_id from myemsl.subgroups, t where myemsl.subgroups.parent_id = t.group_id) select group_id from t) as groups where myemsl.group_items.group_id = groups.group_id) as items where files.item_id = items.item_id
""" %(sql, qry_string)
	return {"done":False, "consumed":2, "sql":sql}
示例#2
0
def proposal_function(query, sql, arg_offset, later, user, after_data, op, auth_add, writer, config=None):
	if len(query) - arg_offset < 1:
		if op == "stat":
			return_document([{"name":"stat"}], None, None, DOCUMENT_FILTERS, True, op, auth_add, user, writer)
			return {"done":True}
		sql = """
select eus.proposals.proposal_id from (with recursive t(group_id) as (select myemsl.group_items.group_id from (%s) as foo, myemsl.items, myemsl.group_items where foo.item_id = myemsl.items.item_id and myemsl.items.item_id = myemsl.group_items.item_id group by myemsl.group_items.group_id union all select myemsl.subgroups.parent_id as group_id from myemsl.subgroups, t where myemsl.subgroups.child_id = t.group_id) select group_id from t) as groups, eus.proposals where eus.proposals.group_id = groups.group_id group by eus.proposals.proposal_id;
""" %(sql)
		cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
		cursor = cnx.cursor()
		cursor.execute(sql)
		rows = cursor.fetchall()
		dirs = []
		for row in rows:
			dirs.append({"name":row[0]})
		if len(dirs) == 0:
			dirs = None
		return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op, False, user, writer)
		return {"done":True}
	if len(query) - arg_offset == 1 and op == "stat":
		return_document([{"name":"stat"}], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
		return {"done":True}
	qry_string = ''
	if query[arg_offset] != '-any-':
		qry_string =  " where eus.proposals.proposal_id = '%s'" %(pg_escape_string(query[arg_offset]))
	sql = """
select type, name, subdir, transaction, files.item_id, aged from (%s) as files, (select item_id from myemsl.group_items, (with recursive t(group_id) as (select eus.proposals.group_id from eus.proposals%s union all select child_id from myemsl.subgroups, t where myemsl.subgroups.parent_id = t.group_id) select group_id from t) as groups where myemsl.group_items.group_id = groups.group_id) as items where files.item_id = items.item_id
""" %(sql, qry_string)
	return {"done":False, "consumed":1, "sql":sql}
示例#3
0
def submit_time_function(query,
                         sql,
                         arg_offset,
                         later,
                         user,
                         after_data,
                         op,
                         auth_add,
                         writer,
                         config=None):
    if len(query) - arg_offset < 1:
        if op == "stat":
            return_document([{
                "name": "stat"
            }], None, None, DOCUMENT_FILTERS, True, op, auth_add, user, writer)
            return {"done": True}
        sql = "select stime from (%s) as foo, myemsl.transactions where foo.transaction = myemsl.transactions.transaction group by myemsl.transactions.stime order by myemsl.transactions.stime" % (
            sql)
        cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
        cursor = cnx.cursor()
        cursor.execute(sql)
        rows = cursor.fetchall()
        dirs = []
        for row in rows:
            dirs.append({"name": row[0]})
        if len(dirs) == 0:
            dirs = None
        return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op,
                        False, user, writer)
        return {"done": True}
    if len(query) - arg_offset == 1 and op == "stat":
        return_document([{
            "name": "stat"
        }], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
        return {"done": True}
    qry_string = ''
    if query[arg_offset] != '-any-':
        qry_string = ", myemsl.transactions where stime='%s' and myemsl.transactions.transaction = bar.transaction" % (
            pg_escape_string(query[arg_offset]))
    return {
        "done":
        False,
        "consumed":
        1,
        "sql":
        "select type, name, subdir, bar.transaction, item_id, aged from (%s) as bar%s"
        % (sql, qry_string)
    }
示例#4
0
def proposal_function(query,
                      sql,
                      arg_offset,
                      later,
                      user,
                      after_data,
                      op,
                      auth_add,
                      writer,
                      config=None):
    if len(query) - arg_offset < 1:
        if op == "stat":
            return_document([{
                "name": "stat"
            }], None, None, DOCUMENT_FILTERS, True, op, auth_add, user, writer)
            return {"done": True}
        sql = """
select eus.proposals.proposal_id from (with recursive t(group_id) as (select myemsl.group_items.group_id from (%s) as foo, myemsl.items, myemsl.group_items where foo.item_id = myemsl.items.item_id and myemsl.items.item_id = myemsl.group_items.item_id group by myemsl.group_items.group_id union all select myemsl.subgroups.parent_id as group_id from myemsl.subgroups, t where myemsl.subgroups.child_id = t.group_id) select group_id from t) as groups, eus.proposals where eus.proposals.group_id = groups.group_id group by eus.proposals.proposal_id;
""" % (sql)
        cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
        cursor = cnx.cursor()
        cursor.execute(sql)
        rows = cursor.fetchall()
        dirs = []
        for row in rows:
            dirs.append({"name": row[0]})
        if len(dirs) == 0:
            dirs = None
        return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op,
                        False, user, writer)
        return {"done": True}
    if len(query) - arg_offset == 1 and op == "stat":
        return_document([{
            "name": "stat"
        }], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
        return {"done": True}
    qry_string = ''
    if query[arg_offset] != '-any-':
        qry_string = " where eus.proposals.proposal_id = '%s'" % (
            pg_escape_string(query[arg_offset]))
    sql = """
select type, name, subdir, transaction, files.item_id, aged from (%s) as files, (select item_id from myemsl.group_items, (with recursive t(group_id) as (select eus.proposals.group_id from eus.proposals%s union all select child_id from myemsl.subgroups, t where myemsl.subgroups.parent_id = t.group_id) select group_id from t) as groups where myemsl.group_items.group_id = groups.group_id) as items where files.item_id = items.item_id
""" % (sql, qry_string)
    return {"done": False, "consumed": 1, "sql": sql}
示例#5
0
def group_name_function(query,
                        sql,
                        arg_offset,
                        later,
                        user,
                        after_data,
                        op,
                        auth_add,
                        writer,
                        config=None):
    if len(query) - arg_offset < 1:
        if op == "stat":
            return_document([{
                "name": "stat"
            }], None, None, DOCUMENT_FILTERS, True, op, auth_add, user, writer)
            return {"done": True}


#FIXME upper
        sql = "select myemsl.groups.name from myemsl.group_items, myemsl.groups, (%s) as d where myemsl.group_items.item_id = d.item_id and myemsl.group_items.group_id = myemsl.groups.group_id and myemsl.groups.name != '' group by myemsl.groups.name" % (
            sql)
        sys.stderr.write("SQL: %s\n" % (sql))
        cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
        cursor = cnx.cursor()
        cursor.execute(sql)
        rows = cursor.fetchall()
        dirs = []
        for row in rows:
            dirs.append({"name": row[0]})
        if len(dirs) == 0:
            dirs = None
        return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op,
                        False, user, writer)
        return {"done": True}
    if len(query) - arg_offset == 1 and op == "stat":
        return_document([{
            "name": "stat"
        }], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
        return {"done": True}
    sql = """
select type, name, subdir, transaction, files.item_id, aged from (%s) as files, (select item_id from myemsl.group_items, (with recursive t(group_id) as (select myemsl.groups.group_id from myemsl.groups where myemsl.groups.name = '%s' union all select child_id from myemsl.subgroups, t where myemsl.subgroups.parent_id = t.group_id) select group_id from t) as groups where myemsl.group_items.group_id = groups.group_id) as items where files.item_id = items.item_id
""" % (sql, pg_escape_string(query[arg_offset]))
    return {"done": False, "consumed": 1, "sql": sql}
示例#6
0
def raw_function(query,
                 sql,
                 arg_offset,
                 later,
                 user,
                 after_data,
                 op,
                 auth_add,
                 writer,
                 config=None):
    l = len(query) - arg_offset
    sys.stderr.write("len %s\n" % (l))
    if l == 2:
        if op == "stat":
            return_document([{
                "name": "stat"
            }], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user,
                            writer)
            return {"done": True}
        if query[arg_offset] == '-any-':
            sql = "select transaction from (%s) as d group by d.transaction" % (
                sql)
        else:
            sql = "select d.transaction from (%s) as d, myemsl.transactions where d.transaction = myemsl.transactions.transaction and myemsl.transactions.submitter = '%s' group by d.transaction" % (
                sql, pg_escape_string(query[arg_offset]))
        sys.stderr.write("SQL: %s\n" % (sql))
        cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
        cursor = cnx.cursor()
        cursor.execute(sql)
        rows = cursor.fetchall()
        dirs = []
        for row in rows:
            dirs.append({"name": row[0]})
        if len(dirs) == 0:
            dirs = None
        return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op,
                        False, user, writer)
        return {"done": True}
    if l == 1:
        if op == "stat":
            return_document([{
                "name": "stat"
            }], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user,
                            writer)
            return {"done": True}
        dirs = []
        dirs.append({"name": 'bundle'})
        return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op,
                        False, user, writer)
        return {"done": True}
    elif l < 3:
        if op == "stat":
            return_document([{
                "name": "stat"
            }], None, None, DOCUMENT_FILTERS, True, op, auth_add, user, writer)
            return {"done": True}
        sql = "select myemsl.transactions.submitter from myemsl.transactions, (%s) as d where myemsl.transactions.transaction = d.transaction group by myemsl.transactions.submitter" % (
            sql)
        sys.stderr.write("SQL: %s\n" % (sql))
        cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
        cursor = cnx.cursor()
        cursor.execute(sql)
        rows = cursor.fetchall()
        dirs = []
        for row in rows:
            dirs.append({"name": row[0]})
        if len(dirs) == 0:
            dirs = None
        return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op,
                        False, user, writer)
        return {"done": True}
    if len(query) - arg_offset == 3 and op == "stat":
        return_document([{
            "name": "stat"
        }], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
        return {"done": True}
    sql = """
		select type, name, subdir, d.transaction, item_id, aged from (%s) as d, myemsl.transactions where myemsl.transactions.transaction = d.transaction and d.transaction = %s and myemsl.transactions.submitter = %s
""" % (sql, int(query[arg_offset + 2]), int(query[arg_offset]))
    return {"done": False, "consumed": 3, "sql": sql}
示例#7
0
def select_and_return(sql, left, user, op, auth_add, writer, config=None):
    #sql = "select type, inode, parent_inode, name, subdir, bundle, submitter from (%s) as foo where subdir = ''" %(sql)
    if left == None or len(left) == 0:
        subdir = ""
        if op == "stat":
            return_document([{
                "name": "stat"
            }], None, None, DOCUMENT_DATA, True, op, auth_add, user, writer)
            return {"done": True}
    else:
        tmpleft = left
        if op == "stat":
            tmpleft = left[0:-1]
        subdir = "%s" % ('/'.join([str(i) for i in tmpleft]))
#	sql = "select name, max(bundle) as bundle from (%s) as foo where subdir = '%s' group by name" %(sql, subdir)
#	sql = "select type, inode, parent_inode, foo.name, subdir, foo.bundle, submitter from (%s) as foo, (%s) as basefiles where basefiles.bundle = foo.bundle and basefiles.name = foo.name and subdir = '%s'" %(sql, base_sql, subdir)
#Authz stuff
#FIXME order?
    file_proposal_member = """
foo.item_id in (with recursive t(group_id) as (
select eus.proposals.group_id from eus.proposal_members, eus.proposals, myemsl.groups where eus.proposal_members.person_id = %s and eus.proposals.proposal_id = eus.proposal_members.proposal_id and eus.proposals.group_id = groups.group_id
union
select myemsl.subgroups.child_id as group_id from myemsl.subgroups, t where myemsl.subgroups.parent_id = t.group_id
) select item_id from t, myemsl.group_items where myemsl.group_items.group_id = t.group_id)
	""" % (int(user))
    new_sql = """
	select type, name, subdir, foo.transaction, submitter, item_id from (%s) as foo, myemsl.transactions where (submitter = %s or foo.aged = TRUE or %s) and foo.transaction = myemsl.transactions.transaction order by transaction desc
	""" % (sql, int(user), file_proposal_member)
    sql = new_sql
    #Dirs stuff
    if subdir == '':
        subdirstuff = "subdir like '%%'"
        start = 1
    else:
        like_escape = pg_escape_string(subdir).replace('\\', '\\\\').replace(
            '%', '\\%').replace('_', '\\_')
        subdirstuff = "subdir like '%s/%%'" % (like_escape)
        start = len(subdir) + 2
    new_sql = """
	select case when subdir = '%s' then 'f' else 'd' end as type, case when subdir = '%s' then name else split_part(substr(subdir, '%s'), '/', 1) end as name, subdir, transaction, submitter, item_id from (%s) as foo where (subdir = '%s' or %s)
	""" % (pg_escape_string(subdir), pg_escape_string(subdir),
        pg_escape_string(start), sql, pg_escape_string(subdir), subdirstuff)
    sql = new_sql
    if op == "stat":
        name = left[-1:][0]
        new_sql = """
		select type, name, transaction from (%s) as foo where name = '%s'
		""" % (sql, name)
        sql = new_sql
    #Remove duplicates
    new_sql = """
	select type, name, max(transaction) as transaction from (%s) as foo group by name, type
	""" % (sql)
    sql = new_sql
    #FIXME remove subdir
    #Add submitter back
    new_sql = """
	select type, name, foo.transaction as transaction, submitter from (%s) as foo left outer join myemsl.transactions on (foo.transaction = myemsl.transactions.transaction)
	""" % (sql)
    sql = new_sql
    new_sql = """
	select type, foo.name, '%s' as subdir, foo.transaction, submitter, item_id, size from (%s) as foo left outer join myemsl.files on (foo.transaction = myemsl.files.transaction and foo.name = myemsl.files.name and myemsl.files.subdir = '%s')
	""" % (pg_escape_string(subdir), sql, pg_escape_string(subdir))
    sql = new_sql
    logger.info("%s", sql)
    #Dirs stuff
    #	new_sql = "SELECT 'd' as type, name, subdir, 0 as transaction, -1 as submitter, 0 as item_id FROM myemsl.dirs where subdir = '%s' union %s" %(subdir, sql)
    #	sql = new_sql
    sys.stderr.write("SQL: %s, Left: %s\n" % (sql, left))
    cnx = myemsldb_connect(myemsl_schema_versions=['1.3'], dbconf=config)
    cursor = cnx.cursor()
    cursor.execute(sql)
    rows = cursor.fetchall()
    dirs = []
    files = []
    if op == "stat":
        dirfound = False
        for row in rows:
            if (row[0] == 'd'):
                dirfound = True
            else:
                files.append({
                    "name":
                    "stat",
                    "location":
                    "%s/bundle/%s/%s/%s" % (row[4], row[3], row[2], row[1]),
                    "itemid":
                    row[5],
                    "size":
                    row[6]
                })
        if dirfound:
            dirs.append({"name": "stat"})
            files = []
    else:
        for row in rows:
            if (row[0] == 'd'):
                dirs.append({"name": row[1]})
            else:
                files.append({
                    "name":
                    row[1],
                    "location":
                    "%s/bundle/%s/%s/%s" % (row[4], row[3], row[2], row[1]),
                    "itemid":
                    row[5],
                    "size":
                    row[6]
                })
    if len(dirs) == 0:
        dirs = None
    if len(files) == 0:
        files = None


#FIXME is DOCUMENT_REGULAR correct?
    return_document(dirs, files, None, DOCUMENT_REGULAR, True, op, auth_add,
                    user, writer)
    return {"done": True}
示例#8
0
def submit_time_function(query, sql, arg_offset, later, user, after_data, op, auth_add, writer, config=None):
	if len(query) - arg_offset < 1:
		if op == "stat":
			return_document([{"name":"stat"}], None, None, DOCUMENT_FILTERS, True, op, auth_add, user, writer)
			return {"done":True}
		sql = "select stime from (%s) as foo, myemsl.transactions where foo.transaction = myemsl.transactions.transaction group by myemsl.transactions.stime order by myemsl.transactions.stime" %(sql)
		cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
		cursor = cnx.cursor()
		cursor.execute(sql)
		rows = cursor.fetchall()
		dirs = []
		for row in rows:
			dirs.append({"name":row[0]})
		if len(dirs) == 0:
			dirs = None
		return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op, False, user, writer)
		return {"done":True}
	if len(query) - arg_offset == 1 and op == "stat":
		return_document([{"name":"stat"}], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
		return {"done":True}
	qry_string = ''
	if query[arg_offset] != '-any-':
		qry_string = ", myemsl.transactions where stime='%s' and myemsl.transactions.transaction = bar.transaction" %(pg_escape_string(query[arg_offset]))
	return {"done":False, "consumed":1, "sql":"select type, name, subdir, bar.transaction, item_id, aged from (%s) as bar%s" %(sql, qry_string)}
示例#9
0
def raw_function(query, sql, arg_offset, later, user, after_data, op, auth_add, writer, config=None):
	l = len(query) - arg_offset
	sys.stderr.write("len %s\n" %(l))
	if l == 2:
		if op == "stat":
			return_document([{"name":"stat"}], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
			return {"done":True}
		if query[arg_offset] == '-any-':
			sql = "select transaction from (%s) as d group by d.transaction" %(sql)
		else:
			sql = "select d.transaction from (%s) as d, myemsl.transactions where d.transaction = myemsl.transactions.transaction and myemsl.transactions.submitter = '%s' group by d.transaction" %(sql, pg_escape_string(query[arg_offset]))
		sys.stderr.write("SQL: %s\n" %(sql))
		cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
		cursor = cnx.cursor()
		cursor.execute(sql)
		rows = cursor.fetchall()
		dirs = []
		for row in rows:
			dirs.append({"name":row[0]})
		if len(dirs) == 0:
			dirs = None
		return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op, False, user, writer)
		return {"done":True}
	if l == 1:
		if op == "stat":
			return_document([{"name":"stat"}], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
			return {"done":True}
		dirs = []
		dirs.append({"name":'bundle'})
		return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op, False, user, writer)
		return {"done":True}
	elif l < 3:
		if op == "stat":
			return_document([{"name":"stat"}], None, None, DOCUMENT_FILTERS, True, op, auth_add, user, writer)
			return {"done":True}
		sql = "select myemsl.transactions.submitter from myemsl.transactions, (%s) as d where myemsl.transactions.transaction = d.transaction group by myemsl.transactions.submitter" %(sql)
		sys.stderr.write("SQL: %s\n" %(sql))
		cnx = myemsldb_connect(myemsl_schema_versions=['1.0'], dbconf=config)
		cursor = cnx.cursor()
		cursor.execute(sql)
		rows = cursor.fetchall()
		dirs = []
		for row in rows:
			dirs.append({"name":row[0]})
		if len(dirs) == 0:
			dirs = None
		return_document(dirs, None, None, DOCUMENT_FILTER_ARGS, after_data, op, False, user, writer)
		return {"done":True}
	if len(query) - arg_offset == 3 and op == "stat":
		return_document([{"name":"stat"}], None, None, DOCUMENT_FILTER_ARGS, True, op, auth_add, user, writer)
		return {"done":True}
	sql = """
		select type, name, subdir, d.transaction, item_id, aged from (%s) as d, myemsl.transactions where myemsl.transactions.transaction = d.transaction and d.transaction = %s and myemsl.transactions.submitter = %s
""" %(sql, int(query[arg_offset + 2]), int(query[arg_offset]))
	return {"done":False, "consumed":3, "sql":sql}
示例#10
0
def select_and_return(sql, left, user, op, auth_add, writer, config=None):
	#sql = "select type, inode, parent_inode, name, subdir, bundle, submitter from (%s) as foo where subdir = ''" %(sql)
	if left == None or len(left) == 0:
		subdir = ""
		if op == "stat":
			return_document([{"name":"stat"}], None, None, DOCUMENT_DATA, True, op, auth_add, user, writer)
			return {"done":True}
	else:
		tmpleft = left
		if op == "stat":
			tmpleft = left[0:-1]
		subdir = "%s" %('/'.join([str(i) for i in tmpleft]))
#	sql = "select name, max(bundle) as bundle from (%s) as foo where subdir = '%s' group by name" %(sql, subdir)
#	sql = "select type, inode, parent_inode, foo.name, subdir, foo.bundle, submitter from (%s) as foo, (%s) as basefiles where basefiles.bundle = foo.bundle and basefiles.name = foo.name and subdir = '%s'" %(sql, base_sql, subdir)
	#Authz stuff
#FIXME order?
	file_proposal_member = """
foo.item_id in (with recursive t(group_id) as (
select eus.proposals.group_id from eus.proposal_members, eus.proposals, myemsl.groups where eus.proposal_members.person_id = %s and eus.proposals.proposal_id = eus.proposal_members.proposal_id and eus.proposals.group_id = groups.group_id
union
select myemsl.subgroups.child_id as group_id from myemsl.subgroups, t where myemsl.subgroups.parent_id = t.group_id
) select item_id from t, myemsl.group_items where myemsl.group_items.group_id = t.group_id)
	""" %(int(user))
	new_sql = """
	select type, name, subdir, foo.transaction, submitter, item_id from (%s) as foo, myemsl.transactions where (submitter = %s or foo.aged = TRUE or %s) and foo.transaction = myemsl.transactions.transaction order by transaction desc
	""" %(sql, int(user), file_proposal_member)
	sql = new_sql
	#Dirs stuff
	if subdir == '':
		subdirstuff = "subdir like '%%'"
		start = 1
	else:
		like_escape = pg_escape_string(subdir).replace('\\', '\\\\').replace('%', '\\%').replace('_', '\\_')
		subdirstuff = "subdir like '%s/%%'" %(like_escape)
		start = len(subdir) + 2
	new_sql = """
	select case when subdir = '%s' then 'f' else 'd' end as type, case when subdir = '%s' then name else split_part(substr(subdir, '%s'), '/', 1) end as name, subdir, transaction, submitter, item_id from (%s) as foo where (subdir = '%s' or %s)
	""" %(pg_escape_string(subdir), pg_escape_string(subdir), pg_escape_string(start), sql, pg_escape_string(subdir), subdirstuff)
	sql = new_sql
	if op == "stat":
		name = left[-1:][0]
		new_sql = """
		select type, name, transaction from (%s) as foo where name = '%s'
		""" %(sql, name)
		sql = new_sql
	#Remove duplicates
	new_sql = """
	select type, name, max(transaction) as transaction from (%s) as foo group by name, type
	""" %(sql)
	sql = new_sql
#FIXME remove subdir
	#Add submitter back
	new_sql = """
	select type, name, foo.transaction as transaction, submitter from (%s) as foo left outer join myemsl.transactions on (foo.transaction = myemsl.transactions.transaction)
	""" %(sql)
	sql = new_sql
	new_sql = """
	select type, foo.name, '%s' as subdir, foo.transaction, submitter, item_id, size from (%s) as foo left outer join myemsl.files on (foo.transaction = myemsl.files.transaction and foo.name = myemsl.files.name and myemsl.files.subdir = '%s')
	""" %(pg_escape_string(subdir), sql, pg_escape_string(subdir))
	sql = new_sql
	logger.info("%s", sql)
	#Dirs stuff
#	new_sql = "SELECT 'd' as type, name, subdir, 0 as transaction, -1 as submitter, 0 as item_id FROM myemsl.dirs where subdir = '%s' union %s" %(subdir, sql)
#	sql = new_sql
	sys.stderr.write("SQL: %s, Left: %s\n" %(sql, left))
	cnx = myemsldb_connect(myemsl_schema_versions=['1.3'], dbconf=config)
	cursor = cnx.cursor()
	cursor.execute(sql)
	rows = cursor.fetchall()
	dirs = []
	files = []
	if op == "stat":
		dirfound = False
		for row in rows:
			if(row[0] == 'd'):
				dirfound = True
			else:
				files.append({"name":"stat", "location":"%s/bundle/%s/%s/%s" %(row[4], row[3], row[2], row[1]), "itemid":row[5], "size":row[6]})
		if dirfound:
			dirs.append({"name":"stat"})
			files = []
	else:
		for row in rows:
			if(row[0] == 'd'):
				dirs.append({"name":row[1]})
			else:
				files.append({"name":row[1], "location":"%s/bundle/%s/%s/%s" %(row[4], row[3], row[2], row[1]), "itemid":row[5], "size":row[6]})
	if len(dirs) == 0:
		dirs = None
	if len(files) == 0:
		files = None
#FIXME is DOCUMENT_REGULAR correct?
	return_document(dirs, files, None, DOCUMENT_REGULAR, True, op, auth_add, user, writer)
	return {"done":True}