ported to Web SQL
[ReadingsJQM.git] / js / app / Catalogue.coffee
1
2 class Readings.Catalogue
3   open: () ->
4     version = Readings.config.get 'db_version'
5     console.log "opening db ver #{version}"
6     @db = openDatabase 'catalogue', version, 'Catalogue', 65535, @init
7     this
8
9   init: (db) ->
10     if not db?
11       db = @db
12     console.log "initializing DB"
13     db.changeVersion "", Readings.config.get 'db_version'
14     $.ajax "initdb.sql"
15       type: "GET"
16       dataType: 'text'
17       success: (sql) =>
18         sql = sql.split /;\n/
19         sql = sql.slice(1,-2)
20
21         create = (tx) =>
22           for stmt in sql
23             console.log stmt
24             tx.executeSql stmt, [],
25               (tx,rs) => true,
26               (tx,err) => console.error(err)
27
28         db.transaction create
29       error: =>
30         console.error "can't get initial sql"
31
32   wrap_error: (error_cb) ->
33     (tx, error) ->
34       window.last_error = error
35       alert "SQL ERROR: #{error.message}"
36       if error_cb
37         error_cb(error)
38       else
39         throw error
40
41   map_rs: (rs, mapper) ->
42     objs = []
43     for i in [0...rs.rows.length]
44       objs.push(mapper(rs.rows.item(i)))
45     return objs
46
47 ## TODO update method
48   withCategory: (category, callback, error) ->
49     rs_to_tags = (tx, data) ->
50       tags = []
51       for i in [0...data.rows.length]
52         tags.push new Readings.Tag(data.rows.item(i))
53       callback(tags)
54
55     @db.readTransaction (tx)=>
56       tx.executeSql "SELECT * FROM tag WHERE category=? ORDER BY sort_key",
57         [category], rs_to_tags, @wrap_error(error)
58
59   withTag: (tag_id, cb) ->
60     @db.readTransaction (tx) =>
61       tx.executeSql "SELECT * FROM tag WHERE id=?", [tag_id],
62         (tx, rs) =>
63           if rs.rows.length > 0
64             tag = new Readings.Tag rs.rows.item(0)
65             return cb(tag)
66           else
67             alert "No tag id #{tag_id}"
68         ,
69         @wrap_error()
70
71   withBooks: (tag, cb) ->
72     @db.readTransaction (tx)=>
73       console.log "books in tag: #{tag.books}"
74       tx.executeSql "SELECT * FROM book WHERE id IN (#{tag.books}) ORDER BY sort_key",
75         [], ((tx, rs) => cb(@map_rs(rs, (rec)->new Readings.Book(rec)))), @wrap_error()