1 from straw
.model
import Category
, Feed
2 import SQLiteStorage
as Storage
5 def __init__(self
, storage
):
8 def _get_indexed(self
, entities
, index_field
):
9 return dict([(getattr(entity
, index_field
), entity
) for entity
in entities
])
11 def _get_grouped(self
, entities
, field
):
15 for entity
in entities
:
16 current
= getattr(entity
, field
)
18 if previous
!= current
:
19 # we have new group, let's make a dict entry for it
24 groups
[current
].append(entity
)
28 def _is_inherited(self
, clazz
):
29 return len(clazz
.__bases
__) == 1 and hasattr(clazz
, "inheritance") and clazz
.inheritance
31 def _get_persistent_fields(self
, clazz
):
32 fields
= list(clazz
.persistent_properties
)
34 if self
._is
_inherited
(clazz
):
35 fields
.extend(clazz
.__bases
__[0].persistent_properties
)
40 self
.storage
._tx
_begin
()
43 self
.storage
._tx
_commit
()
45 def save(self
, entity
):
46 do_insert
= entity
.id == None
48 if self
._is
_inherited
(entity
.__class
__):
49 base_class
= entity
.__class
__.__bases
__[0]
50 base_data
= dict([(property, getattr(entity
, property)) for property in base_class
.persistent_properties
if property != base_class
.primary_key
])
53 id = self
.storage
.insert(base_class
.persistent_table
, base_data
)
56 self
.storage
.update(base_class
.persistent_table
, entity
.id, base_data
)
58 data
= dict([(property, getattr(entity
, property)) for property in entity
.__class
__.persistent_properties
if property != entity
.__class
__.primary_key
])
61 id = self
.storage
.insert(entity
.__class
__.persistent_table
, data
)
66 self
.storage
.update(entity
.__class
__.persistent_table
, entity
.id, data
)
68 #print "save = %s" % str(time.time() - s)
71 def get_one(self
, clazz
, id):
72 #result = self.storage.query("SELECT * FROM %s WHERE id = ?" % clazz.persistent_table, params = (id,))
73 result
= self
.get(clazz
, " WHERE id = %s" % id)
76 def get(self
, clazz
, sql
= "", params
= []):
77 result
= self
.storage
.query("SELECT * FROM %s%s" % (clazz
.persistent_table
, sql
), params
)
84 for field
in clazz
.persistent_properties
:
85 setattr(entity
, field
, row
[i
])
88 entities
.append(entity
)
92 def get_with_params(self
, clazz
, params
):
93 #self.storage.query(query, params = None)
95 for key
in params
.keys():
97 self
.storage
.query("SELECT * FROM %s WHERE %s" % (clazz
.persistent_table
, where_clause
))
99 def get_indexed(self
, clazz
, index_field
, sql
= ""):
100 result
= self
.storage
.query("SELECT * FROM %s%s" % (clazz
.persistent_table
, sql
))
107 for field
in clazz
.persistent_properties
:
108 setattr(entity
, field
, row
[i
])
111 entities
[getattr(entity
, index_field
)] = entity
115 def get_nodes(self
, sql
= ""):
116 #result = self.storage.query("SELECT f.*, feed_id, unread_count FROM feeds f LEFT JOIN (SELECT COUNT(*) AS unread_count, feed_id FROM items i WHERE i.is_read = 0 GROUP BY i.feed_id) ON feed_id = f.id ORDER BY category_id")
117 result
= self
.storage
.query("SELECT *, unread_count FROM nodes n LEFT JOIN feeds f ON (f.id = n.id) LEFT JOIN categories c ON (c.id = n.id) LEFT JOIN (SELECT COUNT(*) AS unread_count, feed_id FROM items i WHERE i.is_read = 0 GROUP BY i.feed_id) ON feed_id = f.id ORDER BY n.parent_id, n.norder")
121 if row
["type"] == "C":
123 elif row
["type"] == "F":
126 fields
= self
._get
_persistent
_fields
(clazz
)
128 entity
.unread_count
= 0
132 #if row[field] == None:
135 setattr(entity
, field
, value
)
137 if row
["unread_count"] != None:
138 setattr(entity
, "unread_count", row
["unread_count"])
140 entities
.append(entity
)
142 return self
._get
_indexed
(entities
, "id"), self
._get
_grouped
(entities
, "parent_id")