dbExpress | Andreano Lanusse | Technology and Software Development Where Andreano Lanusse talk about technology, software development, programming techniques, databases, games and more through articles, tutorials and videos Mon, 12 Aug 2019 04:35:13 +0000 en hourly 1 https://wordpress.org/?v=6.7.4 CopyReaderToClientDataSet after XE2 – Where are you? http://www.andreanolanusse.com/en/copyreadertoclientdataset-xe2/ http://www.andreanolanusse.com/en/copyreadertoclientdataset-xe2/#comments Sun, 23 Feb 2014 20:53:14 +0000 http://www.andreanolanusse.com/en/?p=958 CopyReaderToClientDataSet copies the contents of a TDBXReader into a TClientDataSet instance. It returns the same TClientDataSet instance that was passed to this method. CopyReaderToClientDataSet is part of the Data.DBXDBReaders.TDBXDataSetReader class until Delphi/C++Builder XE2, however in XE3 it changed a little bit, it became part of a new class called Data.DBXCDSReaders.TDBXClientDataSetReader. I got several e-mails from my blog readers that downloaded some of my […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
CopyReaderToClientDataSet copies the contents of a TDBXReader into a TClientDataSet instance. It returns the same TClientDataSet instance that was passed to this method.

CopyReaderToClientDataSet is part of the Data.DBXDBReaders.TDBXDataSetReader class until Delphi/C++Builder XE2, however in XE3 it changed a little bit, it became part of a new class called Data.DBXCDSReaders.TDBXClientDataSetReader.

I got several e-mails from my blog readers that downloaded some of my examples, when compiling with latest versions they got a error message saying the CopyReaderToClientDataSet method can’t be found.

The solution is simple, add Data.DBXCDSReaders.pas as part of the uses clause and replace all the TDBXDataSetReader by TDBXClientDataSetReader, which is the new home for CopyReaderToClientDataSet.

Enjoy!!!

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/copyreadertoclientdataset-xe2/feed/ 1
Controversial changes in the EULA for Delphi XE3 and C++Builder XE3 http://www.andreanolanusse.com/en/controversial-changes-in-the-eula-for-delphi-xe3-and-cbuilder-xe3/ http://www.andreanolanusse.com/en/controversial-changes-in-the-eula-for-delphi-xe3-and-cbuilder-xe3/#comments Wed, 29 Aug 2012 08:16:09 +0000 http://www.andreanolanusse.com/en/?p=857 As everybody knows Delphi XE3 will be released soon, some previews have been already published and there are some controversial topics around XEe, mostly because of leaks from people that clearly violated the NDA and this is shameful. The biggest controversy is the new license agreement (EULA) that leaked this week, where new users can […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
As everybody knows Delphi XE3 will be released soon, some previews have been already published and there are some controversial topics around XEe, mostly because of leaks from people that clearly violated the NDA and this is shameful.

The biggest controversy is the new license agreement (EULA) that leaked this week, where new users can only use the Delphi Professional Edition to access local database, either with the Delphi components or third parties, to develop applications Client/Server applications new users will have to use Enterprise edition or higher, or by the Client/Server Addon for Professional Edition. If you own a license from Delphi 1 to Delphi XE2 you will not be affected by this new restriction.

Here what the EULA said:

. the use of data access technologies for client/server
connectivity will no longer be allowed in the Professional edition.
This includes both Embarcadero and 3rd party solutions. Professional
users may only, legally, access local databases with their applications.

Users who want to use client/server database access can purchase a
Client/Server Add-On Pack for their Professional edition or purchase
an Enterprise, Ultimate or Architect edition product.

This restriction if for new licenses only. Users upgrading to XE3
will be “grandfathered” in that they will be able to continue to use
3rd party data access technologies for client/server database access
in version XE3 ..

 

