-
Notifications
You must be signed in to change notification settings - Fork 1
/
process_line.h
131 lines (102 loc) · 2.79 KB
/
process_line.h
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#ifndef PROCESS_LINEH
#define PROCESS_LINEH
#include <stdio.h>
#include <sqlite3.h>
#include "getwords.h"
#include "build_insert_statement.h"
// Dangerous and stupid, but we're already doing this stringy stuff, so let's do it anyway!
void remove_newlines(char* line) {
char* p = line;
while(*p) {
if(*p == '\n') {
*p = 0;
break;
}
p++;
}
}
void process_line(char* line, int* columns, sqlite3* db, globalArgs options) {
int return_code;
char* zErrMsg;
int numwords;
char command[400];
remove_newlines(line);
#ifdef DEBUG
printf("Inside process_line - Line: %s\n", line);
#endif
char** words;
if(options.delimiter) {
words = getwordsregex(options.delimiter, line, &numwords);
} else {
words = getwords(line, &numwords);
}
#ifdef DEBUG
if( numwords == 0 || ! words ) { fprintf(stderr, "No words on this line.\n"); }
#endif
#ifdef DEBUG
int j;
for(j = 0; j < numwords; j++) {
printf("Inside process_line - Word: [%s]\n", words[j]);
}
#endif
// Adjust table size if needed
if(numwords > *columns) {
while(*columns < numwords) {
(*columns)++;
sprintf(command, "alter table data add column c%d", *columns);
#ifdef DEBUG
printf("Inside process_line - Adding new column with command [%s]\n", command);
#endif
// TODO: Ensure that this is okay
return_code = sqlite3_exec(db, command, NULL, NULL, &zErrMsg);
HANDLE_ERROR(return_code);
}
}
if(numwords < 1) {
return_code = sqlite3_exec(db, "insert into data(c1) values(NULL)", NULL, NULL, &zErrMsg);
HANDLE_ERROR(return_code);
return;
}
char* insert_statement = insert(numwords);
#ifdef DEBUG
printf("Inside process_line - Created insert statement [%s].\n", insert_statement);
#endif
sqlite3_stmt *stmt;
if ( sqlite3_prepare_v2( db, insert_statement, -1, &stmt, 0 ) != SQLITE_OK ) {
fprintf(stderr, "Could not prepare statement [%s]\n.", insert_statement);
exit(1);
}
#ifdef DEBUG
printf("Prepared insert statement.\n");
#endif
int i;
for(i = 0; i < numwords; i++) {
// SQLITE_TRANSIENT allows words to be freed
if ( sqlite3_bind_text( stmt, i+1, words[i], -1 /* length of text */, SQLITE_TRANSIENT ) != SQLITE_OK ) {
fprintf(stderr,"\nCould not bind text [%s].\n", words[i]);
exit(1);
}
#ifdef DEBUG
printf("Bound word [%s].\n", words[i]);
#endif
// TODO: Need to find a way to free the regex_split struct
//
// The fact that this isn't being freed may cause a memory-leak proportional to the
// number of words bound in the query... Which shouldn't be much.
//
if(! options.delimiter) {
free(words[i]);
}
}
free(words); // words is no longer used
#ifdef DEBUG
printf("Freed words.\n");
#endif
if (sqlite3_step(stmt) != SQLITE_DONE) {
fprintf(stderr,"\nCould not step (execute) stmt.\n");
exit(1);
}
sqlite3_finalize(stmt);
free(insert_statement);
}
#endif