[base] Switch to mozbuild (#114)
[abstract.git] / storage / aaSaveFlow.cpp
blob9ebf4478df86ab52db83b3f2c30c3246b6d08168
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: */
3 /*
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>
24 #include "nsCOMPtr.h"
25 #include "nsStringAPI.h"
26 #include "nsEmbedString.h"
28 /* Unfrozen API */
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"
38 #include "aaGuard.h"
40 aaSaveFlow::aaSaveFlow(nsISupports *aOuter)
42 nsresult rv;
43 mConnection = do_QueryInterface(aOuter);
44 PRBool isReady;
45 rv = mConnection->GetConnectionReady(&isReady);
46 if (NS_FAILED(rv))
47 mConnection = nsnull;
48 mNewGiveResourceId = 0;
49 mNewTakeResourceId = 0;
50 mNewRate = 0.0;
53 aaSaveFlow::~aaSaveFlow()
57 NS_IMPL_ISUPPORTS1(aaSaveFlow,
58 aaISaveQuery)
59 /* aaISaveQuery */
60 NS_IMETHODIMP
61 aaSaveFlow::Save(aaIDataNode *aNode, aaIDataNode *aOldNode)
63 nsresult rv;
65 nsCOMPtr<aaIFlow> flow(do_QueryInterface(aNode, &rv));
66 NS_ENSURE_SUCCESS(rv, rv);
68 nsEmbedString wTag;
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);
81 if (aOldNode) {
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);
95 if (resource) {
96 rv = resource->GetId( &mNewGiveResourceId );
97 NS_ENSURE_SUCCESS(rv, rv);
100 rv = flow->GetTakeResource(getter_AddRefs( resource ));
101 NS_ENSURE_SUCCESS(rv, rv);
102 if (resource) {
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);
122 rv = insert(flow);
123 NS_ENSURE_SUCCESS(rv, rv);
125 return guard.Dismiss();
129 /* Private methods */
130 nsresult
131 aaSaveFlow::insert(aaIFlow *flow)
133 nsresult rv;
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);
154 PRInt64 id;
155 rv = mConnection->GetLastInsertRowID(&id);
156 NS_ENSURE_SUCCESS(rv, rv);
158 flow->SetId(id);
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);
189 return NS_OK;
192 nsresult
193 aaSaveFlow::replace(const nsACString &newTag, PRInt64 newEntityId,
194 const nsACString &oldTag)
196 nsresult rv;
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();