Embarcadero haven’t official released the product and there are some open questions about the definition of new users. Here an example, let’s say you own a Delphi 2006 Professional today and want to upgrade to XE3 Professional, in this case you ARE NOT elegible for upgrade because you DON’T own one of the last 3 Delphi version, so you will have to buy a new license (“new user”). Based on this example and the new EULA, here come the question are you considered a “new user” or “upgraded user”? This is just one of many situations I can think right now and will beed to be clarified.

Besides all of this, the third party vendors (Embarcadero Technology Partners) certainly will be affected by this new restriction, we have today several third party providing database access technology to access Oracle, SQL Server, DB2, etc., and mostly used by developers that own Delphi Professional licenses.

The controversy is gigantic, Embarcadero’s forum has more them 300 replies in a single thread, several other blogs about the topic with lot’s of comments.

At least I can see some positive thing on all of this, Embarcadero now knows what many Delphi developers are thinking about this change and can start measuring the impact before release XE3 or make changes before the official announcement.

What are your thoughts on that?

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/controversial-changes-in-the-eula-for-delphi-xe3-and-cbuilder-xe3/feed/ 17
Using dbExpress Framework on Windows and Mac with C++Builder http://www.andreanolanusse.com/en/using-dbexpress-framework-on-windows-and-mac-with-cbuilder/ http://www.andreanolanusse.com/en/using-dbexpress-framework-on-windows-and-mac-with-cbuilder/#comments Fri, 06 Jan 2012 10:33:58 +0000 http://www.andreanolanusse.com/en/?p=763 During the following weeks I’m writing a series of C++ examples to demonstrate the use of VCL, FireMonkey, RTL, dbExpress, and others stuff. Each example will have a major focus, but you will be able to learn other stuffs as well. If there is something specific on C++ you would like to see, please let […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
During the following weeks I’m writing a series of C++ examples to demonstrate the use of VCL, FireMonkey, RTL, dbExpress, and others stuff. Each example will have a major focus, but you will be able to learn other stuffs as well. If there is something specific on C++ you would like to see, please let me know and I will do my best to bring that in one of my following posts.

In this first post I demonstrate how to use dbExpress Framework to run SQL’s against your database. Since I want to run the application on Windows and Mac, the console application will target FireMonkey.

The Console Application Wizard for C++ has been updated in C++Builder XE2, adding a Target Framework Option as you can see below.

The following code shows how to connect to an InterBase database, execute a SELECT SQL against the COUNTRY table, and display the results, of course you can use dbExpress Framework to run queries against any database supported by dbExpress, just remember that some dbExpress drivers are not available on Mac in XE2, for example SQL Server and ODBC drivers.

If you are C++ developer you will understand pretty quickly the following code, which has some comments to help you to understand the code.

#include <fmx.h>

#pragma hdrstop
#pragma argsused

#include <tchar.h>
#include <stdio.h>
#include <System.SysUtils.hpp>
#include <Data.DBXDynalink.hpp>
#include <Data.DBXCommon.hpp>
#include <Data.DBXInterbase.hpp>
#include <memory>

int _tmain(int argc, _TCHAR* argv[]) {

	// Get database connection instance
	std::auto_ptr<TDBXConnection>conn
		(TDBXConnectionFactory::GetConnectionFactory()->GetConnection
		("EMPLOYEE", "sysdba", "masterkey"));

	if (conn.get() != NULL) {

		printf("================= Connection Properties ============\n");

		AnsiString s = conn->ConnectionProperties->Properties->Text + "\n";
		printf(s.c_str());

		// create command and transaction objects to execute the query
		std::auto_ptr<TDBXCommand>command(conn->CreateCommand());

                // initiate a transaction
		TDBXTransaction *transaction =
			conn->BeginTransaction(TDBXIsolations::ReadCommitted);

		command->Text = "SELECT * FROM Country";
		command->Prepare();

		// execute the query and get the cursor (DBXReader)
		std::auto_ptr<TDBXReader>reader(command->ExecuteQuery());

		// print number of columns and each record
		printf(AnsiString("Number of Columns:" + IntToStr(reader->ColumnCount) +
			"\n").c_str());

		// display the list of records
		while (reader->Next()) {
			printf((reader->Value[reader->GetOrdinal("COUNTRY")]->GetAnsiString
				() + "\n").c_str());
		}

		printf("====================================================\n");

		conn->CommitFreeAndNil(transaction);
	}

	Sleep(5000);
	return 0;
}

