зеркало из https://github.com/mozilla/gecko-dev.git
b=263211, sqlite3 and storage landing - step 2; r=darin,sr=shaver
This commit is contained in:
Родитель
0c400c441c
Коммит
497c1e02b3
|
@ -0,0 +1,48 @@
|
|||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Oracle Corporation
|
||||
# Portions created by the Initial Developer are Copyright (C) 2004
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = storage
|
||||
DIRS = public src build test
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Oracle Corporation
|
||||
# Portions created by the Initial Developer are Copyright (C) 2004
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH=../..
|
||||
topsrcdir=@top_srcdir@
|
||||
srcdir=@srcdir@
|
||||
VPATH=@srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = storagecomps
|
||||
LIBRARY_NAME = storagecomps
|
||||
SHORT_LIBNAME = strgcmps
|
||||
EXPORT_LIBRARY = 1
|
||||
IS_COMPONENT = 1
|
||||
MODULE_NAME = mozStorageModule
|
||||
|
||||
REQUIRES = \
|
||||
storage \
|
||||
sqlite3 \
|
||||
xpcom \
|
||||
string \
|
||||
$(NULL)
|
||||
|
||||
EXPORTS = mozStorageCID.h
|
||||
|
||||
CPPSRCS = mozStorageModule.cpp
|
||||
|
||||
LOCAL_INCLUDES = \
|
||||
-I$(srcdir)/../src
|
||||
|
||||
SHARED_LIBRARY_LIBS = \
|
||||
$(DIST)/lib/$(LIB_PREFIX)storage_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/$(LIB_PREFIX)sqlite3_s.$(LIB_SUFFIX) \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_DSO_LDOPTS += \
|
||||
$(LIBS_DIR) \
|
||||
$(EXTRA_DSO_LIBS) \
|
||||
$(MOZ_COMPONENT_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef _MOZSTORAGECID_H_
|
||||
#define _MOZSTORAGECID_H_
|
||||
|
||||
#define MOZ_STORAGE_CONTRACTID_PREFIX "@mozilla.org/storage"
|
||||
|
||||
|
||||
/* b71a1f84-3a70-4d37-a348-f1ba0e27eead */
|
||||
#define MOZ_STORAGE_CONNECTION_CID \
|
||||
{ 0xb71a1f84, 0x3a70, 0x4d37, {0xa3, 0x48, 0xf1, 0xba, 0x0e, 0x27, 0xee, 0xad} }
|
||||
|
||||
#define MOZ_STORAGE_CONNECTION_CONTRACTID MOZ_STORAGE_CONTRACTID_PREFIX "/connection;1"
|
||||
|
||||
/* bbbb1d61-438f-4436-92ed-8308e5830fb0 */
|
||||
#define MOZ_STORAGE_SERVICE_CID \
|
||||
{ 0xbbbb1d61, 0x438f, 0x4436, {0x92, 0xed, 0x83, 0x08, 0xe5, 0x83, 0x0f, 0xb0} }
|
||||
|
||||
#define MOZ_STORAGE_SERVICE_CONTRACTID MOZ_STORAGE_CONTRACTID_PREFIX "/service;1"
|
||||
|
||||
#endif /* _MOZSTORAGECID_H_ */
|
|
@ -0,0 +1,66 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIGenericFactory.h"
|
||||
#include "nsIModule.h"
|
||||
|
||||
#include "mozStorageService.h"
|
||||
#include "mozStorageConnection.h"
|
||||
|
||||
#include "mozStorageCID.h"
|
||||
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(mozStorageService)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(mozStorageConnection)
|
||||
|
||||
static const nsModuleComponentInfo components[] =
|
||||
{
|
||||
{ "Unified Data Store Service",
|
||||
MOZ_STORAGE_SERVICE_CID,
|
||||
MOZ_STORAGE_SERVICE_CONTRACTID,
|
||||
mozStorageServiceConstructor
|
||||
},
|
||||
|
||||
{ "Unified Data Store Connection",
|
||||
MOZ_STORAGE_CONNECTION_CID,
|
||||
MOZ_STORAGE_CONNECTION_CONTRACTID,
|
||||
mozStorageConnectionConstructor
|
||||
}
|
||||
};
|
||||
|
||||
NS_IMPL_NSGETMODULE(mozStorageModule, components);
|
|
@ -0,0 +1,59 @@
|
|||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is Oracle Corporation code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Oracle Corporation
|
||||
# Portions created by the Initial Developer are Copyright (C) 2004
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = storage
|
||||
XPIDL_MODULE = storage
|
||||
GRE_MODULE = 1
|
||||
|
||||
XPIDLSRCS = \
|
||||
mozIStorageService.idl \
|
||||
mozIStorageConnection.idl \
|
||||
mozIStorageFunction.idl \
|
||||
mozIStorageStatement.idl \
|
||||
mozIStorageDataSet.idl \
|
||||
mozIStorageValueArray.idl \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
|
@ -0,0 +1,190 @@
|
|||
/* -*- Mode: idl; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
%{C++
|
||||
#include <sqlite3.h>
|
||||
%}
|
||||
|
||||
interface mozIStorageFunction;
|
||||
interface mozIStorageStatement;
|
||||
interface nsIFile;
|
||||
|
||||
[ptr] native sqlite3ptr(sqlite3);
|
||||
|
||||
[scriptable, uuid(623b8b2e-c9f9-4cc3-b15a-f3c96df2cc1c)]
|
||||
interface mozIStorageConnection : nsISupports {
|
||||
/*
|
||||
* Initialization and status
|
||||
*/
|
||||
|
||||
/**
|
||||
* whether the database is open or not
|
||||
*/
|
||||
readonly attribute boolean connectionReady;
|
||||
|
||||
/**
|
||||
* the current database filename
|
||||
*/
|
||||
readonly attribute AUTF8String databaseName;
|
||||
|
||||
/**
|
||||
* lastInsertRowID returns the row ID from the last INSERT
|
||||
* operation.
|
||||
*/
|
||||
readonly attribute long long lastInsertRowID;
|
||||
|
||||
/**
|
||||
* lastError returns the last error code
|
||||
*/
|
||||
readonly attribute long lastError;
|
||||
|
||||
/**
|
||||
* lastErrorString returns the last error as a string
|
||||
*/
|
||||
readonly attribute AUTF8String lastErrorString;
|
||||
|
||||
/*
|
||||
* Statement creation
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a mozIStorageStatement for the given SQL expression.
|
||||
* The expression may use ?0 ?1 etc. to indicate numbered arguments.
|
||||
*
|
||||
* @param aSQLStatement The SQL statement to execute
|
||||
*
|
||||
* @returns a new mozIStorageStatement
|
||||
*/
|
||||
mozIStorageStatement createStatement (in AUTF8String aSQLStatement);
|
||||
|
||||
/**
|
||||
* Execute a SQL expression, expecting no arguments.
|
||||
*
|
||||
* @param aSQLStatement The SQL statement to execute
|
||||
*/
|
||||
void executeSimpleSQL (in AUTF8String aSQLStatement);
|
||||
|
||||
/*
|
||||
* Transactions
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns true if a transaction is active on this connection.
|
||||
*/
|
||||
readonly attribute boolean transactionInProgress;
|
||||
|
||||
/**
|
||||
* Begin a new transaction. If a transaction is active,
|
||||
* @throws NS_ERROR_STORAGE_INVALID_OPERATION.
|
||||
*/
|
||||
void beginTransaction ();
|
||||
|
||||
/**
|
||||
* Commits the current transaction. If no transaction is active,
|
||||
* @throws NS_ERROR_STORAGE_NO_TRANSACTION.
|
||||
*/
|
||||
void commitTransaction ();
|
||||
|
||||
/**
|
||||
* Rolls back the current transaction. If no transaction is active,
|
||||
* @throws NS_ERROR_STORAGE_NO_TRANSACTION.
|
||||
*/
|
||||
void rollbackTransaction ();
|
||||
|
||||
/*
|
||||
* Tables
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create the table with the given name and schema. If the table
|
||||
* already exists with the given schema, the non-error
|
||||
* NS_STORAGE_TABLE_EXISTS is returned. If the table exists but with
|
||||
* a different schema, NS_ERROR_STORAGE_TABLE_CONFLICT (?) is thrown.
|
||||
*
|
||||
* @param aID the owner of this table -- XXXtodo
|
||||
*
|
||||
* @param aTableName the table name to be created, consisting of [A-Za-z0-9_], and beginning with a letter.
|
||||
*
|
||||
* @param aTableSchema the schema of the table; what would normally go between the parens in a CREATE TABLE
|
||||
* statement: "foo INTEGER, bar STRING".
|
||||
*/
|
||||
void createTable(in string aTableName,
|
||||
in string aTableSchema);
|
||||
|
||||
/*
|
||||
* Functions and Triggers
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a new SQLite function
|
||||
*/
|
||||
void createFunction (in string aFunctionName,
|
||||
in long aNumArguments,
|
||||
in mozIStorageFunction aFunction);
|
||||
|
||||
/**
|
||||
* Create a new trigger. Note that we only support AFTER triggers here,
|
||||
* not BEFORE (so that we can support IPC notification of triggers).
|
||||
* All triggers created this way are TEMPORARY triggers, i.e. they are only
|
||||
* valid for the duration of this connection. Without this, triggers would
|
||||
* persist between connections, even if the functions they refer to may no
|
||||
* longer be defined; this would be bad.
|
||||
*
|
||||
* aParameters is a comma-separated list of parameters, referencing
|
||||
* either "new.*" or "old.*", as appropriate for the trigger event
|
||||
* type.
|
||||
*/
|
||||
const long TRIGGER_EVENT_DELETE = 1;
|
||||
const long TRIGGER_EVENT_INSERT = 2;
|
||||
const long TRIGGER_EVENT_UPDATE = 3;
|
||||
|
||||
void createTrigger (in string aTriggerName,
|
||||
in long aTriggerType,
|
||||
in string aTableName,
|
||||
in string aTriggerFunction,
|
||||
in string aParameters);
|
||||
|
||||
void removeTrigger (in string aTriggerName);
|
||||
|
||||
/*
|
||||
* native support
|
||||
*/
|
||||
[noscript] readonly attribute sqlite3ptr sqliteHandle;
|
||||
};
|
|
@ -0,0 +1,57 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
interface nsIArray;
|
||||
interface nsISimpleEnumerator;
|
||||
|
||||
[scriptable, uuid(57826606-3c8a-4243-9f2f-cb3fe6e91148)]
|
||||
interface mozIStorageDataSet : nsISupports {
|
||||
/**
|
||||
* All the rows in this data set, as a nsIArray
|
||||
*/
|
||||
readonly attribute nsIArray dataRows;
|
||||
|
||||
/**
|
||||
* Get an enumerator for the result set rows.
|
||||
* @returns a nsISimpleEnumerator of mozIStorageValueArray.
|
||||
*/
|
||||
nsISimpleEnumerator getRowEnumerator();
|
||||
};
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
interface mozIStorageConnection;
|
||||
interface mozIStorageValueArray;
|
||||
interface nsIArray;
|
||||
|
||||
[scriptable, uuid(898d4189-7012-4ae9-a2af-435491cfa114)]
|
||||
interface mozIStorageFunction : nsISupports {
|
||||
/**
|
||||
* onFunctionCall is called when execution of a custom
|
||||
* function should occur. There are no return values.
|
||||
*
|
||||
* @param aNumArguments The number of arguments
|
||||
* @param aFunctionArguments The arguments passed in to the function
|
||||
*/
|
||||
|
||||
void onFunctionCall (in mozIStorageValueArray aFunctionArguments);
|
||||
};
|
|
@ -0,0 +1,69 @@
|
|||
/* -*- Mode: idl; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
interface mozIStorageConnection;
|
||||
interface nsIFile;
|
||||
|
||||
[scriptable, uuid(22cff01c-1a5a-4b11-9e27-f8f832226489)]
|
||||
interface mozIStorageService : nsISupports {
|
||||
/**
|
||||
* Get a connection to the local profile storage.
|
||||
*
|
||||
* @param aStorageKey a string key identifying the type of storage
|
||||
* requested. Valid values include: "profile", "cert".
|
||||
*
|
||||
* @returns a mozIStorageConnection corresponding to
|
||||
* the appropriate storage for the current thread.
|
||||
* (XXX - always returns same one for now, need to add threading)
|
||||
*/
|
||||
mozIStorageConnection getProfileStorage(in string aStorageKey);
|
||||
|
||||
/**
|
||||
* Open a connection to the specified file.
|
||||
*
|
||||
* @param aDatabaseFile a nsIFile of the database to open.
|
||||
*
|
||||
* @returns a mozIStorageConnection corresponding to
|
||||
* the appropriate storage for the current thread.
|
||||
* (XXX - always returns same one for now, need to add threading)
|
||||
*/
|
||||
mozIStorageConnection openDatabase(in nsIFile aDatabaseFile);
|
||||
|
||||
};
|
|
@ -0,0 +1,115 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
#include "mozIStorageValueArray.idl"
|
||||
|
||||
interface mozIStorageConnection;
|
||||
interface mozIStorageDataSet;
|
||||
interface nsISimpleEnumerator;
|
||||
|
||||
[scriptable, uuid(656aa634-36e2-4977-802e-79bce39c1024)]
|
||||
interface mozIStorageStatement : mozIStorageValueArray {
|
||||
/**
|
||||
* Initialize this query with the given SQL statement.
|
||||
*
|
||||
*/
|
||||
void initialize (in mozIStorageConnection aDBConnection, in AUTF8String aSQLStatement);
|
||||
|
||||
mozIStorageStatement clone ();
|
||||
|
||||
/*
|
||||
* Number of parameters
|
||||
*/
|
||||
readonly attribute unsigned long parameterCount;
|
||||
|
||||
/*
|
||||
* Reset parameters/statement execution
|
||||
*/
|
||||
void reset ();
|
||||
|
||||
/*
|
||||
* Parameter binding
|
||||
*/
|
||||
void bindCStringParameter (in unsigned long aParamIndex, in string aValue);
|
||||
void bindUTF8StringParameter (in unsigned long aParamIndex, in AUTF8String aValue);
|
||||
|
||||
void bindWStringParameter (in unsigned long aParamIndex, in wstring aValue);
|
||||
void bindStringParameter (in unsigned long aParamIndex, in AString aValue);
|
||||
|
||||
void bindDoubleParameter (in unsigned long aParamIndex, in double aValue);
|
||||
void bindInt32Parameter (in unsigned long aParamIndex, in long aValue);
|
||||
void bindInt64Parameter (in unsigned long aParamIndex, in long long aValue);
|
||||
|
||||
void bindNullParameter (in unsigned long aParamIndex);
|
||||
|
||||
void bindDataParameter (in unsigned long aParamIndex, [array,size_is(aValueSize)] in octet aValue, in unsigned long aValueSize);
|
||||
|
||||
// void bindParameters (in string aFormatString, ...);
|
||||
|
||||
/**
|
||||
* Execute the query, ignoring any results. This is accomplished
|
||||
* by calling step() once, and then calling reset().
|
||||
*
|
||||
* Error and last insert info, etc. are available from
|
||||
* the mozStorageConnection.
|
||||
*/
|
||||
void execute ();
|
||||
|
||||
/**
|
||||
* Execute the query, using any currently-bound parameters.
|
||||
*
|
||||
* @returns a mozIStorageDataSet containing all the rows of the query
|
||||
* result.
|
||||
*/
|
||||
mozIStorageDataSet executeDataSet ();
|
||||
|
||||
/**
|
||||
* Execute a query, using any currently-bound parameters. Reset
|
||||
* must be called on the statement after the last call of
|
||||
* executeStep.
|
||||
*
|
||||
* @returns a boolean indicating whether there are more rows or not;
|
||||
* row data may be accessed using mozIStorageValueArray methods on
|
||||
* the statement.
|
||||
*
|
||||
*/
|
||||
boolean executeStep ();
|
||||
|
||||
};
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
[scriptable, uuid(44fc1d3b-dc91-4d17-8bc5-2069d8fd3cca)]
|
||||
interface mozIStorageValueArray : nsISupports {
|
||||
|
||||
const long VALUE_TYPE_NULL = 0;
|
||||
const long VALUE_TYPE_INTEGER = 1;
|
||||
const long VALUE_TYPE_FLOAT = 2;
|
||||
const long VALUE_TYPE_TEXT = 3;
|
||||
const long VALUE_TYPE_BLOB = 4;
|
||||
|
||||
/**
|
||||
* numColumns
|
||||
*
|
||||
* number of columns in the array
|
||||
*/
|
||||
readonly attribute unsigned long numColumns;
|
||||
|
||||
long getTypeOfIndex (in unsigned long aIndex);
|
||||
|
||||
/* Due to SQLite's type conversion rules, any of these is valid */
|
||||
|
||||
long getAsInt32(in unsigned long aIndex);
|
||||
long long getAsInt64(in unsigned long aIndex);
|
||||
double getAsDouble(in unsigned long aIndex);
|
||||
string getAsCString(in unsigned long aIndex);
|
||||
AUTF8String getAsUTF8String(in unsigned long aIndex);
|
||||
AString getAsString(in unsigned long aIndex);
|
||||
void getAsBlob(in unsigned long aIndex, [array,size_is(aDataSize)] out octet aData, out unsigned long aDataSize);
|
||||
boolean getIsNull (in unsigned long aIndex);
|
||||
|
||||
/* XXX handle blobs! */
|
||||
|
||||
/* Native stuff */
|
||||
[notxpcom] long asInt32(in unsigned long aIndex);
|
||||
[notxpcom] long long asInt64(in unsigned long aIndex);
|
||||
[notxpcom] double asDouble(in unsigned long aIndex);
|
||||
[notxpcom] string asSharedCString(in unsigned long aIndex, out unsigned long aLength);
|
||||
[notxpcom] wstring asSharedWString(in unsigned long aIndex, out unsigned long aLength);
|
||||
|
||||
[noscript] void asSharedBlob(in unsigned long aIndex, [shared] out voidPtr aData, out unsigned long aDataSize);
|
||||
|
||||
[notxpcom] boolean isNull(in unsigned long aIndex);
|
||||
};
|
|
@ -0,0 +1,45 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef _MOZSTORAGE_H_
|
||||
#define _MOZSTORAGE_H_
|
||||
|
||||
#define MOZ_ERROR_STORAGE_OPEN_FAILED NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_STORAGE,1)
|
||||
#define MOZ_ERROR_STORAGE_BUSY NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_STORAGE,2)
|
||||
|
||||
#endif /* _MOZSTORAGE_H_ */
|
|
@ -0,0 +1,64 @@
|
|||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is Oracle Corporation code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Oracle Corporation
|
||||
# Portions created by the Initial Developer are Copyright (C) 2004
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = storage
|
||||
LIBRARY_NAME = storage_s
|
||||
MODULE_NAME = mozStorageModule
|
||||
FORCE_STATIC_LIB = 1
|
||||
GRE_MODULE = 1
|
||||
|
||||
REQUIRES = xpcom \
|
||||
string \
|
||||
sqlite3 \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
mozStorageService.cpp \
|
||||
mozStorageConnection.cpp \
|
||||
mozStorageStatement.cpp \
|
||||
mozStorageValueArray.cpp \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
|
@ -0,0 +1,440 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "nsError.h"
|
||||
#include "nsArray.h"
|
||||
#include "nsIFile.h"
|
||||
|
||||
#include "mozIStorageFunction.h"
|
||||
|
||||
#include "mozStorageConnection.h"
|
||||
#include "mozStorageStatement.h"
|
||||
#include "mozStorageValueArray.h"
|
||||
|
||||
#include "prlog.h"
|
||||
#include "prprf.h"
|
||||
|
||||
#ifdef PR_LOGGING
|
||||
PRLogModuleInfo* gStorageLog = nsnull;
|
||||
#endif
|
||||
|
||||
NS_IMPL_ISUPPORTS1(mozStorageConnection, mozIStorageConnection)
|
||||
|
||||
mozStorageConnection::mozStorageConnection()
|
||||
: mDBConn(nsnull), mTransactionInProgress(PR_FALSE)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
mozStorageConnection::~mozStorageConnection()
|
||||
{
|
||||
if (mDBConn) {
|
||||
int srv = sqlite3_close (mDBConn);
|
||||
if (srv != SQLITE_OK) {
|
||||
NS_WARNING("sqlite3_close failed. There are probably outstanding statements!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PR_LOGGING
|
||||
void tracefunc (void *closure, const char *stmt)
|
||||
{
|
||||
PR_LOG(gStorageLog, PR_LOG_DEBUG, ("%s", stmt));
|
||||
}
|
||||
#endif
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::Initialize(nsIFile *aDatabaseFile)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aDatabaseFile);
|
||||
|
||||
NS_ASSERTION (!mDBConn, "Initialize called on already opened database!");
|
||||
|
||||
int srv;
|
||||
nsresult rv;
|
||||
|
||||
rv = aDatabaseFile->GetNativeLeafName(mDatabaseName);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCAutoString nativePath;
|
||||
rv = aDatabaseFile->GetNativePath(nativePath);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
srv = sqlite3_open (nativePath.get(), &mDBConn);
|
||||
if (srv != SQLITE_OK) {
|
||||
mDBConn = nsnull;
|
||||
return NS_ERROR_FAILURE; // XXX error code
|
||||
}
|
||||
|
||||
#ifdef PR_LOGGING
|
||||
if (! gStorageLog)
|
||||
gStorageLog = PR_NewLogModule("mozStorage");
|
||||
|
||||
sqlite3_trace (mDBConn, tracefunc, nsnull);
|
||||
#endif
|
||||
|
||||
rv = NS_NewArray(getter_AddRefs(mFunctions));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
** mozIStorageConnection interface
|
||||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
** Core status/initialization
|
||||
**/
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::GetConnectionReady(PRBool *aConnectionReady)
|
||||
{
|
||||
*aConnectionReady = (mDBConn != nsnull);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::GetDatabaseName(nsACString& aDatabaseName)
|
||||
{
|
||||
NS_ASSERTION(mDBConn, "connection not initialized");
|
||||
|
||||
aDatabaseName = mDatabaseName;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::GetLastInsertRowID(PRInt64 *aLastInsertRowID)
|
||||
{
|
||||
NS_ASSERTION(mDBConn, "connection not initialized");
|
||||
|
||||
sqlite_int64 id = sqlite3_last_insert_rowid(mDBConn);
|
||||
*aLastInsertRowID = id;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::GetLastError(PRInt32 *aLastError)
|
||||
{
|
||||
NS_ASSERTION(mDBConn, "connection not initialized");
|
||||
|
||||
*aLastError = sqlite3_errcode(mDBConn);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::GetLastErrorString(nsACString& aLastErrorString)
|
||||
{
|
||||
NS_ASSERTION(mDBConn, "connection not initialized");
|
||||
|
||||
const char *serr = sqlite3_errmsg(mDBConn);
|
||||
aLastErrorString.Assign(serr);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
** Statements & Queries
|
||||
**/
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::CreateStatement(const nsACString& aSQLStatement,
|
||||
mozIStorageStatement **_retval)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(_retval);
|
||||
NS_ASSERTION(mDBConn, "connection not initialized");
|
||||
|
||||
mozStorageStatement *statement = new mozStorageStatement();
|
||||
NS_ADDREF(statement);
|
||||
|
||||
nsresult rv = statement->Initialize (this, aSQLStatement);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_RELEASE(statement);
|
||||
return NS_ERROR_FAILURE; // XXX error code
|
||||
}
|
||||
|
||||
*_retval = statement;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::ExecuteSimpleSQL(const nsACString& aSQLStatement)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(mDBConn);
|
||||
|
||||
char *errMsg = NULL;
|
||||
int srv = sqlite3_exec (mDBConn, PromiseFlatCString(aSQLStatement).get(),
|
||||
NULL, NULL, NULL);
|
||||
if (srv != SQLITE_OK) {
|
||||
HandleSqliteError(nsPromiseFlatCString(aSQLStatement).get());
|
||||
return NS_ERROR_FAILURE; // XXX error code
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
** Transactions
|
||||
**/
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::GetTransactionInProgress(PRInt32 *_retval)
|
||||
{
|
||||
*_retval = mTransactionInProgress;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// XXX do we want to just store compiled statements for these?
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::BeginTransaction()
|
||||
{
|
||||
if (mTransactionInProgress)
|
||||
return NS_ERROR_FAILURE; // XXX error code
|
||||
nsresult rv = ExecuteSimpleSQL (NS_LITERAL_CSTRING("BEGIN TRANSACTION"));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
mTransactionInProgress = PR_TRUE;
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::CommitTransaction()
|
||||
{
|
||||
if (!mTransactionInProgress)
|
||||
return NS_ERROR_FAILURE;
|
||||
nsresult rv = ExecuteSimpleSQL (NS_LITERAL_CSTRING("COMMIT TRANSACTION"));
|
||||
// even if the commit fails, the transaction is aborted
|
||||
mTransactionInProgress = PR_FALSE;
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::RollbackTransaction()
|
||||
{
|
||||
if (!mTransactionInProgress)
|
||||
return NS_ERROR_FAILURE;
|
||||
nsresult rv = ExecuteSimpleSQL (NS_LITERAL_CSTRING("ROLLBACK TRANSACTION"));
|
||||
mTransactionInProgress = PR_FALSE;
|
||||
return rv;
|
||||
}
|
||||
|
||||
/**
|
||||
** Table creation
|
||||
**/
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::CreateTable(/*const nsID& aID,*/
|
||||
const char *aTableName,
|
||||
const char *aTableSchema)
|
||||
{
|
||||
int srv;
|
||||
char *buf;
|
||||
int buflen = 0;
|
||||
|
||||
#if 0
|
||||
buflen = snprintf(nsnull, 0, "CREATE TABLE %s (%s)");
|
||||
if (buflen <= 0)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
buf = nsMemory::Alloc(buflen + 1);
|
||||
if (!buf)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
buflen = sprintf(buf, buflen, "CREATE TABLE %s (%s)");
|
||||
if (buflen <= 0) {
|
||||
nsMemory::Free(buf);
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
srv = sqlite3_exec (mDBConn, buf,
|
||||
NULL, NULL, NULL);
|
||||
nsMemory::Free(buf);
|
||||
|
||||
if (srv != SQLITE_OK) {
|
||||
return NS_ERROR_FAILURE; // XXX SQL_ERROR_TABLE_EXISTS
|
||||
}
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
** Functions and Triggers
|
||||
**/
|
||||
|
||||
static void
|
||||
mozStorageSqlFuncHelper (sqlite3_context *ctx,
|
||||
int argc,
|
||||
sqlite3_value **argv)
|
||||
{
|
||||
fprintf (stderr, "mozStorageSqlFuncHelper: %p %d %p\n", ctx, argc, argv);
|
||||
|
||||
void *userData = sqlite3_user_data (ctx);
|
||||
// We don't want to QI here, because this will be called a -lot-
|
||||
mozIStorageFunction *userFunction = NS_STATIC_CAST(mozIStorageFunction *, userData);
|
||||
|
||||
nsCOMPtr<mozStorageArgvValueArray> ava = new mozStorageArgvValueArray (argc, argv);
|
||||
nsresult rv = userFunction->OnFunctionCall (ava);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_WARNING("mozIStorageConnection: User function returned error code!\n");
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::CreateFunction(const char *aFunctionName,
|
||||
PRInt32 aNumArguments,
|
||||
mozIStorageFunction *aFunction)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
// do we already have this function defined?
|
||||
// XXX check for name as well
|
||||
PRUint32 idx;
|
||||
rv = mFunctions->IndexOf (0, aFunction, &idx);
|
||||
if (rv != NS_ERROR_FAILURE) {
|
||||
// already exists
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
int srv = sqlite3_create_function (mDBConn,
|
||||
aFunctionName,
|
||||
aNumArguments,
|
||||
SQLITE_ANY,
|
||||
aFunction,
|
||||
mozStorageSqlFuncHelper,
|
||||
nsnull,
|
||||
nsnull);
|
||||
if (srv != SQLITE_OK) {
|
||||
HandleSqliteError(nsnull);
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
rv = mFunctions->AppendElement (aFunction, PR_FALSE);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::CreateTrigger(const char *aTriggerName,
|
||||
PRInt32 aTriggerType,
|
||||
const char *aTableName,
|
||||
const char *aTriggerFunction,
|
||||
const char *aParameters)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
#if 0
|
||||
/* We don't need to split this until we need to generate
|
||||
* our own IPC trigger
|
||||
*/
|
||||
nsCStringArray *cstr = new nsCStringArray();
|
||||
if (!cstr)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
rv = cstr->ParseString (aParameters, ",");
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
#endif
|
||||
|
||||
char *event = nsnull;
|
||||
if (aTriggerType == TRIGGER_EVENT_DELETE)
|
||||
event = "DELETE";
|
||||
else if (aTriggerType == TRIGGER_EVENT_INSERT)
|
||||
event = "INSERT";
|
||||
else if (aTriggerType == TRIGGER_EVENT_UPDATE)
|
||||
event = "UPDATE";
|
||||
else
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
char *sql = PR_sprintf_append
|
||||
(nsnull,
|
||||
"CREATE TEMPORARY TRIGGER %s AFTER %s ON %s FOR EACH ROW BEGIN SELECT %s(%s); END;",
|
||||
aTriggerName,
|
||||
event,
|
||||
aTableName,
|
||||
aTriggerFunction,
|
||||
aParameters);
|
||||
if (!sql)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
/* Now create the trigger */
|
||||
int srv = sqlite3_exec (mDBConn,
|
||||
sql,
|
||||
nsnull,
|
||||
nsnull,
|
||||
nsnull);
|
||||
if (srv != SQLITE_OK) {
|
||||
HandleSqliteError(nsnull);
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::RemoveTrigger(const char *aTriggerName)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/**
|
||||
** Native support
|
||||
**/
|
||||
NS_IMETHODIMP
|
||||
mozStorageConnection::GetSqliteHandle(sqlite3 **aSqliteHandle)
|
||||
{
|
||||
*aSqliteHandle = mDBConn;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
** Other bits
|
||||
**/
|
||||
void
|
||||
mozStorageConnection::HandleSqliteError(const char *aSqlStatement)
|
||||
{
|
||||
// an error just occured!
|
||||
#ifdef PR_LOGGING
|
||||
PR_LOG(gStorageLog, PR_LOG_DEBUG, ("Sqlite error: %d '%s'", sqlite3_errcode(mDBConn), sqlite3_errmsg(mDBConn)));
|
||||
if (aSqlStatement)
|
||||
PR_LOG(gStorageLog, PR_LOG_DEBUG, ("Statement was: %s", aSqlStatement));
|
||||
#endif
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef _MOZSTORAGECONNECTION_H_
|
||||
#define _MOZSTORAGECONNECTION_H_
|
||||
|
||||
#include "nsString.h"
|
||||
#include "mozIStorageConnection.h"
|
||||
|
||||
#include "nsIArray.h"
|
||||
|
||||
#include <sqlite3.h>
|
||||
|
||||
class nsIFile;
|
||||
|
||||
class mozStorageConnection : public mozIStorageConnection
|
||||
{
|
||||
public:
|
||||
|
||||
mozStorageConnection();
|
||||
|
||||
NS_IMETHOD mozStorageConnection::Initialize(nsIFile *aDatabaseFile);
|
||||
|
||||
// interfaces
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_MOZISTORAGECONNECTION
|
||||
|
||||
private:
|
||||
~mozStorageConnection();
|
||||
|
||||
protected:
|
||||
void HandleSqliteError(const char *aSqlStatement);
|
||||
|
||||
sqlite3 *mDBConn;
|
||||
nsCString mDatabaseName;
|
||||
PRBool mTransactionInProgress;
|
||||
|
||||
nsCOMPtr<nsIMutableArray> mFunctions;
|
||||
};
|
||||
|
||||
#endif /* _MOZSTORAGECONNECTION_H_ */
|
|
@ -0,0 +1,98 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "mozStorageService.h"
|
||||
#include "mozStorageConnection.h"
|
||||
|
||||
#include "sqlite3.h"
|
||||
|
||||
NS_IMPL_ISUPPORTS1(mozStorageService, mozIStorageService)
|
||||
|
||||
// XXX this sucks that we have to pull in nsIFile and all that
|
||||
// just to use NS_GetSpecialDirectory
|
||||
|
||||
mozStorageService::mozStorageService()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
mozStorageService::~mozStorageService()
|
||||
{
|
||||
/* destructor code */
|
||||
}
|
||||
|
||||
#ifndef NS_APP_STORAGE_50_FILE
|
||||
#define NS_APP_STORAGE_50_FILE "UStor"
|
||||
#endif
|
||||
|
||||
/* mozIStorageConnection getProfileStorage (in string aStorageKey); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageService::GetProfileStorage(const char *aStorageKey, mozIStorageConnection **_retval)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIFile> storageFile;
|
||||
rv = NS_GetSpecialDirectory(NS_APP_STORAGE_50_FILE, getter_AddRefs(storageFile));
|
||||
if (NS_FAILED(rv)) {
|
||||
// teh wtf?
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsCOMPtr<mozStorageConnection> conn = new mozStorageConnection();
|
||||
rv = conn->Initialize (storageFile);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
*_retval = conn;
|
||||
NS_ADDREF(*_retval);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* mozIStorageConnection openDatabase(in nsIFile aDatabaseFile); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageService::OpenDatabase(nsIFile *aDatabaseFile, mozIStorageConnection **_retval)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<mozStorageConnection> conn = new mozStorageConnection();
|
||||
rv = conn->Initialize (aDatabaseFile);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
*_retval = conn;
|
||||
NS_ADDREF(*_retval);
|
||||
return NS_OK;
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef _MOZSTORAGESERVICE_H_
|
||||
#define _MOZSTORAGESERVICE_H_
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIFile.h"
|
||||
|
||||
#include "mozIStorageService.h"
|
||||
|
||||
class mozStorageService : public mozIStorageService
|
||||
{
|
||||
public:
|
||||
mozStorageService();
|
||||
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// mozIStorageService
|
||||
NS_DECL_MOZISTORAGESERVICE
|
||||
|
||||
private:
|
||||
~mozStorageService();
|
||||
protected:
|
||||
nsCOMPtr<nsIFile> mProfileStorageFile;
|
||||
};
|
||||
|
||||
#endif /* _MOZSTORAGESERVICE_H_ */
|
|
@ -0,0 +1,663 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "nsError.h"
|
||||
#include "nsISimpleEnumerator.h"
|
||||
|
||||
#include "mozStorageStatement.h"
|
||||
#include "mozStorageValueArray.h"
|
||||
|
||||
#include "prlog.h"
|
||||
|
||||
#ifdef PR_LOGGING
|
||||
extern PRLogModuleInfo* gStorageLog;
|
||||
#endif
|
||||
|
||||
/**
|
||||
** mozStorageStatementRowEnumerator
|
||||
**/
|
||||
class mozStorageStatementRowEnumerator : public nsISimpleEnumerator {
|
||||
public:
|
||||
// this expects a statement that has NOT had step called on it yet
|
||||
mozStorageStatementRowEnumerator (sqlite3_stmt *aDBStatement);
|
||||
|
||||
// nsISupports interface
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsISimpleEnumerator interface
|
||||
NS_DECL_NSISIMPLEENUMERATOR
|
||||
|
||||
private:
|
||||
~mozStorageStatementRowEnumerator ();
|
||||
protected:
|
||||
sqlite3_stmt *mDBStatement;
|
||||
PRBool mHasMore;
|
||||
PRBool mDidStep;
|
||||
|
||||
void DoRealStep();
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS1(mozStorageStatementRowEnumerator, nsISimpleEnumerator)
|
||||
|
||||
mozStorageStatementRowEnumerator::mozStorageStatementRowEnumerator (sqlite3_stmt *aDBStatement)
|
||||
: mDBStatement (aDBStatement)
|
||||
{
|
||||
NS_ASSERTION (aDBStatement != nsnull, "Null statement!");
|
||||
|
||||
// do the first step
|
||||
DoRealStep ();
|
||||
mDidStep = PR_TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
mozStorageStatementRowEnumerator::DoRealStep ()
|
||||
{
|
||||
int srv = sqlite3_step (mDBStatement);
|
||||
|
||||
switch (srv) {
|
||||
case SQLITE_ROW:
|
||||
mHasMore = PR_TRUE;
|
||||
break;
|
||||
case SQLITE_DONE:
|
||||
mHasMore = PR_FALSE;
|
||||
break;
|
||||
case SQLITE_BUSY: // XXX!!!
|
||||
case SQLITE_MISUSE:
|
||||
case SQLITE_ERROR:
|
||||
default:
|
||||
mHasMore = PR_FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mozStorageStatementRowEnumerator::~mozStorageStatementRowEnumerator ()
|
||||
{
|
||||
}
|
||||
|
||||
/* nsISimpleEnumerator interface */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowEnumerator::HasMoreElements (PRBool *_retval)
|
||||
{
|
||||
// step if we haven't already
|
||||
if (!mDidStep) {
|
||||
DoRealStep();
|
||||
mDidStep = PR_TRUE;
|
||||
}
|
||||
|
||||
*_retval = mHasMore;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowEnumerator::GetNext (nsISupports **_retval)
|
||||
{
|
||||
if (!mHasMore)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
if (!mDidStep)
|
||||
DoRealStep();
|
||||
mDidStep = PR_FALSE;
|
||||
|
||||
// assume this is SQLITE_ROW
|
||||
int numColumns = sqlite3_data_count (mDBStatement);
|
||||
|
||||
mozStorageStatementRowValueArray *mssrva = new mozStorageStatementRowValueArray(mDBStatement);
|
||||
NS_ADDREF(mssrva);
|
||||
*_retval = mssrva;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
** mozStorageStatement
|
||||
**/
|
||||
|
||||
NS_IMPL_ISUPPORTS2(mozStorageStatement, mozIStorageStatement, mozIStorageValueArray)
|
||||
|
||||
mozStorageStatement::mozStorageStatement()
|
||||
: mDBConnection (nsnull), mDBStatement(nsnull)
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::Initialize(mozIStorageConnection *aDBConnection, const nsACString & aSQLStatement)
|
||||
{
|
||||
int srv;
|
||||
nsresult rv;
|
||||
|
||||
sqlite3 *db = nsnull;
|
||||
rv = aDBConnection->GetSqliteHandle(&db);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
srv = sqlite3_prepare (db, nsPromiseFlatCString(aSQLStatement).get(), aSQLStatement.Length(), &mDBStatement, NULL);
|
||||
if (srv != SQLITE_OK) {
|
||||
fprintf (stderr, "SQLITE ERROR: Statement: '%s'\n", nsPromiseFlatCString(aSQLStatement).get());
|
||||
fprintf (stderr, "SQLITE ERROR: %d '%s'\n", srv, sqlite3_errmsg(db));
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
mDBConnection = aDBConnection;
|
||||
mStatementString.Assign (aSQLStatement);
|
||||
mParamCount = sqlite3_bind_parameter_count (mDBStatement);
|
||||
mResultColumnCount = sqlite3_column_count (mDBStatement);
|
||||
|
||||
// doing a sqlite3_prepare sets up the execution engine
|
||||
// for that statement; doing a create_function after that
|
||||
// results in badness, because there's a selected statement.
|
||||
// use this hack to clear it out -- this may be a bug.
|
||||
sqlite3_exec (db, "", 0, 0, 0);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
mozStorageStatement::~mozStorageStatement()
|
||||
{
|
||||
if (mDBStatement)
|
||||
sqlite3_finalize (mDBStatement);
|
||||
}
|
||||
|
||||
/* mozIStorageStatement clone (); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::Clone(mozIStorageStatement **_retval)
|
||||
{
|
||||
mozStorageStatement *mss = new mozStorageStatement();
|
||||
NS_ADDREF(mss);
|
||||
|
||||
nsresult rv = mss->Initialize (mDBConnection, mStatementString);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_RELEASE(mss);
|
||||
return NS_ERROR_FAILURE; // XXX error code
|
||||
}
|
||||
|
||||
*_retval = mss;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* readonly attribute unsigned long parameterCount; */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetParameterCount(PRUint32 *aParameterCount)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/* void reset (); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::Reset()
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
|
||||
sqlite3_reset(mDBStatement);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindCStringParameter (in unsigned long aParamIndex, in string aValue); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindCStringParameter(PRUint32 aParamIndex, const char *aValue)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_text (mDBStatement, aParamIndex + 1, aValue, -1, SQLITE_TRANSIENT);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindUTF8StringParameter (in unsigned long aParamIndex, in AUTF8String aValue); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindUTF8StringParameter(PRUint32 aParamIndex, const nsACString & aValue)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_text (mDBStatement, aParamIndex + 1,
|
||||
nsPromiseFlatCString(aValue).get(), aValue.Length(),
|
||||
SQLITE_TRANSIENT);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindWStringParameter (in unsigned long aParamIndex, in wstring aValue); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindWStringParameter(PRUint32 aParamIndex, const PRUnichar *aValue)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_text16 (mDBStatement, aParamIndex + 1, aValue, -1, SQLITE_TRANSIENT);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindStringParameter (in unsigned long aParamIndex, in AString aValue); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindStringParameter(PRUint32 aParamIndex, const nsAString & aValue)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_text16 (mDBStatement, aParamIndex + 1,
|
||||
nsPromiseFlatString(aValue).get(), aValue.Length() * 2,
|
||||
SQLITE_TRANSIENT);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindDoubleParameter (in unsigned long aParamIndex, in double aValue); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindDoubleParameter(PRUint32 aParamIndex, double aValue)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_double (mDBStatement, aParamIndex + 1, aValue);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindInt32Parameter (in unsigned long aParamIndex, in long aValue); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindInt32Parameter(PRUint32 aParamIndex, PRInt32 aValue)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_int (mDBStatement, aParamIndex + 1, aValue);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindInt64Parameter (in unsigned long aParamIndex, in long long aValue); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindInt64Parameter(PRUint32 aParamIndex, PRInt64 aValue)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_int64 (mDBStatement, aParamIndex + 1, aValue);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindNullParameter (in unsigned long aParamIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindNullParameter(PRUint32 aParamIndex)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_null (mDBStatement, aParamIndex + 1);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void bindDataParameter (in unsigned long aParamIndex, [array, size_is (aValueSize)] in octet aValue, in unsigned long aValueSize); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::BindDataParameter(PRUint32 aParamIndex, PRUint8 *aValue, PRUint32 aValueSize)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
if (aParamIndex < 0 || aParamIndex >= mParamCount)
|
||||
return NS_ERROR_FAILURE; // XXXerror
|
||||
|
||||
int srv = sqlite3_bind_blob (mDBStatement, aParamIndex + 1, aValue, aValueSize, SQLITE_TRANSIENT);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void execute (); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::Execute()
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
|
||||
int srv = sqlite3_step (mDBStatement);
|
||||
if (srv == SQLITE_MISUSE || srv == SQLITE_ERROR) {
|
||||
#ifdef PR_LOGGING
|
||||
sqlite3 *sqh;
|
||||
mDBConnection->GetSqliteHandle(&sqh);
|
||||
PR_LOG(gStorageLog, PR_LOG_DEBUG, ("mozStorageStatement::Execute error: %s", sqlite3_errmsg(sqh)));
|
||||
#endif
|
||||
return NS_ERROR_FAILURE; // XXX error code
|
||||
}
|
||||
sqlite3_reset (mDBStatement);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* mozIStorageDataSet executeDataSet (); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::ExecuteDataSet(mozIStorageDataSet **_retval)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
|
||||
int srv;
|
||||
|
||||
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/* boolean executeStep (); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::ExecuteStep(PRBool *_retval)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
|
||||
int srv = sqlite3_step (mDBStatement);
|
||||
|
||||
#ifdef PR_LOGGING
|
||||
if (srv != SQLITE_ROW && srv != SQLITE_DONE) {
|
||||
sqlite3 *sqh;
|
||||
mDBConnection->GetSqliteHandle(&sqh);
|
||||
PR_LOG(gStorageLog, PR_LOG_DEBUG, ("mozStorageStatement::ExecuteStep error: %s", sqlite3_errmsg(sqh)));
|
||||
}
|
||||
#endif
|
||||
|
||||
// SQLITE_ROW and SQLITE_DONE are non-errors
|
||||
if (srv == SQLITE_ROW) {
|
||||
// we got a row back
|
||||
*_retval = PR_TRUE;
|
||||
return NS_OK;
|
||||
} else if (srv == SQLITE_DONE) {
|
||||
// statement is done (no row returned)
|
||||
*_retval = PR_FALSE;
|
||||
return NS_OK;
|
||||
} else if (srv == SQLITE_BUSY) {
|
||||
// ??? what to do?
|
||||
return NS_ERROR_FAILURE;
|
||||
} else if (srv == SQLITE_MISUSE) {
|
||||
// bad stuff happened
|
||||
return NS_ERROR_FAILURE;
|
||||
} else if (srv == SQLITE_ERROR) {
|
||||
// even worse stuff happened
|
||||
} else {
|
||||
// something that shouldn't happen happened
|
||||
NS_ERROR ("sqlite3_step returned an error code we don't know about!");
|
||||
}
|
||||
|
||||
// shouldn't get here
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* nsISimpleEnumerator executeEnumerator (); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::ExecuteEnumerator(nsISimpleEnumerator **_retval)
|
||||
{
|
||||
NS_ASSERTION (mDBConnection && mDBStatement, "statement not initialized");
|
||||
|
||||
mozStorageStatementRowEnumerator *mssre = new mozStorageStatementRowEnumerator (mDBStatement);
|
||||
NS_ADDREF(mssre);
|
||||
*_retval = mssre;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/***
|
||||
*** mozIStorageValueArray
|
||||
***/
|
||||
|
||||
/* readonly attribute unsigned long length; */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetNumColumns(PRUint32 *aLength)
|
||||
{
|
||||
*aLength = mResultColumnCount;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long getTypeOfIndex (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetTypeOfIndex(PRUint32 aIndex, PRInt32 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
int t = sqlite3_column_type (mDBStatement, aIndex);
|
||||
switch (t) {
|
||||
case SQLITE_INTEGER:
|
||||
*_retval = VALUE_TYPE_INTEGER;
|
||||
break;
|
||||
case SQLITE_FLOAT:
|
||||
*_retval = VALUE_TYPE_FLOAT;
|
||||
break;
|
||||
case SQLITE_TEXT:
|
||||
*_retval = VALUE_TYPE_TEXT;
|
||||
break;
|
||||
case SQLITE_BLOB:
|
||||
*_retval = VALUE_TYPE_BLOB;
|
||||
break;
|
||||
case SQLITE_NULL:
|
||||
*_retval = VALUE_TYPE_NULL;
|
||||
break;
|
||||
default:
|
||||
// ???
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long getAsInt32 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetAsInt32(PRUint32 aIndex, PRInt32 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_column_int (mDBStatement, aIndex);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long long getAsInt64 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetAsInt64(PRUint32 aIndex, PRInt64 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_column_int64 (mDBStatement, aIndex);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* double getAsDouble (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetAsDouble(PRUint32 aIndex, double *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_column_double (mDBStatement, aIndex);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* string getAsCString (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetAsCString(PRUint32 aIndex, char **_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_column_bytes (mDBStatement, aIndex);
|
||||
const unsigned char *cstr = sqlite3_column_text (mDBStatement, aIndex);
|
||||
char *str = (char *) nsMemory::Clone (cstr, slen);
|
||||
if (str == NULL)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
*_retval = str;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* AUTF8String getAsUTF8String (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetAsUTF8String(PRUint32 aIndex, nsACString & _retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_column_bytes (mDBStatement, aIndex);
|
||||
const unsigned char *cstr = sqlite3_column_text (mDBStatement, aIndex);
|
||||
_retval.Assign ((char *) cstr, slen);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* AString getAsString (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetAsString(PRUint32 aIndex, nsAString & _retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_column_bytes16 (mDBStatement, aIndex);
|
||||
const PRUnichar *wstr = (const PRUnichar *) sqlite3_column_text16 (mDBStatement, aIndex);
|
||||
_retval.Assign (wstr, slen/2);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void getAsBlob (in unsigned long aIndex, [array, size_is (aDataSize)] out octet aData, out unsigned long aDataSize); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetAsBlob(PRUint32 aIndex, PRUint8 **aData, PRUint32 *aDataSize)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
int blobsize = sqlite3_column_bytes (mDBStatement, aIndex);
|
||||
const void *blob = sqlite3_column_blob (mDBStatement, aIndex);
|
||||
|
||||
void *blobcopy = nsMemory::Clone(blob, blobsize);
|
||||
if (blobcopy == NULL)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
*aData = (PRUint8*) blobcopy;
|
||||
*aDataSize = blobsize;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* [notxpcom] long asInt32 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(PRInt32)
|
||||
mozStorageStatement::AsInt32(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
return sqlite3_column_int (mDBStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [notxpcom] long long asInt64 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(PRInt64)
|
||||
mozStorageStatement::AsInt64(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
return sqlite3_column_int64 (mDBStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [notxpcom] double asDouble (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(double)
|
||||
mozStorageStatement::AsDouble(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
return sqlite3_column_double (mDBStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [notxpcom] string asSharedCString (in unsigned long aIndex, out unsigned long aLength); */
|
||||
NS_IMETHODIMP_(char *)
|
||||
mozStorageStatement::AsSharedCString(PRUint32 aIndex, PRUint32 *aLength)
|
||||
{
|
||||
if (aLength) {
|
||||
int slen = sqlite3_column_bytes (mDBStatement, aIndex);
|
||||
*aLength = slen;
|
||||
}
|
||||
|
||||
return (char *) sqlite3_column_text (mDBStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [notxpcom] wstring asSharedWString (in unsigned long aIndex, out unsigned long aLength); */
|
||||
NS_IMETHODIMP_(PRUnichar *)
|
||||
mozStorageStatement::AsSharedWString(PRUint32 aIndex, PRUint32 *aLength)
|
||||
{
|
||||
if (aLength) {
|
||||
int slen = sqlite3_column_bytes16 (mDBStatement, aIndex);
|
||||
*aLength = slen;
|
||||
}
|
||||
|
||||
return (PRUnichar *) sqlite3_column_text16 (mDBStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [noscript] void asSharedBlob (in unsigned long aIndex, [shared] out voidPtr aData, out unsigned long aDataSize); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::AsSharedBlob(PRUint32 aIndex, const void * *aData, PRUint32 *aDataSize)
|
||||
{
|
||||
*aDataSize = sqlite3_column_bytes (mDBStatement, aIndex);
|
||||
*aData = sqlite3_column_blob (mDBStatement, aIndex);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* boolean getIsNull (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatement::GetIsNull(PRUint32 aIndex, PRBool *_retval)
|
||||
{
|
||||
PRInt32 t;
|
||||
nsresult rv = GetTypeOfIndex (aIndex, &t);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (t == VALUE_TYPE_NULL)
|
||||
*_retval = PR_TRUE;
|
||||
else
|
||||
*_retval = PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/* [notxpcom] boolean isNull (in unsigned long aIndex); */
|
||||
PRBool
|
||||
mozStorageStatement::IsNull(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mResultColumnCount, "aIndex out of range");
|
||||
|
||||
return (sqlite3_column_type (mDBStatement, aIndex) == SQLITE_NULL);
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef _MOZSTORAGESTATEMENT_H_
|
||||
#define _MOZSTORAGESTATEMENT_H_
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#include "mozIStorageStatement.h"
|
||||
#include "mozIStorageConnection.h"
|
||||
|
||||
#include <sqlite3.h>
|
||||
|
||||
class mozStorageStatement : public mozIStorageStatement
|
||||
{
|
||||
public:
|
||||
mozStorageStatement();
|
||||
|
||||
// interfaces
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_MOZISTORAGESTATEMENT
|
||||
NS_DECL_MOZISTORAGEVALUEARRAY
|
||||
|
||||
private:
|
||||
~mozStorageStatement();
|
||||
|
||||
protected:
|
||||
nsCString mStatementString;
|
||||
nsCOMPtr<mozIStorageConnection> mDBConnection;
|
||||
sqlite3_stmt *mDBStatement;
|
||||
PRUint32 mParamCount;
|
||||
PRUint32 mResultColumnCount;
|
||||
};
|
||||
|
||||
#endif /* _MOZSTORAGESTATEMENT_H_ */
|
|
@ -0,0 +1,547 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsError.h"
|
||||
#include "nsMemory.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#include "mozStorageValueArray.h"
|
||||
|
||||
/***
|
||||
*** mozStorageStatementRowValueArray
|
||||
***/
|
||||
|
||||
/* Implementation file */
|
||||
NS_IMPL_ISUPPORTS1(mozStorageStatementRowValueArray, mozIStorageValueArray)
|
||||
|
||||
mozStorageStatementRowValueArray::mozStorageStatementRowValueArray(sqlite3_stmt *aSqliteStmt)
|
||||
{
|
||||
mSqliteStatement = aSqliteStmt;
|
||||
mNumColumns = sqlite3_data_count (aSqliteStmt);
|
||||
}
|
||||
|
||||
mozStorageStatementRowValueArray::~mozStorageStatementRowValueArray()
|
||||
{
|
||||
/* do nothing, we don't own the stmt */
|
||||
}
|
||||
|
||||
/* readonly attribute unsigned long length; */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetNumColumns(PRUint32 *aLength)
|
||||
{
|
||||
*aLength = mNumColumns;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long getTypeOfIndex (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetTypeOfIndex(PRUint32 aIndex, PRInt32 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
int t = sqlite3_column_type (mSqliteStatement, aIndex);
|
||||
switch (t) {
|
||||
case SQLITE_INTEGER:
|
||||
*_retval = VALUE_TYPE_INTEGER;
|
||||
break;
|
||||
case SQLITE_FLOAT:
|
||||
*_retval = VALUE_TYPE_FLOAT;
|
||||
break;
|
||||
case SQLITE_TEXT:
|
||||
*_retval = VALUE_TYPE_TEXT;
|
||||
break;
|
||||
case SQLITE_BLOB:
|
||||
*_retval = VALUE_TYPE_BLOB;
|
||||
break;
|
||||
case SQLITE_NULL:
|
||||
*_retval = VALUE_TYPE_NULL;
|
||||
break;
|
||||
default:
|
||||
// ???
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long getAsInt32 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetAsInt32(PRUint32 aIndex, PRInt32 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_column_int (mSqliteStatement, aIndex);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long long getAsInt64 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetAsInt64(PRUint32 aIndex, PRInt64 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_column_int64 (mSqliteStatement, aIndex);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* double getAsDouble (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetAsDouble(PRUint32 aIndex, double *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_column_double (mSqliteStatement, aIndex);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* string getAsCString (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetAsCString(PRUint32 aIndex, char **_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_column_bytes (mSqliteStatement, aIndex);
|
||||
const unsigned char *cstr = sqlite3_column_text (mSqliteStatement, aIndex);
|
||||
char *str = (char *) nsMemory::Clone (cstr, slen);
|
||||
if (str == NULL)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
*_retval = str;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* AUTF8String getAsUTF8String (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetAsUTF8String(PRUint32 aIndex, nsACString & _retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_column_bytes (mSqliteStatement, aIndex);
|
||||
const unsigned char *cstr = sqlite3_column_text (mSqliteStatement, aIndex);
|
||||
_retval.Assign ((char *) cstr, slen);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* AString getAsString (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetAsString(PRUint32 aIndex, nsAString & _retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_column_bytes16 (mSqliteStatement, aIndex);
|
||||
const PRUnichar *wstr = (const PRUnichar *) sqlite3_column_text16 (mSqliteStatement, aIndex);
|
||||
_retval.Assign (wstr, slen/2);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void getAsBlob (in unsigned long aIndex, [array, size_is (aDataSize)] out octet aData, out unsigned long aDataSize); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetAsBlob(PRUint32 aIndex, PRUint8 **aData, PRUint32 *aDataSize)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
int blobsize = sqlite3_column_bytes (mSqliteStatement, aIndex);
|
||||
const void *blob = sqlite3_column_blob (mSqliteStatement, aIndex);
|
||||
|
||||
void *blobcopy = nsMemory::Clone(blob, blobsize);
|
||||
if (blobcopy == NULL)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
*aData = (PRUint8*) blobcopy;
|
||||
*aDataSize = blobsize;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* [notxpcom] long asInt32 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(PRInt32)
|
||||
mozStorageStatementRowValueArray::AsInt32(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
return sqlite3_column_int (mSqliteStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [notxpcom] long long asInt64 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(PRInt64)
|
||||
mozStorageStatementRowValueArray::AsInt64(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
return sqlite3_column_int64 (mSqliteStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [notxpcom] double asDouble (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(double)
|
||||
mozStorageStatementRowValueArray::AsDouble(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
return sqlite3_column_double (mSqliteStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [notxpcom] string asSharedCString (in unsigned long aIndex, out unsigned long aLength); */
|
||||
NS_IMETHODIMP_(char *)
|
||||
mozStorageStatementRowValueArray::AsSharedCString(PRUint32 aIndex, PRUint32 *aLength)
|
||||
{
|
||||
if (aLength) {
|
||||
int slen = sqlite3_column_bytes (mSqliteStatement, aIndex);
|
||||
*aLength = slen;
|
||||
}
|
||||
|
||||
return (char *) sqlite3_column_text (mSqliteStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [notxpcom] wstring asSharedWString (in unsigned long aIndex, out unsigned long aLength); */
|
||||
NS_IMETHODIMP_(PRUnichar *)
|
||||
mozStorageStatementRowValueArray::AsSharedWString(PRUint32 aIndex, PRUint32 *aLength)
|
||||
{
|
||||
if (aLength) {
|
||||
int slen = sqlite3_column_bytes16 (mSqliteStatement, aIndex);
|
||||
*aLength = slen;
|
||||
}
|
||||
|
||||
return (PRUnichar *) sqlite3_column_text16 (mSqliteStatement, aIndex);
|
||||
}
|
||||
|
||||
/* [noscript] void asSharedBlob (in unsigned long aIndex, [shared] out voidPtr aData, out unsigned long aDataSize); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::AsSharedBlob(PRUint32 aIndex, const void * *aData, PRUint32 *aDataSize)
|
||||
{
|
||||
*aDataSize = sqlite3_column_bytes (mSqliteStatement, aIndex);
|
||||
*aData = sqlite3_column_blob (mSqliteStatement, aIndex);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* boolean getIsNull (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageStatementRowValueArray::GetIsNull(PRUint32 aIndex, PRBool *_retval)
|
||||
{
|
||||
PRInt32 t;
|
||||
nsresult rv = GetTypeOfIndex (aIndex, &t);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (t == VALUE_TYPE_NULL)
|
||||
*_retval = PR_TRUE;
|
||||
else
|
||||
*_retval = PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/* [notxpcom] boolean isNull (in unsigned long aIndex); */
|
||||
PRBool
|
||||
mozStorageStatementRowValueArray::IsNull(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mNumColumns, "aIndex out of range");
|
||||
|
||||
return (sqlite3_column_type (mSqliteStatement, aIndex) == SQLITE_NULL);
|
||||
}
|
||||
|
||||
/***
|
||||
*** mozStorageArgvValueArray
|
||||
***/
|
||||
|
||||
/* Implementation file */
|
||||
NS_IMPL_ISUPPORTS1(mozStorageArgvValueArray, mozIStorageValueArray)
|
||||
|
||||
mozStorageArgvValueArray::mozStorageArgvValueArray(PRInt32 aArgc, sqlite3_value **aArgv)
|
||||
: mArgc(aArgc), mArgv(aArgv)
|
||||
{
|
||||
}
|
||||
|
||||
mozStorageArgvValueArray::~mozStorageArgvValueArray()
|
||||
{
|
||||
/* do nothing, we don't own the array */
|
||||
}
|
||||
|
||||
/* readonly attribute unsigned long length; */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetNumColumns(PRUint32 *aLength)
|
||||
{
|
||||
*aLength = mArgc;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long getTypeOfIndex (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetTypeOfIndex(PRUint32 aIndex, PRInt32 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
int t = sqlite3_value_type (mArgv[aIndex]);
|
||||
switch (t) {
|
||||
case SQLITE_INTEGER:
|
||||
*_retval = VALUE_TYPE_INTEGER;
|
||||
break;
|
||||
case SQLITE_FLOAT:
|
||||
*_retval = VALUE_TYPE_FLOAT;
|
||||
break;
|
||||
case SQLITE_TEXT:
|
||||
*_retval = VALUE_TYPE_TEXT;
|
||||
break;
|
||||
case SQLITE_BLOB:
|
||||
*_retval = VALUE_TYPE_BLOB;
|
||||
break;
|
||||
case SQLITE_NULL:
|
||||
*_retval = VALUE_TYPE_NULL;
|
||||
break;
|
||||
default:
|
||||
// ???
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long getAsInt32 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetAsInt32(PRUint32 aIndex, PRInt32 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_value_int (mArgv[aIndex]);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* long long getAsInt64 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetAsInt64(PRUint32 aIndex, PRInt64 *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_value_int64 (mArgv[aIndex]);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* double getAsDouble (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetAsDouble(PRUint32 aIndex, double *_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
*_retval = sqlite3_value_double (mArgv[aIndex]);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* string getAsCString (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetAsCString(PRUint32 aIndex, char **_retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_value_bytes (mArgv[aIndex]);
|
||||
const unsigned char *cstr = sqlite3_value_text (mArgv[aIndex]);
|
||||
char *str = (char *) nsMemory::Clone (cstr, slen);
|
||||
if (str == NULL)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
*_retval = str;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* AUTF8String getAsUTF8String (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetAsUTF8String(PRUint32 aIndex, nsACString & _retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_value_bytes (mArgv[aIndex]);
|
||||
const unsigned char *cstr = sqlite3_value_text (mArgv[aIndex]);
|
||||
_retval.Assign ((char *) cstr, slen);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* AString getAsString (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetAsString(PRUint32 aIndex, nsAString & _retval)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
int slen = sqlite3_value_bytes16 (mArgv[aIndex]);
|
||||
const PRUnichar *wstr = (const PRUnichar *) sqlite3_value_text16 (mArgv[aIndex]);
|
||||
_retval.Assign (wstr, slen);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* void getAsBlob (in unsigned long aIndex, [array, size_is (aDataSize)] out octet aData, out unsigned long aDataSize); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetAsBlob(PRUint32 aIndex, PRUint8 **aData, PRUint32 *aDataSize)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
int blobsize = sqlite3_value_bytes (mArgv[aIndex]);
|
||||
const void *blob = sqlite3_value_blob (mArgv[aIndex]);
|
||||
|
||||
void *blobcopy = nsMemory::Clone(blob, blobsize);
|
||||
if (blobcopy == NULL)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
*aData = (PRUint8*) blobcopy;
|
||||
*aDataSize = blobsize;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* [notxpcom] long asInt32 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(PRInt32)
|
||||
mozStorageArgvValueArray::AsInt32(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
return sqlite3_value_int (mArgv[aIndex]);
|
||||
}
|
||||
|
||||
/* [notxpcom] long long asInt64 (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(PRInt64)
|
||||
mozStorageArgvValueArray::AsInt64(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
return sqlite3_value_int64 (mArgv[aIndex]);
|
||||
}
|
||||
|
||||
/* [notxpcom] double asDouble (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP_(double)
|
||||
mozStorageArgvValueArray::AsDouble(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
return sqlite3_value_double (mArgv[aIndex]);
|
||||
}
|
||||
|
||||
/* [notxpcom] string asSharedCString (in unsigned long aIndex, out unsigned long aLength); */
|
||||
NS_IMETHODIMP_(char *)
|
||||
mozStorageArgvValueArray::AsSharedCString(PRUint32 aIndex, PRUint32 *aLength)
|
||||
{
|
||||
if (aLength) {
|
||||
int slen = sqlite3_value_bytes (mArgv[aIndex]);
|
||||
*aLength = slen;
|
||||
}
|
||||
|
||||
return (char *) sqlite3_value_text (mArgv[aIndex]);
|
||||
}
|
||||
|
||||
/* [notxpcom] wstring asSharedWString (in unsigned long aIndex, out unsigned long aLength); */
|
||||
NS_IMETHODIMP_(PRUnichar *)
|
||||
mozStorageArgvValueArray::AsSharedWString(PRUint32 aIndex, PRUint32 *aLength)
|
||||
{
|
||||
if (aLength) {
|
||||
int slen = sqlite3_value_bytes16 (mArgv[aIndex]);
|
||||
*aLength = slen;
|
||||
}
|
||||
|
||||
return (PRUnichar *) sqlite3_value_text16 (mArgv[aIndex]);
|
||||
}
|
||||
|
||||
/* [noscript] void asSharedBlob (in unsigned long aIndex, [shared] out voidPtr aData, out unsigned long aDataSize); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::AsSharedBlob(PRUint32 aIndex, const void * *aData, PRUint32 *aDataSize)
|
||||
{
|
||||
*aDataSize = sqlite3_value_bytes (mArgv[aIndex]);
|
||||
*aData = sqlite3_value_blob (mArgv[aIndex]);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* boolean getIsNull (in unsigned long aIndex); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageArgvValueArray::GetIsNull(PRUint32 aIndex, PRBool *_retval)
|
||||
{
|
||||
PRInt32 t;
|
||||
nsresult rv = GetTypeOfIndex (aIndex, &t);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (t == VALUE_TYPE_NULL)
|
||||
*_retval = PR_TRUE;
|
||||
else
|
||||
*_retval = PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/* [notxpcom] boolean isNull (in unsigned long aIndex); */
|
||||
PRBool
|
||||
mozStorageArgvValueArray::IsNull(PRUint32 aIndex)
|
||||
{
|
||||
NS_ASSERTION (aIndex < mArgc, "aIndex out of range");
|
||||
|
||||
return (sqlite3_value_type (mArgv[aIndex]) == SQLITE_NULL);
|
||||
}
|
||||
|
||||
/***
|
||||
*** mozStorageDataSet
|
||||
***/
|
||||
|
||||
NS_IMPL_ISUPPORTS1(mozStorageDataSet, mozIStorageDataSet)
|
||||
|
||||
mozStorageDataSet::mozStorageDataSet(nsIArray *aRows)
|
||||
: mRows(aRows)
|
||||
{
|
||||
}
|
||||
|
||||
mozStorageDataSet::~mozStorageDataSet()
|
||||
{
|
||||
}
|
||||
|
||||
/* readonly attribute nsIArray dataRows; */
|
||||
NS_IMETHODIMP
|
||||
mozStorageDataSet::GetDataRows(nsIArray **aDataRows)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
/* nsISimpleEnumerator getRowEnumerator (); */
|
||||
NS_IMETHODIMP
|
||||
mozStorageDataSet::GetRowEnumerator(nsISimpleEnumerator **_retval)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Oracle Corporation code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Oracle Corporation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef _MOZSTORAGEVALUEARRAY_H_
|
||||
#define _MOZSTORAGEVALUEARRAY_H_
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
#include "mozIStorageValueArray.h"
|
||||
#include "mozIStorageDataSet.h"
|
||||
|
||||
#include "nsIArray.h"
|
||||
|
||||
#include <sqlite3.h>
|
||||
|
||||
class nsIArray;
|
||||
|
||||
class mozStorageStatementRowValueArray : public mozIStorageValueArray
|
||||
{
|
||||
public:
|
||||
mozStorageStatementRowValueArray (sqlite3_stmt *aSqliteStmt);
|
||||
~mozStorageStatementRowValueArray();
|
||||
|
||||
// interfaces
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_MOZISTORAGEVALUEARRAY
|
||||
|
||||
private:
|
||||
sqlite3_stmt *mSqliteStatement;
|
||||
PRUint32 mNumColumns;
|
||||
};
|
||||
|
||||
class mozStorageArgvValueArray : public mozIStorageValueArray
|
||||
{
|
||||
public:
|
||||
mozStorageArgvValueArray (PRInt32 aArgc, sqlite3_value **aArgv);
|
||||
~mozStorageArgvValueArray();
|
||||
|
||||
// interfaces
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_MOZISTORAGEVALUEARRAY
|
||||
|
||||
private:
|
||||
PRUint32 mArgc;
|
||||
sqlite3_value **mArgv;
|
||||
};
|
||||
|
||||
class mozStorageDataSet : public mozIStorageDataSet
|
||||
{
|
||||
public:
|
||||
mozStorageDataSet (nsIArray *aRows);
|
||||
~mozStorageDataSet();
|
||||
|
||||
// interfaces
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_MOZISTORAGEDATASET
|
||||
|
||||
protected:
|
||||
nsCOMPtr<nsIArray> mRows;
|
||||
};
|
||||
|
||||
#endif /* _MOZSTORAGEVALUEARRAY_H_ */
|
|
@ -0,0 +1,59 @@
|
|||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Oracle Corporation
|
||||
# Portions created by the Initial Developer are Copyright (C) 2004
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Vladimir Vukicevic <vladimir.vukicevic@oracle.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
PROGRAM = teststorage1$(BIN_SUFFIX)
|
||||
CPPSRCS = storage1.cpp
|
||||
REQUIRES = \
|
||||
xpcom \
|
||||
string \
|
||||
storage \
|
||||
storagecomps \
|
||||
$(NULL)
|
||||
|
||||
LIBS = \
|
||||
$(LIBS_DIR) \
|
||||
$(XPCOM_LIBS) \
|
||||
$(NSPR_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
|
@ -0,0 +1,135 @@
|
|||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsISimpleEnumerator.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsString.h"
|
||||
#include "nsILocalFile.h"
|
||||
|
||||
#include "mozIStorageService.h"
|
||||
#include "mozIStorageConnection.h"
|
||||
#include "mozIStorageValue.h"
|
||||
#include "mozIStorageStatement.h"
|
||||
#include "mozIStorageFunction.h"
|
||||
|
||||
#include "mozStorageCID.h"
|
||||
|
||||
static NS_DEFINE_CID(kmozStorageServiceCID, MOZ_STORAGE_SERVICE_CID);
|
||||
static NS_DEFINE_CID(kmozStorageConnectionCID, MOZ_STORAGE_CONNECTION_CID);
|
||||
|
||||
#define TEST_CHECK_ERROR(rv) \
|
||||
do { if (NS_FAILED(rv)) { \
|
||||
dbConn->GetLastError(&gerr); \
|
||||
dbConn->GetLastErrorString(gerrstr); \
|
||||
fprintf (stderr, "Error: %d 0x%08x %s\n", gerr, gerr, gerrstr.get()); \
|
||||
return 0; \
|
||||
} } while (0)
|
||||
|
||||
int gerr;
|
||||
nsCString gerrstr;
|
||||
|
||||
class TestFunc : public mozIStorageFunction {
|
||||
public:
|
||||
TestFunc() { }
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_MOZISTORAGEFUNCTION
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS1(TestFunc, mozIStorageFunction)
|
||||
|
||||
NS_IMETHODIMP
|
||||
TestFunc::OnFunctionCall (mozIStorageValueArray *sva)
|
||||
{
|
||||
fprintf (stderr, "* function call!\n");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
NS_InitXPCOM2(nsnull, nsnull, nsnull);
|
||||
|
||||
nsCOMPtr<mozIStorageService> dbSrv;
|
||||
dbSrv = do_GetService(kmozStorageServiceCID, &rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsILocalFile> f;
|
||||
rv = NS_NewNativeLocalFile (NS_LITERAL_CSTRING("foo.sdb"), PR_FALSE, getter_AddRefs(f));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<mozIStorageConnection> dbConn;
|
||||
rv = dbSrv->OpenDatabase(f, getter_AddRefs(dbConn));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = dbConn->CreateFunction("x_test", -1, new TestFunc());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = dbConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING("SELECT x_test(1)"));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = dbConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING("DROP TABLE foo"));
|
||||
// TEST_CHECK_ERROR(rv);
|
||||
|
||||
rv = dbConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING("CREATE TABLE foo (i INTEGER)"));
|
||||
TEST_CHECK_ERROR(rv);
|
||||
|
||||
nsCOMPtr<mozIStorageStatement> dbFooInsertStatement;
|
||||
rv = dbConn->CreateStatement (NS_LITERAL_CSTRING("INSERT INTO foo VALUES ( ?1 )"), getter_AddRefs(dbFooInsertStatement));
|
||||
TEST_CHECK_ERROR(rv);
|
||||
|
||||
nsCOMPtr<mozIStorageStatement> dbFooSelectStatement;
|
||||
rv = dbConn->CreateStatement (NS_LITERAL_CSTRING("SELECT i FROM foo"), getter_AddRefs(dbFooSelectStatement));
|
||||
TEST_CHECK_ERROR(rv);
|
||||
|
||||
rv = dbConn->CreateTrigger("foo_trig", mozIStorageConnection::TRIGGER_EVENT_INSERT,
|
||||
"foo", "x_test", "1");
|
||||
TEST_CHECK_ERROR(rv);
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
rv = dbFooInsertStatement->BindInt32Parameter (0, i);
|
||||
TEST_CHECK_ERROR(rv);
|
||||
|
||||
rv = dbFooInsertStatement->Execute ();
|
||||
TEST_CHECK_ERROR(rv);
|
||||
}
|
||||
|
||||
fprintf (stderr, "10 values written to foo...\n");
|
||||
|
||||
nsCOMPtr<mozIStorageValueArray> dbRow = do_QueryInterface(dbFooSelectStatement);
|
||||
PRBool hasMore = PR_FALSE;
|
||||
|
||||
while ((dbFooSelectStatement->ExecuteStep(&hasMore) == NS_OK) && hasMore)
|
||||
{
|
||||
PRUint32 len;
|
||||
|
||||
dbRow->GetNumColumns (&len);
|
||||
fprintf (stderr, "Row[length %d]: %d '%s'\n", len, dbRow->AsInt32(0), dbRow->AsSharedCString(0, 0));
|
||||
}
|
||||
|
||||
TEST_CHECK_ERROR(rv);
|
||||
fprintf (stderr, "Done. %d 0x%08x %p\n", rv, rv, dbRow.get());
|
||||
|
||||
#if 0
|
||||
// try an enumerator
|
||||
fprintf (stderr, "Trying via an enumerator\n");
|
||||
|
||||
nsCOMPtr<nsISimpleEnumerator> dbEnum;
|
||||
|
||||
(void) dbFooSelectStatement->Reset ();
|
||||
rv = dbFooSelectStatement->ExecuteEnumerator (getter_AddRefs(dbEnum));
|
||||
TEST_CHECK_ERROR(rv);
|
||||
|
||||
PRBool b;
|
||||
while ((dbEnum->HasMoreElements(&b) == NS_OK) && b) {
|
||||
dbEnum->GetNext (getter_AddRefs (dbRow));
|
||||
PRUint32 len;
|
||||
dbRow->GetLength (&len);
|
||||
fprintf (stderr, "Row[length %d]: %d '%s'\n", len, dbRow->AsInt32(0), dbRow->AsSharedCString(0, 0));
|
||||
}
|
||||
#endif
|
||||
}
|
Загрузка…
Ссылка в новой задаче