1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
4 * Copyright (C) 2007 Sergey Yanovich <ynvich@gmail.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include <abstract/aacore.h>
25 #include "nsStringAPI.h"
26 #include "nsEmbedString.h"
29 #include "unstable/mozIStorageConnection.h"
30 #include "unstable/mozIStorageStatement.h"
32 /* Project includes */
33 #include <abstract/base/aaIEntity.h>
34 #include <abstract/base/aaIResource.h>
35 #include <abstract/base/aaIFlow.h>
36 #include <abstract/storage/aaISaveQuery.h>
37 #include "aaSaveFlow.h"
40 aaSaveFlow::aaSaveFlow(nsISupports
*aOuter
)
43 mConnection
= do_QueryInterface(aOuter
);
45 rv
= mConnection
->GetConnectionReady(&isReady
);
48 mNewGiveResourceId
= 0;
49 mNewTakeResourceId
= 0;
53 aaSaveFlow::~aaSaveFlow()
57 NS_IMPL_ISUPPORTS1(aaSaveFlow
,
61 aaSaveFlow::Save(aaIDataNode
*aNode
, aaIDataNode
*aOldNode
)
65 nsCOMPtr
<aaIFlow
> flow(do_QueryInterface(aNode
, &rv
));
66 NS_ENSURE_SUCCESS(rv
, rv
);
69 rv
= flow
->GetTag(wTag
);
70 NS_ENSURE_SUCCESS(rv
, rv
);
71 mNewTag
= NS_ConvertUTF16toUTF8(wTag
);
73 nsCOMPtr
<aaIEntity
> entity
;
74 rv
= flow
->GetEntity(getter_AddRefs( entity
));
75 NS_ENSURE_SUCCESS(rv
, rv
);
76 NS_ENSURE_TRUE(entity
, NS_ERROR_INVALID_ARG
);
78 rv
= entity
->GetId(&mNewEntityId
);
79 NS_ENSURE_SUCCESS(rv
, rv
);
82 nsCOMPtr
<aaIFlow
> old(do_QueryInterface(aOldNode
, &rv
));
83 NS_ENSURE_SUCCESS(rv
, rv
);
84 rv
= old
->GetTag(wTag
);
85 NS_ENSURE_SUCCESS(rv
, rv
);
86 nsEmbedCString oldTag
= NS_ConvertUTF16toUTF8(wTag
);
88 return replace(mNewTag
, mNewEntityId
, oldTag
);
91 nsCOMPtr
<aaIResource
> resource
;
93 rv
= flow
->GetGiveResource(getter_AddRefs( resource
));
94 NS_ENSURE_SUCCESS(rv
, rv
);
96 rv
= resource
->GetId( &mNewGiveResourceId
);
97 NS_ENSURE_SUCCESS(rv
, rv
);
100 rv
= flow
->GetTakeResource(getter_AddRefs( resource
));
101 NS_ENSURE_SUCCESS(rv
, rv
);
103 rv
= resource
->GetId( &mNewTakeResourceId
);
104 NS_ENSURE_SUCCESS(rv
, rv
);
107 NS_ENSURE_TRUE(mNewGiveResourceId
|| mNewTakeResourceId
, NS_ERROR_INVALID_ARG
);
109 rv
= flow
->GetRate( &mNewRate
);
110 NS_ENSURE_SUCCESS(rv
, rv
);
111 NS_ENSURE_TRUE(mNewRate
!= 0.0, NS_ERROR_INVALID_ARG
);
113 rv
= flow
->GetLimit( &mNewLimit
);
114 NS_ENSURE_SUCCESS(rv
, rv
);
116 rv
= mConnection
->BeginTransaction();
117 NS_ENSURE_SUCCESS(rv
, rv
);
120 aaGuard
guard(mConnection
);
123 NS_ENSURE_SUCCESS(rv
, rv
);
125 return guard
.Dismiss();
129 /* Private methods */
131 aaSaveFlow::insert(aaIFlow
*flow
)
134 NS_ENSURE_TRUE(mConnection
, NS_ERROR_NOT_INITIALIZED
);
136 nsCOMPtr
<mozIStorageStatement
> statement
;
137 rv
= mConnection
->CreateStatement(NS_LITERAL_CSTRING(
138 "INSERT INTO flow (tag, entity_id, rate, cap) VALUES (?,?,?,?)"),
139 getter_AddRefs(statement
));
140 NS_ENSURE_SUCCESS(rv
, rv
);
142 rv
= statement
->BindUTF8StringParameter(0, mNewTag
);
143 NS_ENSURE_SUCCESS(rv
, rv
);
144 rv
= statement
->BindInt64Parameter(1, mNewEntityId
);
145 NS_ENSURE_SUCCESS(rv
, rv
);
146 rv
= statement
->BindDoubleParameter(2, mNewRate
);
147 NS_ENSURE_SUCCESS(rv
, rv
);
148 rv
= statement
->BindDoubleParameter(3, mNewLimit
);
149 NS_ENSURE_SUCCESS(rv
, rv
);
151 rv
= statement
->Execute();
152 NS_ENSURE_SUCCESS(rv
, rv
);
155 rv
= mConnection
->GetLastInsertRowID(&id
);
156 NS_ENSURE_SUCCESS(rv
, rv
);
160 rv
= mConnection
->CreateStatement(NS_LITERAL_CSTRING(
161 "INSERT INTO term (flow_id, side, resource_id) VALUES (?,?,?)"),
162 getter_AddRefs(statement
));
163 NS_ENSURE_SUCCESS(rv
, rv
);
165 if ( mNewGiveResourceId
) {
166 rv
= statement
->BindInt64Parameter(0, id
);
167 NS_ENSURE_SUCCESS(rv
, rv
);
168 rv
= statement
->BindInt32Parameter(1, 0);
169 NS_ENSURE_SUCCESS(rv
, rv
);
170 rv
= statement
->BindInt64Parameter(2, mNewGiveResourceId
);
171 NS_ENSURE_SUCCESS(rv
, rv
);
173 rv
= statement
->Execute();
174 NS_ENSURE_SUCCESS(rv
, rv
);
177 if ( mNewTakeResourceId
) {
178 rv
= statement
->BindInt64Parameter(0, id
);
179 NS_ENSURE_SUCCESS(rv
, rv
);
180 rv
= statement
->BindInt32Parameter(1, 1);
181 NS_ENSURE_SUCCESS(rv
, rv
);
182 rv
= statement
->BindInt64Parameter(2, mNewTakeResourceId
);
183 NS_ENSURE_SUCCESS(rv
, rv
);
185 rv
= statement
->Execute();
186 NS_ENSURE_SUCCESS(rv
, rv
);
193 aaSaveFlow::replace(const nsACString
&newTag
, PRInt64 newEntityId
,
194 const nsACString
&oldTag
)
197 NS_ENSURE_TRUE(mConnection
, NS_ERROR_NOT_INITIALIZED
);
199 nsCOMPtr
<mozIStorageStatement
> statement
;
200 rv
= mConnection
->CreateStatement(NS_LITERAL_CSTRING(
201 "UPDATE flow SET tag=? entity_id=? WHERE tag=?"),
202 getter_AddRefs(statement
));
203 NS_ENSURE_SUCCESS(rv
, rv
);
205 rv
= statement
->BindUTF8StringParameter(0, newTag
);
206 rv
= statement
->BindInt64Parameter(1, newEntityId
);
207 rv
= statement
->BindUTF8StringParameter(2, oldTag
);
208 NS_ENSURE_SUCCESS(rv
, rv
);
209 return statement
->Execute();