Before you run this code, make sure you have the dbExpress alias EMPLOYEE setup to connect into the EMPLOYEE.GDB database and the InterBase client installed, if everything is ok just compile and run the program on Windows and Mac, the following image shows this application running on Mac.

There are few things you need to be aware when deploying and running this kind of application on Mac; on my following post I will explain everything about that.

For now we’ve learned how to use DBX Framework and make the application to compile and run on Windows and Mac.

You can download the source code from here or just update your local RAD Studio XE2 samples folder from our RAD Studio SVN repository.

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/using-dbexpress-framework-on-windows-and-mac-with-cbuilder/feed/ 2
CopyReaderToClientDataSet, Blob and the message “Feature not implemented” http://www.andreanolanusse.com/en/copyreadertoclientdataset-blob-and-the-message-feature-not-implemented/ http://www.andreanolanusse.com/en/copyreadertoclientdataset-blob-and-the-message-feature-not-implemented/#comments Fri, 04 Nov 2011 00:25:18 +0000 http://www.andreanolanusse.com/en/?p=729 If you have used the method TDBXDataSetReader.CopyReaderToClientDataSet, you probably came across with the message “Feature not implemented”, this exception occurs because the method CopyReaderToClientDataSet can’t copy Blob fields from the DBXReader to the ClientDataSet. This is no longer a problem, Delphi XE2 Update 2 changed this behavior and now supports Blob text fields when using the CopyReaderToClientDataSet […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
If you have used the method TDBXDataSetReader.CopyReaderToClientDataSet, you probably came across with the message “Feature not implemented”, this exception occurs because the method CopyReaderToClientDataSet can’t copy Blob fields from the DBXReader to the ClientDataSet.

This is no longer a problem, Delphi XE2 Update 2 changed this behavior and now supports Blob text fields when using the CopyReaderToClientDataSet method. The Blog binary support is not implemented yet.

To learn how to use the method CopyReaderToClientDataSet read the article “Copying data from ClientDataSet to DBXReader

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/copyreadertoclientdataset-blob-and-the-message-feature-not-implemented/feed/ 2
Connecting to PostgreSQL through dbExpress ODBC driver http://www.andreanolanusse.com/en/connecting-to-postgresql-through-dbexpress-odbc-driver/ http://www.andreanolanusse.com/en/connecting-to-postgresql-through-dbexpress-odbc-driver/#comments Wed, 02 Nov 2011 07:30:27 +0000 http://www.andreanolanusse.com/en/?p=723 Delphi XE2 and C + + Builder XE2  introduce the new dbExpress ODBC driver, which enable FireMonkey and VCL applications to connect to any database that provides a ODBC driver. In order to show how it works, I created a FireMonkey project sample that connect to a PostgreSQL database. As first step, you must install the PostgreSQL ODBC driver […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
Delphi XE2 and C + + Builder XE2  introduce the new dbExpress ODBC driver, which enable FireMonkey and VCL applications to connect to any database that provides a ODBC driver.

In order to show how it works, I created a FireMonkey project sample that connect to a PostgreSQL database.

As first step, you must install the PostgreSQL ODBC driver on the machine that will run the application. Second, applications compiled as 32-bit, requires the 32-bit ODBC driver, 64-bit applications will require the 64-bit ODBC driver.

Onde installed the driver, create and configure a User DSN or System DSN on the ODBC Data Source Administrator (odbcad32.exe):

Instructions for windows 64-bit

  • For 32-bit applications use c:\Windows\SysWOW64\odbcad32.exe
  • For 64-bit applications use o c:\Windows\system32\odbcad32.exe

