forked from goonj/goonj
-
Notifications
You must be signed in to change notification settings - Fork 1
/
GLibraryManager.m
177 lines (134 loc) · 3.93 KB
/
GLibraryManager.m
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/*
File: GLibraryManager.m
Description: The Goonj library manager (implementation).
This file is part of Goonj.
Goonj is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Goonj is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Goonj. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 Pratul Kalia.
Copyright 2009 Ankur Sethi.
*/
#import "GLibraryManager.h"
#import "GUtilities.h"
@implementation GLibraryManager
- (id) initWithDefaultDatabase
{
if (self = [super init]) {
databasePath = [[GUtilities tracksDatabasePath] stringByExpandingTildeInPath];
return self;
}
return nil;
}
- (BOOL) createInitialDatabase
{
int err;
err = sqlite3_open_v2([databasePath cStringUsingEncoding:NSUTF8StringEncoding],
&databaseConnection,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
NULL);
if (err != SQLITE_OK)
return NO;
[self createDatabaseSchema];
[self performInitialScan];
return YES;
}
- (BOOL) createDatabaseSchema
{
NSString *theStatement;
theStatement = @"CREATE TABLE artists (\
id INTEGER PRIMARY KEY,\
name TEXT);";
if (![self singleStepQuery:theStatement])
return NO;
theStatement = @"CREATE TABLE albums (\
id INTEGER PRIMARY KEY,\
name TEXT);";
if (![self singleStepQuery:theStatement])
return NO;
theStatement = @"CREATE TABLE genres (\
id INTEGER PRIMARY KEY,\
name TEXT);";
if (![self singleStepQuery:theStatement])
return NO;
// Should year be text?
theStatement = @"CREATE TABLE tracks (\
id INTEGER,\
path TEXT,\
title TEXT,\
year TEXT,\
rating INTEGER,\
artist_id INTEGER,\
album_id INTEGER,\
genre_id INTEGER,\
FOREIGN KEY (artist_id) REFERENCES artists(id),\
FOREIGN KEY (album_id) REFERENCES albums(id),\
FOREIGN KEY (genre_id) REFERENCES genres(id));";
if (![self singleStepQuery:theStatement])
return NO;
return YES;
}
- (BOOL) performInitialScan
{
NSArray *watchDirectories = [[NSUserDefaults standardUserDefaults]
arrayForKey:@"LibraryFolderLocations"];
for (NSString *directory in watchDirectories)
[self addTracksFromDirectory:[directory stringByExpandingTildeInPath]];
return YES;
}
- (void) addTracksFromDirectory:(NSString *)aDirectory
{
NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager]
enumeratorAtPath:aDirectory];
NSString *fileName, *filePath;
BOOL isDirectory;
while (fileName = [dirEnum nextObject]) {
filePath = [aDirectory stringByAppendingPathComponent:fileName];
if ([GUtilities isHidden:filePath])
continue;
[[NSFileManager defaultManager] fileExistsAtPath:filePath
isDirectory:&isDirectory];
if (isDirectory == YES)
[self addTracksFromDirectory:filePath];
else
[self addTrack:filePath];
}
}
- (void) addTrack:(NSString *)aURL
{
// NSLog(@"%@", [GTrack metadataForFile:aURL]);
}
- (BOOL) singleStepQuery:(NSString *)aQueryString
{
sqlite3_stmt *preparedStatement;
int err;
err = sqlite3_prepare_v2(databaseConnection,
[aQueryString cStringUsingEncoding:NSUTF8StringEncoding],
[aQueryString length],
&preparedStatement,
NULL);
if (err == SQLITE_OK)
err = sqlite3_step(preparedStatement);
else
return NO;
if (err == SQLITE_DONE)
sqlite3_finalize(preparedStatement);
else
return NO;
return YES;
}
- (void) startManager
{
if ([[NSFileManager defaultManager] fileExistsAtPath:databasePath]);
else
[self createInitialDatabase];
// TODO: remove this once the rest of the manager works.
sqlite3_close(databaseConnection);
}
@end