transport: pass correct channel
[abstract.git] / storage / base / aaSqlResult.cpp
blob6b76daff9dafa45854ecd49663ad85b3e287064a
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) 2008 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 "xpcom-config.h"
24 #include "nsCOMPtr.h"
25 #include "nsComponentManagerUtils.h"
26 #include "nsStringAPI.h"
27 #include "nsIVariant.h"
29 /* Unfrozen API */
30 #include "mozIStorageStatement.h"
32 /* Project includes */
33 #include "aaISqlRequest.h"
35 #include "aaSqlResult.h"
37 aaSqlResult::aaSqlResult(aaISqlRequest *request)
39 nsresult rv = initialize(request);
40 if (NS_FAILED(rv)) return;
42 mRequest = request;
45 aaSqlResult::~aaSqlResult()
48 NS_IMPL_ISUPPORTS2(aaSqlResult,
49 aaIDataNode,
50 aaISqlResult)
52 /* aaISqlResult */
53 NS_IMETHODIMP
54 aaSqlResult::GetColumn(const char *aPrefix, PRUint32 *_retval NS_OUTPARAM)
56 NS_ENSURE_ARG_POINTER(_retval);
57 NS_ENSURE_TRUE(mRequest, NS_ERROR_NOT_INITIALIZED);
58 return mRequest->GetColumn(aPrefix, _retval);
61 NS_IMETHODIMP
62 aaSqlResult::GetInt32(PRUint32 aIndex, PRInt32 *_retval NS_OUTPARAM)
64 NS_ENSURE_ARG_POINTER(_retval);
65 NS_ENSURE_TRUE(mRequest, NS_ERROR_NOT_INITIALIZED);
66 NS_ENSURE_TRUE(aIndex < (PRUint32) mData.Count(), NS_ERROR_INVALID_ARG);
68 if (!mData[aIndex])
69 return NS_OK;
71 return mData[aIndex]->GetAsInt32(_retval);
74 NS_IMETHODIMP
75 aaSqlResult::GetInt64(PRUint32 aIndex, PRInt64 *_retval NS_OUTPARAM)
77 NS_ENSURE_ARG_POINTER(_retval);
78 NS_ENSURE_TRUE(mRequest, NS_ERROR_NOT_INITIALIZED);
79 NS_ENSURE_TRUE(aIndex < (PRUint32) mData.Count(), NS_ERROR_INVALID_ARG);
81 if (!mData[aIndex])
82 return NS_OK;
84 return mData[aIndex]->GetAsInt64(_retval);
87 NS_IMETHODIMP
88 aaSqlResult::GetDouble(PRUint32 aIndex, double *_retval NS_OUTPARAM)
90 NS_ENSURE_ARG_POINTER(_retval);
91 NS_ENSURE_TRUE(mRequest, NS_ERROR_NOT_INITIALIZED);
92 NS_ENSURE_TRUE(aIndex < (PRUint32) mData.Count(), NS_ERROR_INVALID_ARG);
94 if (!mData[aIndex])
95 return NS_OK;
97 return mData[aIndex]->GetAsDouble(_retval);
100 NS_IMETHODIMP
101 aaSqlResult::GetUTF8String(PRUint32 aIndex, nsACString & _retval NS_OUTPARAM)
103 NS_ENSURE_TRUE(mRequest, NS_ERROR_NOT_INITIALIZED);
104 NS_ENSURE_TRUE(aIndex < (PRUint32) mData.Count(), NS_ERROR_INVALID_ARG);
106 if (!mData[aIndex]) {
107 _retval.Truncate();
108 _retval.SetIsVoid(PR_TRUE);
109 return NS_OK;
111 return mData[aIndex]->GetAsACString(_retval);
114 NS_IMETHODIMP
115 aaSqlResult::GetIsNull(PRUint32 aIndex, PRBool *_retval NS_OUTPARAM)
117 NS_ENSURE_ARG_POINTER(_retval);
118 NS_ENSURE_TRUE(mRequest, NS_ERROR_NOT_INITIALIZED);
119 NS_ENSURE_TRUE(aIndex < (PRUint32) mData.Count(), NS_ERROR_INVALID_ARG);
121 *_retval = mData[aIndex] == nsnull;
122 return NS_OK;
125 /* private methods */
126 nsresult
127 aaSqlResult::initialize(aaISqlRequest *request)
129 NS_ENSURE_ARG_POINTER(request);
130 nsresult rv;
132 nsCOMPtr<mozIStorageStatement> statement;
133 rv = request->GetStatement(getter_AddRefs(statement));
134 NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_ARG_POINTER(statement);
136 PRUint32 count = 0;
137 rv = statement->GetNumEntries(&count);
138 NS_ENSURE_SUCCESS(rv, rv);
140 PRUint32 i;
141 for (i = 0; i < count; i++) {
142 PRInt32 type;
143 nsCOMPtr<nsIWritableVariant>
144 item = do_CreateInstance(NS_VARIANT_CONTRACTID, &rv);
145 NS_ENSURE_SUCCESS(rv, rv);
147 rv = statement->GetTypeOfIndex(i, &type);
148 NS_ENSURE_SUCCESS(rv, rv);
150 switch (type) {
151 case mozIStorageStatement::VALUE_TYPE_INTEGER:
153 PRInt64 val64;
154 rv = statement->GetInt64(i, &val64);
155 NS_ENSURE_SUCCESS(rv, rv);
157 rv = item->SetAsInt64(val64);
158 NS_ENSURE_SUCCESS(rv, rv);
160 break;
161 case mozIStorageStatement::VALUE_TYPE_FLOAT:
163 double valDouble;
164 rv = statement->GetDouble(i, &valDouble);
165 NS_ENSURE_SUCCESS(rv, rv);
167 rv = item->SetAsDouble(valDouble);
168 NS_ENSURE_SUCCESS(rv, rv);
170 break;
171 case mozIStorageStatement::VALUE_TYPE_TEXT:
173 nsCAutoString valCString;
174 rv = statement->GetUTF8String(i, valCString);
175 NS_ENSURE_SUCCESS(rv, rv);
177 rv = item->SetAsACString(valCString);
178 NS_ENSURE_SUCCESS(rv, rv);
180 break;
181 case mozIStorageStatement::VALUE_TYPE_BLOB:
182 return NS_ERROR_UNEXPECTED;
183 case mozIStorageStatement::VALUE_TYPE_NULL:
184 item = nsnull;
185 break;
186 default:
187 return NS_ERROR_UNEXPECTED;
190 mData.AppendObject(item);
193 NS_ASSERTION((PRUint32) mData.Count() == count, "wrong column count");
194 mNode = do_QueryInterface(request, &rv);
195 NS_ENSURE_SUCCESS(rv, rv);
197 return NS_OK;