Beispiel #1
0
static Variant dynamic_to_variant(const folly::dynamic& v) {
  switch (v.type()) {
    case folly::dynamic::Type::NULLT:
      return init_null();
    case folly::dynamic::Type::BOOL:
      return v.asBool();
    case folly::dynamic::Type::DOUBLE:
      return v.asDouble();
    case folly::dynamic::Type::INT64:
      return v.asInt();
    case folly::dynamic::Type::STRING:
      return v.data();
    case folly::dynamic::Type::ARRAY:
    case folly::dynamic::Type::OBJECT:
      ArrayInit arr_init(v.size(), ArrayInit::Mixed{});
      for (auto& item : v.items()) {
        arr_init.add(dynamic_to_variant(item.first),
                dynamic_to_variant(item.second));
      }
      Array ret = arr_init.toArray();
      // Sort the array since folly::dynamic has a tendency to iterate from
      // back to front. This way a var_dump of the array, for example, looks
      // ordered.
      ret.sort(Array::SortNaturalAscending, true, false);
      return ret;
  }
  not_reached();
}
Beispiel #2
0
static Variant dynamic_to_variant(const folly::dynamic& v) {
    switch (v.type()) {
    case folly::dynamic::Type::NULLT:
        return init_null_variant;
    case folly::dynamic::Type::BOOL:
        return v.asBool();
    case folly::dynamic::Type::DOUBLE:
        return v.asDouble();
    case folly::dynamic::Type::INT64:
        return v.asInt();
    case folly::dynamic::Type::STRING:
        return v.data();
    case folly::dynamic::Type::ARRAY:
    case folly::dynamic::Type::OBJECT:
        ArrayInit ret(v.size(), ArrayInit::Mixed{});
        for (auto& item : v.items()) {
            ret.add(dynamic_to_variant(item.first),
                    dynamic_to_variant(item.second));
        }
        return ret.toArray();
    }
    not_reached();
}
Beispiel #3
0
Array IniSetting::GetAll(const String& ext_name, bool details) {
    Array r = Array::Create();

    const Extension* ext = nullptr;
    if (!ext_name.empty()) {
        if (ext_name == s_core) {
            ext = IniSetting::CORE;
        } else {
            ext = Extension::GetExtension(ext_name);
            if (!ext) {
                raise_warning("Unable to find extension '%s'",
                              ext_name.toCppString().c_str());
                return r;
            }
        }
    }

    for (auto& iter: boost::join(s_system_ini_callbacks, *s_user_callbacks)) {
        if (ext && ext != iter.second.extension) {
            continue;
        }

        auto value = dynamic_to_variant(iter.second.getCallback());
        // Cast all non-arrays to strings since that is what everything used ot be
        if (!value.isArray()) {
            value = value.toString();
        }
        if (details) {
            Array item = Array::Create();
            item.add(s_global_value, value);
            item.add(s_local_value, value);
            if (iter.second.mode == PHP_INI_ALL) {
                item.add(
                    s_access,
                    Variant(PHP_INI_USER | PHP_INI_SYSTEM | PHP_INI_PERDIR)
                );
            } else if (iter.second.mode == PHP_INI_ONLY) {
                item.add(s_access, Variant(PHP_INI_SYSTEM));
            } else {
                item.add(s_access, Variant(iter.second.mode));
            }
            r.add(String(iter.first), item);
        } else {
            r.add(String(iter.first), value);
        }
    }
    return r;
}
Beispiel #4
0
bool IniSetting::Get(const String& name, Variant& value) {
    folly::dynamic b = nullptr;
    auto ret = Get(name.toCppString(), b);
    value = dynamic_to_variant(b);
    return ret;
}
Beispiel #5
0
bool ini_on_update(const folly::dynamic& value, Array& p) {
    INI_ASSERT_ARR(value);
    p = dynamic_to_variant(value).toArray();
    return true;
}