RetroArch/libretro-db
2020-07-05 04:21:27 +02:00
..
lua
.gitignore
bintree.c (libretro-db) Avoid callocs when possible 2020-06-26 20:24:05 +02:00
bintree.h
c_converter_test.sh
c_converter.c
dat_converter
libretrodb_tool.c (libretro-db) Avoid callocs when possible 2020-06-26 20:24:05 +02:00
libretrodb.c (libretro-db) Avoid callocs when possible 2020-06-26 20:24:05 +02:00
libretrodb.h
Makefile Fix rtime in db-converter compilation 2020-06-20 17:15:07 -04:00
query.c (query.c) Cleanups 2020-07-05 04:21:27 +02:00
query.h
README.md
rmsgpack_dom.c (libretro-db) Add TODO/FIXME notes 2020-06-05 18:13:25 +02:00
rmsgpack_dom.h
rmsgpack_test.c
rmsgpack.c
rmsgpack.h

libretrodb

A small read only database Mainly to be used by retroarch

Usage

Files specified later in the chain will override earlier ones if the same key exists multiple times.

  • To list out the content of a db libretrodb_tool <db file> list
  • To create an index libretrodb_tool <db file> create-index <index name> <field name>
  • To find an entry with an index libretrodb_tool <db file> find <index name> <value>

Compiling a single DAT into a single RDB with c_converter

git clone https://github.com/libretro/libretro-super.git
cd libretro-super
./libretro-fetch.sh retroarch
cd retroarch
./configure
cd libretro-db
c_converter "NAME_OF_RDB_FILE.rdb" "NAME_OF_SOURCE_DAT.dat"

Compiling multiple DATs into a single RDB with c_converter

Specify rom.crc as the second parameter to use CRC as the unique fingerprint.

git clone https://github.com/libretro/libretro-super.git
cd libretro-super
./libretro-fetch.sh retroarch
cd retroarch
./configure
cd libretro-db
c_converter "NAME_OF_RDB_FILE.rdb" "rom.crc" "NAME_OF_SOURCE_DAT_1.dat" "NAME_OF_SOURCE_DAT_2.dat" "NAME_OF_SOURCE_DAT_3.dat"

Compiling all RDBs with libretro-build-database.sh

This approach builds and uses the c_converter program to compile the databases

git clone https://github.com/libretro/libretro-super.git
cd libretro-super
./libretro-fetch.sh retroarch
./libretro-build-database.sh

Lua DAT file converter

To convert a dat file use:

dat_converter <db file> <dat file>

If you want to merge multiple dat files you need to run:

dat_converter <db file> <match key> <dat file> ...

for example:

dat_converter snes.rdb rom.crc snes1.dat snes2.dat

Query examples

Some examples of queries you can use with libretrodbtool:

  1. Glob pattern matching Usecase : Search for all games starting with 'Street Fighter' in the 'name' field (glob pattern matching)

libretrodb_tool <db file> find "{'name':glob('Street Fighter*')}"

  1. Combined number matching query Usecase: Search for all games released on October 1995.

libretrodb_tool <db file> find "{'releasemonth':10,'releaseyear':1995}"

  1. Hash matching query Usecase: Search for any game matching a given crc32, in this case Soul Blazer (USA) for the SNES. Also works with serial, md5, and sha1.

libretrodb_tool <db file> find "{'crc':b'31B965DB'}"

  1. Names only search Usecase: Search for all games released on October 1995, wont print checksums, filename or rom size, only the game name.

libretrodb_tool <db file> get-names "{'releasemonth':10,'releaseyear':1995}"

Writing Lua converters

In order to write you own converter you must have a lua file that implements the following functions:

-- this function gets called before the db is created and should validate the
-- arguments and set up the ground for db insertion
function init(...)
	local args = {...}
	local script_name = args[1]
end

-- this is in iterator function. It is called before each insert.
-- the function should return a table for insertion or nil when there are no
-- more records to insert.
function get_value()
	return {
		key = "value", -- will be saved as string
		num = 3, -- will be saved as int
		bin = binary("some string"), -- will be saved as binary
		unum = uint(3), -- will be saved as uint
		some_bool = true, -- will be saved as bool
	}
end