Instructions for windows 32-bit

  • Use  c:\Windows\system32\odbcad32.exe

The next step is to create an dbExpress ODBC alias on Data Explorer, where the Database Name parameter is the name of the Data Source created earlier, in my example the Data Source is called PostgreSQL35W. The database, username and password was already defined in the Data Source, but you can override the username and password parameters through the SQLConnection.

Assuming you already know how to use the SQLConnection, DataSetProvider and ClientDataSet or SimpleDataSet ,and DataSource components, just connect all  the components as you usually do. The SQLConnection will look like this:

  object SQLConnection1: TSQLConnection
    ConnectionName = 'PostgreSQLOdbc'
    DriverName = 'ODBC'
    LoginPrompt = False
    Params.Strings = (
      'drivername=ODBC'
      'Database=PostgreSQL35W')
  end

You can use the dbExpress framework when connected to a database through dbExpress ODBC driver. In XE2 the ODBC driver is compatible with Windows, we are evaluating the possibility to support this driver on Mac.

The figure below shows the FireMonkey application connected to PostgreSQL via dbExpress ODBC driver. Now you can connect to any other other database not supported natively by dbExpress.

Download the source code here.

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/connecting-to-postgresql-through-dbexpress-odbc-driver/feed/ 9
Copying data from ClientDataSet to DBXReader http://www.andreanolanusse.com/en/copying-data-from-clientdataset-to-dbxreader/ http://www.andreanolanusse.com/en/copying-data-from-clientdataset-to-dbxreader/#comments Tue, 22 Feb 2011 00:50:05 +0000 http://www.andreanolanusse.com/en/?p=493 You probably already read my post Copying data from DBXReader to ClientDataSet, now is time to learn how copy data from ClientDataSet to DBXReader using Delphi or C++Builder. There are many situations where you will need to copy data between ClientDataSet and DBXReader, specially if you are looking to cache data on DataSnap Servers, I’m […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
You probably already read my post Copying data from DBXReader to ClientDataSet, now is time to learn how copy data from ClientDataSet to DBXReader using Delphi or C++Builder.

There are many situations where you will need to copy data between ClientDataSet and DBXReader, specially if you are looking to cache data on DataSnap Servers, I’m preparing a new blog post about that and will publish soon.

The DBXDBReaders unit is part of DBX Framework and contain the TDBXDataSetReader class which is a TDBXReader implementation of TDataSet, in other words using this class you will get a DBXReader representation of any DataSet.

You just need to create a instance of TDBXDataSetReader passing the ClientDataSet and the InstanceOwner (true/false). If InstanceOwner is true, the TDataSet instance is freed when the TDBXDataSetReader instance is freed.

Delphi

  
 TDBXDataSetReader.Create(ClientDataSet, False (* InstanceOwner *) )

C++Builder

  
 TDBXDataSetReader->Create(ClientDataSet, False )

TDBXDataSetReader class is compatible with DataSnap 2010 and XE.

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/copying-data-from-clientdataset-to-dbxreader/feed/ 15
Parameterized queries with dbExpress (DBX) Framework http://www.andreanolanusse.com/en/parameterized-queries-with-dbexpress-dbx-framework/ http://www.andreanolanusse.com/en/parameterized-queries-with-dbexpress-dbx-framework/#comments Tue, 25 May 2010 20:27:24 +0000 http://www.andreanolanusse.com/en/?p=308 In order to answer a question from two Brazilian developers about how to use parameterized queries using dbExpress Framework I decided to write this post. Let start understanding the small difference between parameterized queries using DBX Framework and VCL. While VCL uses “:PARAMETER” to define query parameters, DBX Framework represent parameter as “?”, and it […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
In order to answer a question from two Brazilian developers about how to use parameterized queries using dbExpress Framework I decided to write this post.

Let start understanding the small difference between parameterized queries using DBX Framework and VCL. While VCL uses “:PARAMETER” to define query parameters, DBX Framework represent parameter as “?”, and it doesn’t include name.

