-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathschemas.py
94 lines (81 loc) · 2.91 KB
/
schemas.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from dataclasses import dataclass
from typing import Dict
@dataclass
class SvenDataRow:
func_id: str
func_name: str
func_src_before: str
func_src_after: str
line_changes: str
char_changes: str
commit_link: str
file_name: str
vul_type: str
@classmethod
def from_dict(cls, row: Dict[str, any]):
return cls(
func_id=row.get('func_id', ""),
func_name=row.get('func_name', ""),
func_src_before=row.get('func_src_before', ""),
func_src_after=row.get('func_src_after', ""),
line_changes=str(row.get('line_changes', "")),
char_changes=str(row.get('char_changes', "")),
commit_link=row.get('commit_link', ""),
file_name=row.get('file_name', ""),
vul_type=row.get('vul_type', ""),
)
def generate_insert_data(self, table_name):
cmd_str = (
f"INSERT IGNORE INTO {table_name} (func_id, func_name, func_src_before, func_src_after, line_changes, char_changes, commit_link, file_name, vul_type) "
"VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)")
data = (self.func_id, self.func_name, self.func_src_before, self.func_src_after, self.line_changes, self.char_changes, self.commit_link, self.file_name, self.vul_type)
return cmd_str, data
def safe_get(list, index):
try:
return list[index]
except IndexError:
return None
class UserQueryPromptWrapper:
def __init__(self, content, role="user"):
self.role = role
self.content = content
def to_dict(self):
return {"role": self.role, "content": self.content}
def __repr__(self):
return f"UserCodePrompt(role={self.role!r}, content={self.content!r})"
class ParsedGPTCodeResponse:
def __init__(self, role, has_vul, vul_type, vul_line, cwe):
self.role = role
self.has_vul = has_vul
self.vul_type = vul_type
self.vul_line = vul_line
self.cwe = cwe
@classmethod
def from_gpt(cls, api_response):
parsed_message = api_response["choices"][0]["message"]
message_content = parsed_message["content"].split(',')
return cls(
parsed_message["role"],
message_content[0],
message_content[1],
message_content[2],
message_content[3]
)
@classmethod
def from_str(cls, api_response_str):
parsed_api_response = api_response_str.split(',')
return cls(
'user',
safe_get(parsed_api_response, 0),
safe_get(parsed_api_response, 1),
safe_get(parsed_api_response, 2),
safe_get(parsed_api_response, 3)
)
def to_dict(self):
return {
"role": self.role,
"has_vul": self.has_vul,
"vul_type": self.vul_type,
"vul_line": self.vul_line,
"cwe": self.cwe
}