Started coding reader
[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     unneded_stmts = (stmt, idx) ->
11       stmt.indexOf("PRAGMA")==0 or
12       stmt.indexOf("BEGIN TRANSACTION")==0 or
13       stmt.indexOf("COMMIT")==0 or
14       /^\s*$/.exec stmt
15
16     if not db?
17       db = @db
18     console.log "initializing DB"
19     db.changeVersion "", Readings.config.get 'db_version'
20     $.ajax Readings.config.get('initdburl'),
21       type: "GET"
22       dataType: 'text'
23       success: (sql) =>
24         sql = sql.split /;\n/
25         sql = $.grep sql, unneded_stmts, true
26
27         create = (tx) =>
28           for stmt in sql
29             tx.executeSql stmt, [],
30               (tx,rs) => true,
31               (tx,err) =>
32                 console.error("error for #{stmt}")
33                 console.error(err)
34
35         db.transaction create
36       error: =>
37         console.error "can't get initial sql"
38
39   wrap_error: (error_cb) ->
40     (tx, error) ->
41       window.last_error = error
42       alert "SQL ERROR: #{error.message}"
43       if error_cb
44         error_cb(error)
45       else
46         throw error
47
48   map_rs: (rs, mapper) ->
49     objs = []
50     for i in [0...rs.rows.length]
51       objs.push(mapper(rs.rows.item(i)))
52     return objs
53
54 ## TODO update method
55   withCategory: (category, callback, error) ->
56     rs_to_tags = (tx, data) ->
57       tags = []
58       for i in [0...data.rows.length]
59         tags.push new Readings.Tag(data.rows.item(i))
60       callback(tags)
61
62     @db.readTransaction (tx)=>
63       tx.executeSql "SELECT * FROM tag WHERE category=? ORDER BY sort_key",
64         [category], rs_to_tags, @wrap_error(error)
65
66   withTag: (tag_id, cb) ->
67     @db.readTransaction (tx) =>
68       tx.executeSql "SELECT * FROM tag WHERE id=?", [tag_id],
69         (tx, rs) =>
70           if rs.rows.length > 0
71             tag = new Readings.Tag rs.rows.item(0)
72             return cb(tag)
73           else
74             alert "No tag id #{tag_id}"
75         ,
76         @wrap_error()
77
78   withBooks: (tag, cb) ->
79     @db.readTransaction (tx) =>
80       console.log "books in tag: #{tag.books}"
81       tx.executeSql "SELECT * FROM book WHERE id IN (#{tag.books}) ORDER BY sort_key",
82         [], ((tx, rs) => cb(@map_rs(rs, (rec)->new Readings.Book(rec)))), @wrap_error()
83
84   fetchBook: (book_id, fetch_contents, cb) ->
85     unless typeof book_id == "number" or /^[0-9]+$/.exec book_id
86       throw Error "book_id = '#{book_id}' is not a number"
87
88     @db.readTransaction (tx) =>
89       tx.executeSql "SELECT * FROM book WHERE id=?", [book_id],
90         (tx, rs) =>
91           if rs.rows.length > 0
92             book = new Readings.Book rs.rows.item(0)
93             if fetch_contents and not book.is_local()
94               book.fetch (book) ->
95                 cb(book)
96             else
97               return cb(book)