We have been using VCL for a long time and are accustomed to read and write our code based on DataSet parameters. When you start using the DBX Framework you expect it to work in a very similar way, but the framework has some differences. The Delphi language allow us to extend the framework and it would became more VCL friendly.

In case you use only what you have in the DBX Framework, your code will look like this:

program DBX4Example;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  DBXDynalink,
  DBXCommon,
  DBXInterbase;

var

  aDBXConn: TDBXConnection;
  aDBXTrans : TDBXTransaction;
  aCmnd: TDBXCommand;
  aReader: TDBXReader;

begin

    aDBXConn := TDBXConnectionFactory.GetConnectionFactory.GetConnection('employee ib','sysdba','masterkey');

    if aDBXConn <> nil then
    begin

      aCmnd := aDBXConn.CreateCommand;

      // Start transaction
      aDBXTrans:= aDBXConn.BeginTransaction(TDBXIsolations.ReadCommitted);

      // Prepare and execute the SQL Statement
      aCmnd.Text := 'SELECT * FROM Country  Where Country = ?';
      aCmnd.Prepare;
      aCmnd.Parameters.Parameter[0].Value.SetAnsiString('USA');
      aReader := aCmnd.ExecuteQuery;

      while aReader.Next do
      begin
        Writeln( aReader.Value['Country'].GetAnsiString );
      end;

      // Commit transaction
      aDBXConn.CommitFreeAndNil(aDBXTrans);

      Readln;
      aReader.Free;
      aCmnd.Free;
      aDbxConn.Free;
    end;
end.

Note that in the SQL we use question mark to define the parameter, prepare the query and follow the long line to define the parameter value at position zero.

We can make this code more VCL friendly using Class Helpers, one of the new features implemented in Delphi 2006. It will allow us to extend the class without inheriting from it.

So we’ll extend the class TDBXParameterList, which will allow us to name the parameters and set their values by name.

The follow code extend the class through class helpers, look this is not inherited. This extension define two new methods:
SetParametersName: this method will receive a list of names, which will be used to name the parameters, you must pass a number of names equal to the number of parameters;
ByName: method that allows us to access parameters by name, the DBX Framework has the method GetOrdinal, it allow us to access parameters by name, but byName will be more VCL friendly;

unit DBXParameterListHelper;

interface

uses
  DBXCommon, SysUtils;

type
  TDBXParameterListHelper = class helper for TDBXParameterList

  public
    procedure SetParamatersName(aNames: Array of String);
    function ByName( Name : String ) : TDBXWritableValue;
  end;

implementation

{ TDBXParameterListHelper }

function TDBXParameterListHelper.ByName(Name: String): TDBXWritableValue;
begin
  Result := Self.Parameter[Self.GetOrdinal(Name)].Value;
end;

procedure TDBXParameterListHelper.SetParamatersName(aNames: array of String);
var
  i: Integer;
begin

  if Length(aNames) <> Self.Count then
     raise Exception.Create('aNames should have the same number of parameters');

  for i := 0 to Self.Count - 1 do
  begin
    Self[i].Name := aNames[i];
  end;
end;

end.

Using the extension this part of the code:

      // Prepare and execute the SQL Statement
      aCmnd.Text := 'SELECT * FROM Country  Where Country = ?';
      aCmnd.Prepare;
      aCmnd.Parameters.Parameter[0].Value.SetAnsiString('USA');

Will be replaced by this one.

      // Prepare and execute the SQL Statement
      aCmnd.Text := 'SELECT * FROM Country  Where Country = ?';
      aCmnd.Prepare;
      aCmnd.Parameters.SetParamatersName(['COUNTRYNAME']);
      aCmnd.Parameters.ByName('COUNTRYNAME').SetAnsiString('USA');

