<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2003/XInclude" type="topic" id="databases" xml:lang="es">

  <info>
    <link type="guide" xref="index#specific-how-tos"/>

    <credit type="author copyright">
      <name>Philip Withnall</name>
      <email its:translate="no">philip.withnall@collabora.co.uk</email>
      <years>2015</years>
    </credit>

    <include xmlns="http://www.w3.org/2001/XInclude" href="cc-by-sa-3-0.xml"/>

    <desc>Simple persistent object stores</desc>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Daniel Mustieles</mal:name>
      <mal:email>daniel.mustieles@gmail.com</mal:email>
      <mal:years>2016-2020</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Javier Mazorra</mal:name>
      <mal:email>mazi.debian@gmail.com</mal:email>
      <mal:years>2016, 2020</mal:years>
    </mal:credit>
  </info>

  <title>Bases de datos</title>

  <synopsis>
    <title>Resumen</title>

    <list>
      <item><p>
        Use databases for appropriate use cases: not configuration data (use
        GSettings). (<link xref="#when-to-use-databases"/>)
      </p></item>
      <item><p>
        Choose between GOM and GVDB based on whether indexing is required.
        (<link xref="#when-to-use-databases"/>)
      </p></item>
      <item><p>
        Consider your vacuuming policy before committing to using GOM.
        (<link xref="#when-to-use-databases"/>)
      </p></item>
      <item><p>
        Avoid SQL injection vulnerabilities by using prepared statements.
        (<link xref="#sql-injection"/>)
      </p></item>
    </list>
  </synopsis>

  <section id="when-to-use-databases">
    <title>Cuándo usar bases de datos</title>

    <p>Los datos de configuración deben almacenarse en <link href="https://developer.gnome.org/gio/stable/GSettings.html"> GSettings </link>. Como regla general, si algunos datos deben ser persistentes y afectan el comportamiento de una aplicación, son datos de configuración. Si podría estar sujeto a políticas impuestas por el administrador del sistema (como la configuración de proxy o de bloqueo), son datos de configuración. Si contiene contenido creado por el usuario, no son datos de configuración y no deben almacenarse en GSettings.</p>

    <p>
      For such situations where user data is highly structured, storing it in a
      database is sensible. There are two main databases suggested for use
      within GNOME: GOM and GVDB. GOM is a wrapper around SQLite, and hence
      implements indexing of fields and SQL-style queries. GVDB is a much
      simpler object store, supporting fast serialization of a dictionary of
      objects to disk.
    </p>

    <p>GOM debe usarse si necesita funciones avanzadas, especialmente indexación. En otros casos debe usarse GVDB.</p>

    <p>
      Before deciding to use GOM (and hence SQLite), you must consider a
      vacuuming policy for the database, and whether your use case will interact
      well with SQLite’s vacuuming system. Vacuuming is effectively SQLite’s
      term for defragmenting the database — if a database is not vacuumed
      appropriately, performance will degrade and the database size will
      increase indefinitely. Read
      <link href="http://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/">this
      article</link> on vacuuming for more information; please consider it
      before choosing to use GOM.
    </p>

    <p>
      GNOME has another database library: GNOME Data Access (GDA). This is
      targeted at abstracting access to various types of relational database,
      for use in a database utility program or office program, for example. It
      is not suitable for storing
      <link href="https://developer.gnome.org/gio/stable/GSettings.html">user
      settings</link>.
    </p>
  </section>

  <section id="gom">
    <title>Usar GOM</title>

    <p>
      Providing a GOM tutorial is beyond the scope of this document, but a
      <link href="https://developer.gnome.org/gom/">reference manual is
      available</link>.
    </p>

    <section id="sql-injection">
      <title>Inyección SQL</title>

      <p>
        GOM does allow access to the lower level SQLite query APIs. When using
        them, queries <em style="strong">must</em> be constructed using
        SQLite’s <link href="https://www.sqlite.org/c3ref/stmt.html">prepared
        statement</link> and
        <link href="https://www.sqlite.org/c3ref/bind_blob.html">value
        binding</link> API, rather than by constructing SQL strings then passing
        them to SQLite to parse. Constructing strings makes
        <link href="https://en.wikipedia.org/wiki/SQL_injection">SQL
        injection</link> vulnerabilities very likely, which can give attackers
        access to arbitrary user data from the database.
      </p>
    </section>
  </section>

  <section id="gvdb">
    <title>Usar GVDB</title>

    <p>
      GVDB has a simple API which mirrors a conventional hash table. Presently,
      GVDB is only available as a copy-and-paste library; fetch the most recent
      copy of the code from
      <link href="https://gitlab.gnome.org/GNOME/gvdb">GVDB git</link> and copy
      it into your project. It is licensed under LGPLv2.1+.
    </p>

    <p>Un manual completo de GVDB está fuera del alcance de este documento.</p>
  </section>
</page>
