see Changelog
[mining-tools:carnarvon.git] / pycarnarvon / File.py
1 # Copyright (C) 2006 Alvaro Navarro Clemente
2 #
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU Library General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 #
17 # Authors : Alvaro Navarro <anavarro@gsyc.escet.urjc.es>
18
19 """
20 Abstract class that implements the basic operations with a File.
21 It contains three static methods to access to the __files structure
22
23 @see:          FileCVS.py, FileSVN.py
24
25 @author:       Alvaro Navarro
26 @organization: Grupo de Sistemas y Comunicaciones, Universidad Rey Juan Carlos
27 @copyright:    Universidad Rey Juan Carlos (Madrid, Spain)
28 @license:      GNU GPL version 2 or any later version
29 @contact:      anavarro@gsyc.escet.urjc.es
30 """
31
32 from threading import Thread
33 from Database import *
34 import time
35 import os
36 import string
37 import sys
38
39 class File:
40
41     __files = {}
42
43     def __init__ (self,name,timestamp, db_object):
44         self.name = name
45         self.timestamp = timestamp
46         self.db = db_object
47
48     def file2sql(file,db):
49         if file not in File.__files:
50             File.__files[file] = len(File.__files)
51             query = "INSERT INTO files (file_id, file) VALUES ('"
52             query += str(File.__files[file]) + "','" + str(file)  +"');\n"
53             db.insertData(query)
54
55     def getid(file):
56         return (File.__files[file])
57
58     def numfiles():
59         return len(File.__files)
60
61     def printfiles():
62         for f in File.__files:
63             print str(f)
64
65     def line2sql(self, data):
66
67         fields = data.split("#")
68
69         query  = "INSERT INTO annotates_" + str(self.timestamp).replace("-","_")
70         query += " (line_id, file_id, revision, commiter_id, date, timestamp_id, iscomment, dir_id) "
71         query += " VALUES ('" + fields[0] + "','"
72         query += fields[1] + "','"
73         query += fields[2] + "','"
74         query += fields[3] + "','"
75         query += fields[4] + "','"
76         query += fields[5] + "','"
77         query += fields[6] + "','"
78         query += fields[7] + "');\n"
79
80         self.db.insertData(query)
81
82     def normalize_whitespace(self, text):
83         "Remove redundant whitespace from a string"
84
85         return string.join(string.split(text), ' ')
86
87     def lineNotAComment(self,line,flag):
88         "returns if line is a comment (1) or not (0)"
89
90         line = self.normalize_whitespace(line)
91
92         if flag:
93             if line[-2:] != '*/':
94                 return (1, 1)
95             else:
96                 return (1, 0)
97
98         if line[:2] == '/*':
99             if line[-2:] == '*/':
100                 return (1, 0)
101             else:
102                 return (1, 1)
103         elif line[:2] == '# ':
104             if line[2:7] == 'undef':
105                 return (0, 0)
106             elif line[2:8] == 'define':
107                 return (0, 0)
108             else:
109                 return (1, 0)
110         elif line == '#':
111             return (1, 0)
112         elif line[:2] == '//':
113             return (1, 0)
114         elif line[:2] == '--': # ADA Comments
115             return (1, 0)
116         elif line[:2] == ';;':
117             return (1, 0)
118         else:
119             return (0, 0)
120
121     def transformIntoDateTime(self,date):
122         """
123         Transformation into MySQL datetime: YYYY-MM-DD HH:MM:SS
124         gets DD-mmm-YY
125         """
126
127         monthList = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
128
129         year = int(date[-2:])
130         month = int(monthList.index(date[3:-3])) + 1
131         day = date[:2]
132
133         if year < 80:
134             year = 2000 + year
135         else:
136             year = 1900 + year
137
138         if month < 10:
139             month = '0' + str(month)
140         else:
141             month = str(month)
142
143         date = str(year) + '-' + month + '-' + day + ' 00:00:00'
144
145         return date
146
147     def analyse(self):
148         pass
149
150     # Static methods
151     numfiles = staticmethod(numfiles)
152     file2sql = staticmethod(file2sql)
153     getid = staticmethod(getid)