In case your query has multiple parameteres, like this:

      // Prepare and execute the SQL Statement
      aCmnd.Text := 'SELECT * FROM Country  Where Country = ? and Currency = ?';
      aCmnd.Prepare;
      aCmnd.Parameters.SetParamatersName(['COUNTRYNAME', 'CURRENCY']);
      aCmnd.Parameters.ByName('COUNTRYNAME').SetAnsiString('USA');
      aCmnd.Parameters.ByName('CURRENCY').SetAnsiString('Dolar');

In closing, we’ve learned how to work with query parameters in DBX Framework and how to use class helper to extend our classes.

Source code download, available here.

COUNTRYNAME

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/parameterized-queries-with-dbexpress-dbx-framework/feed/ 7
Copying data from DBXReader to ClientDataSet http://www.andreanolanusse.com/en/copying-dbxreader-to-clientdataset-datasnap-2010/ http://www.andreanolanusse.com/en/copying-dbxreader-to-clientdataset-datasnap-2010/#comments Sat, 24 Apr 2010 23:55:01 +0000 http://www.andreanolanusse.com/en/?p=305 If you are using DataSnap 2010/XE for sure use DBXFramework, which I strong recommend for operations where you don’t use Data Aware components or bi-directional datasets. There are situations where you will need to copy data from DBXReader to TClientDataSet or TParams, for this kind of situation Delphi has the unit DBXDBReaders.pas, which contain some […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
If you are using DataSnap 2010/XE for sure use DBXFramework, which I strong recommend for operations where you don’t use Data Aware components or bi-directional datasets.

There are situations where you will need to copy data from DBXReader to TClientDataSet or TParams, for this kind of situation Delphi has the unit DBXDBReaders.pas, which contain some classes that allow this kind of operation.

The TDBXDataSetReader class contain the method CopyReaderToClientDataSet, on this method you pass the DBXReader that contain the data to copy to the ClientDataSet, which is the second parameter, the follow code demonstrate that:

var
  Reader: TDBXReader;
  DepClient: TDepartmentClient;
begin
  DepClient := TDepartmentClient.Create(DMClientContainer.MyDSServer.DBXConnection, False);

  try
    Reader := DepClient.GetDepartmentsOrderBy;

    try
      if Assigned(Reader) then
      begin
        TDBXDataSetReader.CopyReaderToClientDataSet(Reader, DMClientContainer.CDSCopy);
      end;
    finally
      FreeAndNil(Reader);
    end;

  finally
    DepClient.Free;
  end;

The ClientDataSet CDSCopy already exist and is part of the DataModule DMClientContainer. if you don’t have a ClientDataSet created, use the method TDBXDataSetReader.ToClientDataSet, it wil return a new ClientDataSet.

My DataSnap 2010 samples was updated and you can download from here

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/copying-dbxreader-to-clientdataset-datasnap-2010/feed/ 3
Video: New dbExpress driver for Firebird in Delphi 2010 and C++Builder 2010 http://www.andreanolanusse.com/en/new-dbexpress-driver-for-firebird-in-delphi-2010-and-cbuilder-2010/ http://www.andreanolanusse.com/en/new-dbexpress-driver-for-firebird-in-delphi-2010-and-cbuilder-2010/#respond Tue, 18 Aug 2009 08:30:43 +0000 http://www.andreanolanusse.com/en/?p=35 Ok, the Firebird community asked for and now they have in RAD Studio 2010 a new dbExpress driver for Firebird, full support including the dbExpress framework, check this video out. For more information about RAD Studio 2010 click here Also I recommend you to watch the new sneak peek video about other new database features […]

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
dbExpress driver for FirebirdOk, the Firebird community asked for and now they have in RAD Studio 2010 a new dbExpress driver for Firebird, full support including the dbExpress framework, check this video out.

For more information about RAD Studio 2010 click here

Also I recommend you to watch the new sneak peek video about other new database features and DataSnap 2010.

Andreano Lanusse | Technology and Software Development Follow me on Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/en/new-dbexpress-driver-for-firebird-in-delphi-2010-and-cbuilder-2010/feed/ 0